我现在的做法是,据我所知,每个新图像都必须使用 LAYOUT_UNDEFINED 创建。然后我放置一个障碍将其转换为 TRANSFER_DST_OPTIMAL。现在我可以传输图像了。除非您想使用 LINEAR TILING,否则这至少是您要做的。
现在我需要将数据传输到缓冲区。在我的例子中,主机可见内存不是设备本地的,因此我将图像数据写入暂存缓冲区,然后发出缓冲区以进行图像复制并从 DST_SRC 转换为 READ_OPTIMAL。如果主机可见内存不是设备本地的,这是最有效的方法。
现在考虑主机可见内存也是设备本地的。我觉得我应该能够立即写入 GPU 设备本地缓冲区,但我不知道如何或甚至不知道是否可行,因为我认为您总是需要一个缓冲区来复制图像。对吗?
只要您使用最佳平铺,图像数据就需要通过 Vulkan 控制的过程发送,然后 GPU 才能使用该数据。这是通过复制操作完成的。因此,即使您将原始数据加载到设备本地内存,您仍然需要通过常规操作将该数据复制到实际图像中。
对于最佳平铺图像而言,暂存并非可选项。即使暂存缓冲区位于设备本地内存中。