vulkan - 在 Vulkan 中加载图像时,如何通过 CPU 直接写入图像?

标签 vulkan direct3d12

在 Direct3D12 中,您可以使用“ID3D12Resource::WriteToSubresource”为 UMA 适配器启用零拷贝优化。

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

最佳答案

WriteToSubresource 似乎(用 Vulkan 等效术语)将像素数据从 CPU 内存写入存储在 CPU 可写内存中的图像(因此要求它首先被映射) ,无需命令缓冲区即可立即执行此操作,并且无论线性/平铺如何都能够执行此操作。

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

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

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

关于vulkan - 在 Vulkan 中加载图像时,如何通过 CPU 直接写入图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54192973/

相关文章:

3d - Vulkan 渲染 channel 在多线程渲染中是本地线程吗

c++ - GetCPUDescriptorHandleForHeapStart 堆栈损坏

c++ - 使用 MSAA 创建交换链失败

synchronization - 如何在 DirectX/Direct3D 12 中使用围栏同步 CPU 和 GPU?

glsl - 计算着色器中 [[vk::binding(0, 0)]] RWStructuredBuffer<int> 的 GLSL 等价物是什么

graphics - 为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?

c++ - 在 D3D12 上获取显示器的刷新率

c++ - 如何确保正确销毁 vk::UniqueBuffer 和 vk::UniqueDeviceMemory

multithreading - Vulkan中的多线程渲染(生成命令缓冲区)比单线程慢