首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Vulkan中加载镜像时,如何通过CPU直接写入镜像?

在Vulkan中加载镜像时,如何通过CPU直接写入镜像?
EN

Stack Overflow用户
提问于 2019-01-15 13:08:32
回答 2查看 920关注 0票数 3

在Direct3D12中,您可以使用"ID3D12Resource::WriteToSubresource“为UMA适配器启用零复制优化。

在Vulkan中"ID3D12Resource::WriteToSubresource“的等价物是什么?

EN

回答 2

Stack Overflow用户

发布于 2019-01-15 14:37:52

WriteToSubresource似乎所做的(在Vulkan等价术语中)是将像素数据从CPU内存写入存储在CPU可写内存中的图像(因此需要首先映射它),立即这样做,而不需要命令缓冲区,并且能够在不考虑线性/平铺的情况下这样做。

伏尔坎没有办法做到这一点。您可以直接写入线性图像的后备存储器(在通用布局中),但不能写入平铺图像。为此,您必须使用适当的传输命令,即使在UMA架构上也是如此。这意味着构建命令缓冲区并提交到支持传输的队列,因为Vulkan没有任何类似的即时复制命令。

一种Vulkan的方法本质上是一个函数,它将数据写入到设备内存存储的映射指针中,以适合于您打算存储在特定内存区域中的预初始化布局中的平铺VkImage。这样,您就可以将图像绑定到该内存位置,并且可以将布局转换为您想要的任何内容。

但这将需要添加这样的函数,并允许对平铺图像使用预初始化布局(只要数据是由该函数写入的)。

票数 3
EN

Stack Overflow用户

发布于 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更快,也就是我怀疑他们会称之为“接近零复制”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54192973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档