何时使用 VK_IMAGE_LAYOUT_GENERAL

When to use VK_IMAGE_LAYOUT_GENERAL

我不清楚什么时候使用 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(特别是因为我还没有 运行ning 在 Android 上)所以如果有人有任何适用的经验法则将不胜感激。

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

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

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

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

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

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

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

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

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

PS2: 太糟糕了,没有mip-map创建命令。对于小于一半分辨率的图像,cmdBlit 最有可能在引擎盖下执行它....