【发布时间】:2018-10-26 07:03:00
【问题描述】:
所以我有一个渲染通道,它带有一个直接绘制到帧缓冲区的子通道。规范并没有强制我使用依赖项——如果我省略它们,实现会隐式插入它们(尽管我不明白为什么它使用srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 作为第一个子通道——这个阶段意味着一开始,即不要等什么)。
但是像往常一样使用 Vulkan - 最好是明确的。这就是混乱 - 多个来源以不同的方式使用子通道。
Sdk 的多维数据集示例根本不使用它们。
-
Vulkan-tutorial 只用了一个:
dependency.srcSubpass = VK_SUBPASS_EXTERNAL; dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency.srcAccessMask = 0; dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;为什么
srcAccessMask在这里为零? -
没有秘密的 API 使用两个:
dependency.srcSubpass = VK_SUBPASS_EXTERNAL; dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;和
dependency.srcSubpass = 0; dependency.dstSubpass = VK_SUBPASS_EXTERNAL; dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;不清楚为什么
srcStageMaskisVK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT在第一个子通道中 - 不是 这个阶段应该用于执行依赖,但这里我们 需要内存依赖?关于为什么dstStageMask的相同问题VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT在第二个子通道中吗? -
Khronos 同步示例使用一个:
dependency.srcSubpass = VK_SUBPASS_EXTERNAL; dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency.srcAccessMask = 0; dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;为什么
srcAccessMask是 0? -
这是我对两个依赖项的尝试:
dependency.srcSubpass = VK_SUBPASS_EXTERNAL; dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; // need to wait until presentation is finished reading the image dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; // we are writing to the image in this stage dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; and dependency.srcSubpass = 0; dependency.dstSubpass = VK_SUBPASS_EXTERNAL; dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; // we are writing to the image in this stage dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; // presentation reads image in this stage (is it?) dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
所有这些都非常令人困惑。正如你所看到的,多个有能力的来源有不同的看法。使用哪一个?如何理解这些依赖关系?
【问题讨论】:
标签: vulkan