Vulkan中统一缓冲区的最佳实践

时间:2018-05-28 17:58:11

标签: synchronization vulkan

首先让我说一下我的统一缓冲方式,我在设备本地存储器中有一个缓冲区,在主机相干存储器中有一个缓冲区(用于分段),每个帧在开始之前被分成帧数缓冲区段渲染通过,我更新位于一个的主机,然后将其复制到设备位置,我等到命令缓冲区结束。

(假设我的GPU是一个独立的GPU,CPU和GPU之间没有共享内存)

现在我的问题:

  • 这是管理统一缓冲区的最佳方式吗?在每个帧中进行分段和复制?
  • 的确,我知道我使用的同步机制,不行,这样做的最佳方法是什么?
  • 如果你的答案是做屏障同步,那么这样做的确切方法是什么? (因为我没见过这样的样本。)

到这里我看到的每个示例代码都使用主机相干统一缓冲区,如果您提供类似这样的示例代码,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

我很惊讶你有一个没有HOST_VISIBLE堆的设备,可以找到统一缓冲区。使用CPU写入GPU读取的同一个缓冲区通常是最好的路径,我认为所有现代GPU都支持这一点。

但如果您确实需要主机 - >设备副本,那么您需要确保尽早启动副本,以便在图形管道准备好使用它们之前完成它们,并使用传输 - 只排队做副本。这将使副本与其他早期工作重叠,因此图形管道永远不会闲置等待它。要做到这一点:

  1. 将帧的制服写入主机缓冲区。
  2. 使用host->设备复制命令将命令缓冲区提交到传输队列,并将VkSemaphore放入VkSubmitInfo::pSignalSemaphores
  3. 完成帧渲染命令缓冲区的所有剩余工作,并使用VkSubmitInfo::pWaitSemaphores列表中较早的信号量将它们提交到图形队列。不幸的是,由于顶点着色器中可能需要一些制服,*pWaitDstStageMask需要VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
  4. 如果您受GPU限制,希望在图形管道仍然在帧N上工作时发生帧N + 1的传输。您可能需要像GPUView或Radeon Graphics Profiler这样的工具来查看这是否正确发生。