我正在关注这个 vulkan 教程:https ://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation 我目前在 subpass 依赖小节。作者在其中说,因为图像布局转换可能在我们从交换链获取图像之前发生,所以我们需要使用 VkSubpassDependency 如下,以便渲染通道将在片段着色器输出阶段等待。
VkSubpassDependency dependency = {};
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)
不过作者之前也有这个代码
vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphore, VK_NULL_HANDLE, &imageIndex);
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
VkSemaphore waitSemaphores[] = { imageAvailableSemaphore };
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffers[imageIndex];
VkSemaphore signalSemaphores[] = { renderFinishedSemaphore };
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {
throw std::runtime_error("failed to submit command buffer");
}
Run Code Online (Sandbox Code Playgroud)
这段代码的作用是片段着色器阶段不会启动,直到我们能够从交换链中实际获取图像(imageAvailableSemaphore 确保这一点)。对我来说,这两段代码在做同样的事情,即确保片段着色器阶段在我们能够获取图像之前不会启动。这是为什么?
PS:我也很难理解 stagemask 和 access mask。
所述subpass依赖性说,从过渡initialLayout到第一布局之间发生srcStageMask和dstStageMask相应的同步范围的。
信号量等待pWaitDstStageMask表示信号量将在不迟于阶段等待(并且信号量等待的性质会阻止任何后续执行,直到等待完成。
您不能跳过信号量,因为vkAcquireNextImageKHR它不是队列操作,并且信号量(或栅栏)是知道演示引擎不再需要图像的唯一方法。
并且您不能跳过 subpass 依赖项,因为跳过它相当于提供srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT. 这意味着布局转换(可以是写访问)可以在任何时候执行。如果您的pWaitDstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,则意味着演示引擎可能仍在读取图像,而您的工作已经尝试更改图像布局。
您可以使用pWaitDstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT(resp. VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) 没有障碍\依赖性。但这意味着“首先等待信号量”,然后阻塞一切。包括甚至不需要交换链图像的部分(如顶点处理)。这在某些平台上可能不是最理想的,而且没有理由这样做。
我应该补充一点,同步命令并没有真正经过流水线阶段。它们只定义了它们的同步作用域之间的依赖关系。在 Semaphore 等待和 Subpass 依赖之间发生的是一个执行依赖链。信号量定义了 PE 和COLOR阶段之间的依赖关系。Subpass Dependency 定义了COLOR舞台和布局转换之间的依赖关系。如此选择的阶段确实在这两个同步原语之间形成了一个执行依赖链。并且这样的链形成了传递属性;即它充当 PE 和布局转换之间的单一依赖项。
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |