2016-05-30 59 views
4

一个可呈现的图像从VK_IMAGE_LAYOUT_UNDEFINED开始,但在呈现一次之后将会是VK_IMAGE_LAYOUT_PRESENT_SRC_KHR如何处理可呈现图像的布局?

许多示例在创建vkSwapchain后立即完成所有vkImagesVK_IMAGE_LAYOUT_PRESENT_SRC_KHR的转换。这允许他们使用VK_IMAGE_LAYOUT_PRESENT_SRC_KHR代替oldLayout。它是由vkQueuePresentKHR呈现之前的图像是由vkAcquireNextImageKHR返回后But doing the transition right after creation of the swapchain is not allowed.

使用一个像样的图像必须只发生,和。 这包括转换图像布局和渲染命令。

我的选项正确处理交换链图像布局?

回答

4

有3个选项。下令从最好到最差(IMO):

  1. 只需从每次VK_IMAGE_LAYOUT_UNDEFINED设置在renderPass附件的initialLayout到VK_IMAGE_LAYOUT_UNDEFINED或过渡。 This is allowed,这意味着你不关心图像中的数据。无论如何,您通常会清除或完全覆盖图像。

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

    • oldLayout必须VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED或受阻挡的图像区域的当前布局
  2. 跟踪哪些图像已经通过管道,录制commandBuffer时相应地选择oldLayout

  3. 在创建交换链之后执行转换,但使用vkAcquireNextImageKHRvkQueuePresentKHR确保应用程序在转换时拥有图像。无法保证以何种顺序获取图像因此,可能有一个图像永远不会返回。

+0

现在阅读这些图片没有什么理由(也是危险的),所以1. 95%的情况下。 – krOoze

+0

2.似乎是合理的(无论如何,你需要跟踪他们的阅读目的) - 我只会改变它“提交时”而不是“录制” – krOoze

+0

3.是疯狂的,无法保证完成。也漏空框架。 ;建议4.对于minImages <2,可以在出席之前全部获得。我更喜欢2. – krOoze

1

我一直在尝试第四种选择,但其有效性的一些输入将是有用的。创建交换链时,图像位于VK_IMAGE_LAYOUT_UNDEFINED,这对我来说似乎表明它们都可用于应用程序,因为它们需要VK_IMAGE_LAYOUT_PRESENT_SRC_KHR用于演示,因此不应显示或排队。但是我没有发现任何可以保证这一点的规格。

细则中指出,我们可以获取从swapchain多个图像,如果我们想:

如果swapchain有足够的像样的图像,应用程序可以获取多个图像而没有介入vkQueuePresentKHR。应用程序可以以与获取它们的顺序不同的顺序呈现图像。

使用上面的结论,我只是调用vkAcquireNextImageKHR来获得交换链的每个图像,并一次性更改所有图像的布局。之后,我介绍了所有这些,让他们进入系统可以这么说。

这似乎工作的意义,所有的图像都交给我交换链,但是,然后再次,我发现并不能保证所有这些实际上可以在创建交换链后立即获得。

+0

tl; dr:数字3的一个变体,您尝试在转换它们之前获取所有图像但wi类似的问题在于,您无法确定您是否可以首先获取所有图像。我会在我的答案的选项2和3之间进行排名。 –

+0

非常多,虽然如果现在所有图像都可以使用,那么这些问题就变得没有意义了。这就是为什么需要在该特定点上输入一些信息的原因。 –

+0

是的,没有保证(除了minImages == 1)。恕我直言,如果他们在创建后可用,您将在创建后获得预先获得的预设。但是,这是质疑Vulkan的设计......你不能保证让他们 - 这是目前的情况。 – krOoze