ID3D12Resource::WriteToSubresource 方法 (d3d12.h)
使用 CPU 将数据复制到子资源中,使 CPU 能够修改具有未定义布局的大多数纹理的内容。
语法
HRESULT WriteToSubresource(
UINT DstSubresource,
[in, optional] const D3D12_BOX *pDstBox,
[in] const void *pSrcData,
UINT SrcRowPitch,
UINT SrcDepthPitch
);
参数
DstSubresource
类型: UINT
指定子资源的索引。
[in, optional] pDstBox
类型: const D3D12_BOX*
指向框的指针,该框定义要将资源数据复制到其中的目标子资源部分。 如果为 NULL,则数据将写入目标子资源,且没有偏移量。 源的维度必须符合目标, (可以看到 D3D12_BOX) 。
空框导致无操作。 如果顶部值大于或等于底部值,或者左值大于或等于右值,或者前值大于或等于后的值,则框为空。 当框为空时,此方法不执行任何操作。
[in] pSrcData
类型: const void*
指向内存中源数据的指针。
SrcRowPitch
类型: UINT
从一行源数据到下一行的距离。
SrcDepthPitch
类型: UINT
从源数据一个深度切片到下一个深度切片的距离。
返回值
类型: HRESULT
此方法返回 Direct3D 12 返回代码之一。
注解
应首先使用 Map 映射资源。 纹理必须处于 D3D12_RESOURCE_STATE_COMMON 状态,才能通过 WriteToSubresource 和 ReadFromSubresource 进行 CPU 访问,才能合法;但缓冲区不这样做。
为提高效率,请确保框中的边界和对齐方式 ( 64 /[每像素字节]) 像素水平。 垂直边界和对齐方式应为 2 行,但使用每像素 1 字节格式的情况除外,在这种情况下,建议使用 4 行。 每个调用的单个深度切片得到有效处理。 建议但不一定要提供 128 字节对齐的指针和步幅。
写入子 mipmap 级别时,建议使用比上述更大的宽度和高度。 这是因为小 mipmap 级别实际上可能存储在较大的内存块中,偏移量不透明,这可能会干扰缓存行的对齐。
WriteToSubresource 和 ReadFromSubresource 为 UMA 适配器启用近乎零复制优化,但可能会严重损害离散/NUMA 适配器的效率,因为纹理数据不能驻留在本地视频内存中。 典型的应用程序应坚持离散友好的上传技术,除非它们识别适配器体系结构是 UMA。 有关上传的更多详细信息,请参阅 CopyTextureRegion;有关 UMA 的更多详细信息,请参阅 D3D12_FEATURE_DATA_ARCHITECTURE。
在 UMA 系统上,此例程可用于通过称为循环 平铺的循环优化来最大程度地降低内存复制的成本。 通过将上传内容分解为适合 CPU 缓存的 chuck,CPU 与main内存之间的有效带宽更接近于理论上的最大值。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | d3d12.h |
Library | D3d12.lib |
DLL | D3d12.dll |