在Direct3D12中,您可以使用"ID3D12Resource::WriteToSubresource“为UMA适配器启用零复制优化。
在Vulkan中"ID3D12Resource::WriteToSubresource“的等价物是什么?
发布于 2019-01-15 14:37:52
WriteToSubresource似乎所做的(在Vulkan等价术语中)是将像素数据从CPU内存写入存储在CPU可写内存中的图像(因此需要首先映射它),立即这样做,而不需要命令缓冲区,并且能够在不考虑线性/平铺的情况下这样做。
伏尔坎没有办法做到这一点。您可以直接写入线性图像的后备存储器(在通用布局中),但不能写入平铺图像。为此,您必须使用适当的传输命令,即使在UMA架构上也是如此。这意味着构建命令缓冲区并提交到支持传输的队列,因为Vulkan没有任何类似的即时复制命令。
一种Vulkan的方法本质上是一个函数,它将数据写入到设备内存存储的映射指针中,以适合于您打算存储在特定内存区域中的预初始化布局中的平铺VkImage。这样,您就可以将图像绑定到该内存位置,并且可以将布局转换为您想要的任何内容。
但这将需要添加这样的函数,并允许对平铺图像使用预初始化布局(只要数据是由该函数写入的)。
发布于 2019-01-15 22:30:30
所以,我从ID3D12Resource::WriteToSubresource文档中读到,它只执行一份拷贝,在顶部撒上marketeze。
Vulkan是一个显式的API,它完全允许您在UMA (或其他任何东西)上执行一次复制。如果你坚持使用线性平铺,它甚至允许你做真正的零拷贝。
UMA可能看起来像这样:https://vulkan.gpuinfo.org/displayreport.php?id=4919#memorytypes,即只有一个堆,内存类型既是DEVICE_LOCAL又是HOST_VISIBLE。
因此,如果您在Vulkan中创建了一个线性平铺图像\缓冲区,vkMapMemory它的内存,然后直接将您的数据生成到映射指针中,那么您就有了一个(真正的)零拷贝。
由于这并不总是实用的(例如,你不能总是选择如何分配东西,例如,如果它是从库函数返回的数据),所以有一个扩展VK_EXT_external_memory_host (当然,假设你的ICD支持它),它允许你直接导入你的主机数据,而不必首先创建一个Vulkan内存映射。
现在,有了优化的平铺图像。最优瓦片在Vulkan中是不透明的(到目前为止),并且依赖于实现,所以如果没有一些反向工程,您甚至不知道寻址方案。一般来说,您希望使用优化的平铺图像,因为访问它们应该具有更好的性能特征(至少在常见情况下是这样)。
这就是单一副本的用武之地。您可以将您的线性平铺图像(或缓冲区),并将其vkCmdCopy*到您的最佳平铺图像。这种复制是由Device\GPU执行的,它的所有功能都很出色,可能比CPU更快,也就是我怀疑他们会称之为“接近零复制”。
https://stackoverflow.com/questions/54192973
复制相似问题