Graphics 在调用vkQueueSubmit之前,将颜色附件从最终布局转换到另一个布局

Graphics 在调用vkQueueSubmit之前,将颜色附件从最终布局转换到另一个布局,graphics,vulkan,Graphics,Vulkan,假设我有一个带有单色附件的渲染过程(对应于交换链图像),其VkAttachmentDescription具有initialLayout=finalLayout=VK\u image\u LAYOUT\u color\u attachment\u OPTIMAL和(出于教育目的)我想在最后一个绘图命令之后,在调用vkQueueSubimt之前,使用vkCmdPipelineBarrier将布局转换为VK\u IMAGE\u layout\u PRESENT\u SRC\u KHR 我到底需要怎么做

假设我有一个带有单色附件的渲染过程(对应于交换链图像),其
VkAttachmentDescription
具有
initialLayout=finalLayout=VK\u image\u LAYOUT\u color\u attachment\u OPTIMAL
和(出于教育目的)我想在最后一个绘图命令之后,在调用
vkQueueSubimt
之前,使用
vkCmdPipelineBarrier
将布局转换为
VK\u IMAGE\u layout\u PRESENT\u SRC\u KHR

我到底需要怎么做?我想,在调用
vkCmdPipelineBarrier
之前,我需要调用
vkcmendrenderpass
,因为渲染过程将自动转换到
finalLayout
,对吗

现在,我需要如何为调用
vkCmdEndRenderPass
设置
srcstagemak
srccessmask
dstAccessMask

这对我来说仍然很难理解(是否有一个很好的参考文献可以解释“常见”的转换?)。从API的文档中,应该选择正确的值

srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;

srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
但是,我在调用
vkQueueSubmit
时收到以下验证错误:

提交的命令缓冲区需要VkImage 0xD7624900000000C[] (子资源:aspectMask 0x1数组层0,mip级别0)将处于 布局VK_图像_布局_呈现_SRC_KHR——相反,当前布局是 VK_图像_布局_未定义

出什么事了?

在调用
vkQueueSubimt
之前,使用
vkCmdPipelineBarrier

vkCmd*
函数不会立即执行操作。它们命令记录到缓冲区。然后使用
vkQueueSubmit
将缓冲区推送到GPU队列,以便它在有时间时在其中执行工作


您还必须使用
VkImageMemoryBarrier
,在其中指定图像及其布局。

如果不知道要将其转换到什么布局以及图像向前移动时打算做什么,则无法回答此问题。@Nicolas请注意我的编辑。“出了什么问题?”我不明白这个问题。错误告诉了你什么是“出错”。图像的布局与您所说的不同。这就是问题所在。修复代码,使预期布局为正确布局。在问了半打问题之后,您仍然没有解释为什么在渲染过程开始时保留显示图像的内容如此重要。@Nicolas我已经用
srccessmask
dstAccessMask
对该图像执行了
vkCmdPipelineBarrier
,问题中给出的
srcstagemak
dststagemak
。所以,我不明白为什么布局现在是“未定义的”。我们不能远程调试您的代码,特别是因为我们看不到它。我不知道在障碍呼叫之前图像是什么布局。但图层确实如此。因此,您必须对代码进行调试,并找出布局与您认为的不同的原因。请注意,布局不受源/目标访问/阶段掩码的影响,因此告诉我们这些掩码是什么是无用的。