在Direct3D12中,您可以使用“ ID3D12Resource :: WriteToSubresource”为UMA适配器启用零复制优化。
Vulkan中的“ ID3D12Resource :: WriteToSubresource”等效什么?
答案 0 :(得分:2)
WriteToSubresource
似乎要做的(用Vulkan等效的术语)是将像素数据从CPU内存写入存储在CPU可写内存中的图像(因此要求先将其映射)因此无需使用命令缓冲区就可以立即进行操作,并且无论线性/平铺如何都可以做到这一点。
Vulkan没有办法做到这一点。您可以将线性图像(在常规布局中)直接写入后备存储器,但不能将它们写入平铺图像。为此,即使在UMA体系结构上,也必须使用正确的传输命令。这意味着要建立命令缓冲区并提交到具有传输能力的队列中,因为Vulkan没有这样的立即复制命令。
执行此操作的Vulkan方法本质上是将数据写入映射到设备存储器存储的映射指针的函数,该函数适用于要存储在特定区域中的预初始化布局中的平铺VkImage
的记忆。这样,您便可以将图像绑定到该内存位置,并且可以将布局转换为所需的任何内容。
但这将需要添加这样的功能,并允许将预初始化的布局用于平铺图像(只要数据是通过此功能写入的)。
答案 1 :(得分:0)
因此,我从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快,即我怀疑它们将其称为“接近零复制”。