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 状态,才能通过 WriteToSubresourceReadFromSubresource 进行 CPU 访问,才能合法;但缓冲区不这样做。

为提高效率,请确保框中的边界和对齐方式 ( 64 /[每像素字节]) 像素水平。 垂直边界和对齐方式应为 2 行,但使用每像素 1 字节格式的情况除外,在这种情况下,建议使用 4 行。 每个调用的单个深度切片得到有效处理。 建议但不一定要提供 128 字节对齐的指针和步幅。

写入子 mipmap 级别时,建议使用比上述更大的宽度和高度。 这是因为小 mipmap 级别实际上可能存储在较大的内存块中,偏移量不透明,这可能会干扰缓存行的对齐。

WriteToSubresourceReadFromSubresource 为 UMA 适配器启用近乎零复制优化,但可能会严重损害离散/NUMA 适配器的效率,因为纹理数据不能驻留在本地视频内存中。 典型的应用程序应坚持离散友好的上传技术,除非它们识别适配器体系结构是 UMA。 有关上传的更多详细信息,请参阅 CopyTextureRegion;有关 UMA 的更多详细信息,请参阅 D3D12_FEATURE_DATA_ARCHITECTURE

在 UMA 系统上,此例程可用于通过称为循环 平铺的循环优化来最大程度地降低内存复制的成本。 通过将上传内容分解为适合 CPU 缓存的 chuck,CPU 与main内存之间的有效带宽更接近于理论上的最大值。

要求

要求
目标平台 Windows
标头 d3d12.h
Library D3d12.lib
DLL D3d12.dll

另请参阅

ID3D12Resource

子资源