如何处理可呈现图像的布局?

时间:2016-05-30 11:01:22

标签: framebuffer vulkan

可呈现的图片从VK_IMAGE_LAYOUT_UNDEFINED开始,但在呈现一次后将为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

很多示例在创建vkImages后立即将所有VK_IMAGE_LAYOUT_PRESENT_SRC_KHR转换为vkSwapchain。这允许他们使用VK_IMAGE_LAYOUT_PRESENT_SRC_KHR作为oldLayoutBut doing the transition right after creation of the swapchain is not allowed.

  

只有在vkAcquireNextImageKHR返回图像之后,vkQueuePresentKHR呈现图像之前,才能使用可呈现图像。 这包括转换图像布局和渲染命令。

我有什么选择正确处理交换链图像布局?

2 个答案:

答案 0 :(得分:4)

有3种选择。从最好到最差(IMO)订购:

  1. 只需将renderPass中附件的initialLayout设置为VK_IMAGE_LAYOUT_UNDEFINED或每次都从VK_IMAGE_LAYOUT_UNDEFINED过渡。 This is allowed并且暗示您不关心图像中仍然存在的数据。大多数情况下,无论如何,你都会清除或完全覆盖图像。

      

    有效用法 [VkImageMemoryBarrier] [   [...]

         
        
    • oldLayout必须为VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED或受屏障影响的图像区域的当前布局
    •   
  2. 跟踪已经通过管道的图像,并在录制commandBuffer时相应地选择oldLayout

  3. 创建交换链后进行转换,但使用vkAcquireNextImageKHRvkQueuePresentKHR确保应用程序在转换时拥有图像。无法保证您获得图像的顺序因此可能无法返回一张图像。

答案 1 :(得分:1)

我一直在尝试第四种选择,但对其有效性的一些输入会很有用。在创建交换链时,图像位于VK_IMAGE_LAYOUT_UNDEFINED,这对我来说似乎表明他们可以全部用于应用程序,因为他们需要VK_IMAGE_LAYOUT_PRESENT_SRC_KHR进行演示,所以不应该显示或在队列中。我没有在规范中找到任何可以保证这一点的内容。

规范说我们可以根据需要从交换链中获取多个图像:

  

如果交换链具有足够的可呈现图像,则应用程序可以获取多个图像而无需干预vkQueuePresentKHR。应用程序可以按照与获取图像不同的顺序显示图像。

使用上面的结论我刚调用vkAcquireNextImageKHR来获取交换链的每个图像,并立即更改所有这些图像的布局。之后,我提出了所有这些内容,以便让他们进入系统。

似乎工作的意思是所有图像都是由交换链传递给我的,但是再一次,我发现并不能保证在创建交换链之后可以立即获取所有图像。