【发布时间】:2021-08-29 07:30:19
【问题描述】:
当从渲染通道提交vkCmdPipelineBarrier 时,可以为srcStageMask/dstStageMask 设置哪些阶段,因为在这种情况下没有子通道绑定点到图形管道?
在 subpass 中提交 vkCmdPipelineBarrier 时同样的问题,该子通道具有与计算管道的绑定点,我猜该计算管道没有像 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 这样的阶段,可能还有更多。
谢谢
编辑
首先,感谢@Nicol Bolas 的评论,计算着色器无法在子通道中间调度。
我想澄清一下我的问题:
假设我有一个图像,在渲染通道之后将具有 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL 的布局。
渲染通道之后,我想用新数据更新图像并希望将其布局更改为 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL。
因此,在记录 vkCmdEndRenderPass 之后,我记录了一个 vkCmdPipelineBarrier 命令,如下所示:
const VkImageMemoryBarrier imageMemoryBarrier =
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
nullptr,
VK_ACCESS_SHADER_READ_BIT, // srcAccessMask
VK_ACCESS_TRANSFER_WRITE_BIT, // dstAccessMask
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // oldLayout
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout
VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED,
image,
{ // subresourceRange
VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
0, // baseMipLevel
VK_REMAINING_MIP_LEVELS, // levelCount
0, // baseArrayLayer
VK_REMAINING_ARRAY_LAYERS // layerCount
}
};
vkCmdPipelineBarrier(currentCommandBuffer,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
0,
0, nullptr,
0, nullptr,
1, &imageMemoryBarrier);
这确保了只要 renderpass 中的前一个命令仍未穿过片段着色器阶段,过渡就会等待。
但是如果 vulkan 在 renderpass 执行完成后执行 vkCmdPipelineBarrier 怎么办?现在没有绑定管道,没有阶段 - 这是否意味着屏障将进入无休止的等待,直到新的渲染通道开始并且片段着色器阶段将发生?
【问题讨论】:
-
您不能在子通道中间分派计算着色器。所以这个问题没有实际意义。此外,使用哪些阶段取决于您正在执行的同步类型。写入和消费操作是什么。
-
谢谢@NicolBolas,我编辑并澄清了这个问题。我想念一些东西。