所以我有一个渲染通道,它带有一个直接绘制到帧缓冲区的子通道。规范并没有强迫我使用依赖项——如果我省略它们,实现会隐式插入它们(虽然我不明白为什么它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;
Run Code Online (Sandbox Code Playgroud)
为什么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;
Run Code Online (Sandbox Code Playgroud)
和
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;
Run Code Online (Sandbox Code Playgroud)
这不是很清楚,为什么srcStageMask
是
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
第一subpass -是不是这个阶段应该用于执行依赖性的,但在这里,我们需要存储的依赖?为什么同样的问题dstStageMask
是VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
在第二subpass?
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;
Run Code Online (Sandbox Code Playgroud)
为什么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;
Run Code Online (Sandbox Code Playgroud)这一切都非常令人困惑。如您所见,多个主管来源有不同的愿景。使用哪一种?如何理解这些依赖?
哦,亲爱的,这是一个大多数人不太了解的话题。许多错误信息被假设和传播。规范示例的正确位置是github repo 中的维基页面。
可以在此处找到有关交换链图像获取/呈现的相关部分。
这是在许多同步细节被正确确定之前的一个老例子。
目的是同步信号量使用以等待 vkAcquireNextImage 的结果与渲染。这是读后写的危害,信号量将包括内存可见性同步。所以 srcAccessMask 是没有必要的。
同样,屏障旨在与信号量同步。将命令缓冲区提交到队列时,您可以设置哪些阶段等待哪些信号量。在这种情况下,他们使用管道阶段的底部而不是VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
与 2 相同的答案,唯一的区别是 dstAccessMask
我上面链接的维基页面使用以下内容:
/* Only need a dependency coming in to ensure that the first
layout transition happens at the right time.
Second external dependency is implied by having a different
finalLayout and subpass layout. */
VkSubpassDependency dependency = {
.srcSubpass = VK_SUBPASS_EXTERNAL,
.dstSubpass = 0,
// .srcStageMask needs to be a part of pWaitDstStageMask in the WSI semaphore.
.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
.srcAccessMask = 0,
.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
.dependencyFlags = 0};
/* Normally, we would need an external dependency at the end as well since we are changing layout in finalLayout,
but since we are signalling a semaphore, we can rely on Vulkan's default behavior,
which injects an external dependency here with
dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
dstAccessMask = 0. */
Run Code Online (Sandbox Code Playgroud)
您混淆了第二个障碍的子通道索引。虽然正如评论中提到的,在渲染过程结束时已经有一个隐式障碍,它反过来与您用来同步当前的信号量或栅栏同步。所以不需要显式依赖。
归档时间: |
|
查看次数: |
1754 次 |
最近记录: |