首先让我说一下我的统一缓冲方式,我在设备本地存储器中有一个缓冲区,在主机相干存储器中有一个缓冲区(用于分段),每个帧在开始之前被分成帧数缓冲区段渲染通过,我更新位于一个的主机,然后将其复制到设备位置,我等到命令缓冲区结束。
(假设我的GPU是一个独立的GPU,CPU和GPU之间没有共享内存)
现在我的问题:
到这里我看到的每个示例代码都使用主机相干统一缓冲区,如果您提供类似这样的示例代码,我将不胜感激。
答案 0 :(得分:2)
我很惊讶你有一个没有HOST_VISIBLE堆的设备,可以找到统一缓冲区。使用CPU写入GPU读取的同一个缓冲区通常是最好的路径,我认为所有现代GPU都支持这一点。
但如果您确实需要主机 - >设备副本,那么您需要确保尽早启动副本,以便在图形管道准备好使用它们之前完成它们,并使用传输 - 只排队做副本。这将使副本与其他早期工作重叠,因此图形管道永远不会闲置等待它。要做到这一点:
VkSemaphore
放入VkSubmitInfo::pSignalSemaphores
。VkSubmitInfo::pWaitSemaphores
列表中较早的信号量将它们提交到图形队列。不幸的是,由于顶点着色器中可能需要一些制服,*pWaitDstStageMask
需要VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
。如果您受GPU限制,希望在图形管道仍然在帧N上工作时发生帧N + 1的传输。您可能需要像GPUView或Radeon Graphics Profiler这样的工具来查看这是否正确发生。