对我来说,使用VK_IMAGE_LAYOUT_GENERAL是一个好主意,而不是转换到我即将执行的任何操作的最佳布局,这一点并不清楚。目前,我的政策是始终过渡到最佳布局。
但VK_IMAGE_LAYOUT_GENERAL存在。当我只在短时间内使用给定的布局时,也许我应该使用它。
例如,现在,我正在编写代码以使用vkCmdBlitImage生成mipmap。当我遍历执行vkCmdBlitImage命令的子资源时,我应该在我缩小为mip时转换到VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,然后转换到VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,当我在最后转换到VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL之前,我将成为下一个mip的源#39;我做完了吗?这似乎是很多过渡,也许在VK_IMAGE_LAYOUT_GENERAL中生成mips更好。
我很欣赏答案可能是衡量,但很难衡量我所有的目标GPU(特别是因为我还没有在Android上运行任何东西)所以如果有人有任何体面的规则拇指申请它将非常感激。
FWIW,我正在编写将在桌面GPU和Android上运行的Vulkan代码,但我主要关注后者的性能。
答案 0 :(得分:5)
您可以在以下时间使用它:
(5。相对于图像所做的工作,你会过多地切换布局(并且你甚至不需要障碍)的其他情况。在这种情况下确认GENERAL所需的测量更好。即便如此,过早优化。 )
PS:您可以事先通过一个命令将所有mip-map一起转换为TRANSFER_DST,然后只转换到SRC所需的那个。有了一个像样的硬盘驱动器,如果它是一个选项(甚至可能使用一些复杂的算法甚至具有更好的质量),它应该是最好已经存储了mip-maps。
PS2:太糟糕了,没有mip-map创建命令。对于小于半分辨率的图像,cmdBlit最有可能在引擎盖下进行....
答案 1 :(得分:2)
如果您从mipmap [n]图像中读取以创建mipmap [n + 1]图像,那么您应该使用传输图像标志,如果您希望您的代码在所有Vulkan实现上运行并在所有实现中获得最佳性能, GPU可以使用这些标志来优化图像的读取或写入。
因此,如果您想要跨供应商,只需使用VK_IMAGE_LAYOUT_GENERAL设置使用最终图像的描述符,而不是图像读取或写入。
如果您不想使用那么多过渡,您可以从缓冲区而不是图像进行复制,尽管您显然无法获得vkCmdBlitImage为您免费进行的格式转换,缩放和过滤
另外,请不要忘记检查目标格式是否实际支持BLIT_SRC或BLIT_DST位。这与您是否使用传输或一般布局进行复制无关。