首页 > 解决方案 > 在 Vulkan 中,我应该如何知道是否需要使用缓冲区使用标志 TRANSFER_SOURCE?

问题描述

我正在处理一些鸡和蛋的问题。我创建了一个缓冲区,如果该缓冲区将被分配给设备本地内存,那么我可以用于该缓冲区的内存类型可能不是主机可见的,因此我需要设置 VK_BUFFER_USAGE_TRANSFER_DST_BIT 标志缓冲区,并使用主机可见的暂存缓冲区。问题是这样的:

auto bufferUsageBits = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT /* | VK_BUFFER_USAGE_TRANSFER_DST_BIT*/;
// The second flag should be set only if the memory requirements queries later
// tell me there's no device-local AND host-visible memory types
VkBuffer vkBufferHandle;
VK::createBuffer(size, bufferUsageBits, VK_SHARING_MODE_EXCLUSIVE, &vkBufferHandle);

vkGetBufferMemoryRequirements();
// Only know do I now if I need a staging buffer and the buffer I'm creating needs to be transfered to.

据我所知,我可以做两件事:

  1. 如果设备是集成的或 CPU 类型,则假定缓冲区不需要设置传输标志。
  2. 无论如何设置标志,无论它是集成/CPU还是离散的。

我该怎么处理这个?

标签: vulkan

解决方案


如果您创建 aVkBuffer并且它的内存要求需要允许成为传输操作的目标,那么...创建一个新VkBuffer的并设置了目标传输使用位(并删除旧的)。

这只是一个VkBuffer. 在绑定到内存之前,它实际上并没有做任何事情。实际上,在实际应用程序中创建多个推测缓冲区以确定您打算在哪里安排缓冲内存使用是一个好主意。


推荐阅读