何时使用 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 位。这与您使用的是传输版式还是通用版式无关。
您会在以下情况下使用它:
- 你很懒
- 您需要将内存映射到主机(除非您可以使用 PREINITIALIZED)
- 当您将图像用作多个不兼容的附件而您别无选择时
- 商店图片
( 5. 其他情况下,相对于在图像上完成的工作,您会过多地切换布局(并且您甚至不需要障碍)。在这种情况下,需要进行测量以确认 GENERAL 更好。很可能是即使那样,过早的优化也是如此。
)
PS:您可以预先通过一个命令将所有 mip-maps 一起转换为 TRANSFER_DST,然后仅将您需要的 mip-maps 转换为 SRC。使用像样的 HDD,最好已经将它们与 mip-maps 一起存储,如果这是一个选项(并且使用一些复杂的算法甚至可能具有更好的质量)。
PS2: 太糟糕了,没有mip-map创建命令。对于小于一半分辨率的图像,cmdBlit 最有可能在引擎盖下执行它....
我不清楚什么时候使用 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 位。这与您使用的是传输版式还是通用版式无关。
您会在以下情况下使用它:
- 你很懒
- 您需要将内存映射到主机(除非您可以使用 PREINITIALIZED)
- 当您将图像用作多个不兼容的附件而您别无选择时
- 商店图片
( 5. 其他情况下,相对于在图像上完成的工作,您会过多地切换布局(并且您甚至不需要障碍)。在这种情况下,需要进行测量以确认 GENERAL 更好。很可能是即使那样,过早的优化也是如此。 )
PS:您可以预先通过一个命令将所有 mip-maps 一起转换为 TRANSFER_DST,然后仅将您需要的 mip-maps 转换为 SRC。使用像样的 HDD,最好已经将它们与 mip-maps 一起存储,如果这是一个选项(并且使用一些复杂的算法甚至可能具有更好的质量)。
PS2: 太糟糕了,没有mip-map创建命令。对于小于一半分辨率的图像,cmdBlit 最有可能在引擎盖下执行它....