我正在开发一个带有两个命令队列的游戏。一个用于计算着色器计算繁重的工作,大约需要 40ms,一个用于渲染,需要不到 16ms。
我需要使用计算结果来修改渲染内容,但是计算比渲染慢得多,如果计算结果没有准备好,我使用条件渲染来跳过修改。
typedef struct VkConditionalRenderingBeginInfoEXT {
VkStructureType sType;
const void* pNext;
VkBuffer buffer;
VkDeviceSize offset;
VkConditionalRenderingFlagsEXT flags;
} VkConditionalRenderingBeginInfoEXT;
计算完成后,我在
计算队列上写入
buffer
,然后在渲染队列上调用
vkCmdBeginConditionalRenderingEXT
。
现在的问题是,我无法为
buffer
设置适当的内存屏障,因为它是跨队列访问的,所以我的问题是如何设置内存屏障以确保计算队列上的缓冲区写入在渲染队列之前完成读一下。
为什么不能使用适当的内存屏障?
使用
VK_SHARING_MODE_CONCURRENT
创建的缓冲区允许并发跨队列资源使用。这意味着您绕过了队列所有权和传输要求,但您仍然需要确保数据对适当管道阶段的可见性/可用性。
运行计算工作后,让计算队列发出屏障以确保可用性...
srcStage=VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
srcAccessMask=VK_ACCESS_SHADER_WRITE_BIT
dstStage=VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
dstAccessMask=VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT
...并且可以肯定的是,我可能会在
vkCmdBeginConditionalRenderingEXT()
命令之前在图形队列上发出相同类型的屏障,以确保可见性。