8

我不清楚何时使用 VK_IMAGE_LAYOUT_GENERAL 而不是为我将要执行的任何操作转换到最佳布局是一个好主意。目前,我的政策是始终过渡到最佳布局。

但是 VK_IMAGE_LAYOUT_GENERAL 存在。当我只打算在短时间内使用给定的布局时,也许我应该使用它。

例如,现在,我正在编写代码以使用 vkCmdBlitImage 生成 mipmap。当我遍历执行 vkCmdBlitImage 命令的子资源时,我是否应该在缩小到 mip 时转换到 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,然后在我将成为下一个 mip 的源时转换到 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,然后当我最终转换到 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL全部完成?看起来有很多过渡,也许在 VK_IMAGE_LAYOUT_GENERAL 中生成 mips 会更好。

我很欣赏答案可能是测量,但很难在我所有的目标 GPU 上进行测量(特别是因为我还没有在 Android 上运行任何东西)所以如果有人有任何体面的经验法则可以应用,将不胜感激。

FWIW,我正在编写将在桌面 GPU 和 Android 上运行的 Vulkan 代码,但我主要关心后者的性能。

4

2 回答 2

9

您将在以下情况下使用它:

  1. 你很懒
  2. 您需要将内存映射到主机(除非您可以使用 PREINITIALIZED)
  3. 当您将图像用作多个不兼容的附件并且您别无选择时
  4. 对于商店图片

( 5. 相对于图像上完成的工作,您会过多地切换布局(甚至不需要障碍)的其他情况。在这种情况下,确认 GENERAL 所需的测量更好。即使在那时也很可能是过早的优化。 )

PS:您可以预先通过一个命令将所有 mip-map 一起转换为 TRANSFER_DST,然后只将您需要的一个命令转换为 SRC。使用像样的 HDD,最好已经将它们与 mip-map 一起存储,如果这是一个选项(甚至使用一些复杂的算法甚至可能具有更好的质量)。

PS2:太糟糕了,没有 mip-map 创建命令。对于小于一半分辨率的图像,cmdBlit 最有可能在后台执行此操作....

于 2016-05-04T16:48:56.547 回答
2

如果您从 mipmap[n] 图像中读取以创建 mipmap[n+1] 图像,那么如果您希望代码在所有 Vulkan 实现上运行并在所有实现中获得最佳性能,则应该使用传输图像标志,因为标志可能GPU 使用它来优化图像的读取或写入。

因此,如果您想跨供应商仅使用 VK_IMAGE_LAYOUT_GENERAL 来设置使用最终图像而不是图像读取或写入的描述符。

如果您不想使用那么多转换,您可以从缓冲区而不是图像复制,尽管您显然不会免费获得 vkCmdBlitImage 为您所做的格式转换、缩放和过滤。

另外不要忘记检查目标格式是否真的支持 BLIT_SRC 或 BLIT_DST 位。这与您是使用复制版面还是通用版面无关。

于 2016-05-04T16:45:51.737 回答