如果使用vulkan同时进行渲染和计算,通常会设置多次屏障(Barrier),每次屏障都有其特定的目的,以确保计算操作和队列传递之间的正确同步和数据完整性。下面举例说明:
第一次屏障:获取资源所有权(Acquire Barrier)
if (graphics.queueFamilyIndex != compute.queueFamilyIndex)
{
VkBufferMemoryBarrier buffer_barrier =
{
VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
nullptr,
0,
VK_ACCESS_SHADER_WRITE_BIT,
graphics.queueFamilyIndex,
compute.queueFamilyIndex,
storageBuffer.buffer,
0,
storageBuffer.size
};
vkCmdPipelineBarrier(
compute.commandBuffer,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
0,
0, nullptr