ID3D12GraphicsCommandList::CopyTiles 方法 (d3d12.h)
将磁贴从缓冲区复制到平铺资源,反之亦然。
语法
void CopyTiles(
[in] ID3D12Resource *pTiledResource,
[in] const D3D12_TILED_RESOURCE_COORDINATE *pTileRegionStartCoordinate,
[in] const D3D12_TILE_REGION_SIZE *pTileRegionSize,
[in] ID3D12Resource *pBuffer,
UINT64 BufferStartOffsetInBytes,
D3D12_TILE_COPY_FLAGS Flags
);
参数
[in] pTiledResource
类型: ID3D12Resource*
指向平铺资源的指针。
[in] pTileRegionStartCoordinate
类型: const D3D12_TILED_RESOURCE_COORDINATE*
指向描述平铺资源的起始坐标的 D3D12_TILED_RESOURCE_COORDINATE 结构的指针。
[in] pTileRegionSize
类型: const D3D12_TILE_REGION_SIZE*
指向描述平铺区域大小的 D3D12_TILE_REGION_SIZE 结构的指针。
[in] pBuffer
类型: ID3D12Resource*
指向 ID3D12Resource 的指针,该 ID3D12Resource 表示默认缓冲区、动态缓冲区或暂存缓冲区。
BufferStartOffsetInBytes
类型: UINT64
pBuffer 处缓冲区中用于启动操作的偏移量(以字节为单位)。
Flags
D3D12_TILE_COPY_FLAGS类型的值的组合,这些值通过使用按位 OR 运算进行组合,用于标识如何复制磁贴。
返回值
无
备注
CopyTiles 将写入操作拖放到未映射的区域,并处理未映射区域中的读取操作 (,但Tier_1平铺资源除外,其中读取和写入未映射区域无效 - 请参阅 D3D12_TILED_RESOURCES_TIER) 。
如果复制操作涉及多次写入同一内存位置,因为目标资源中的多个位置映射到同一磁贴内存,则对多映射磁贴生成的写入操作是不确定的且不可重复的;也就是说,对磁贴内存的访问将按硬件执行复制操作的任何顺序发生。
复制操作中涉及的磁贴不能包含包含已打包 mipmap 的磁贴,或者复制操作的结果未定义。 若要向/从硬件打包的 mipmap 传输数据到构成已打包 mip 的一个或多个磁贴,必须使用标准 (即非特定于磁贴) 复制 API(如 CopyTextureRegion)。
CopyTiles 复制数据的模式与标准复制方法略有不同。
复制操作的非平铺缓冲区资源端的磁贴的内存布局在 64 KB 磁贴内的内存中是线性的,硬件和驱动程序在与平铺资源之间传输时,会相应地对每个磁贴进行重排和取消重排。 对于多重采样抗锯齿 (MSAA) 图面,硬件和驱动程序会按采样索引顺序遍历每个像素的样本,然后再移动到下一个像素。 对于在右侧部分填充的磁贴 (的图面的宽度不是图块宽度的倍数(以像素) 为单位),下移行的间距和步幅是平铺已满时可适应的像素数像素的完整大小(以字节为单位)。 因此,内存中的每一行像素之间可能存在间隙。 小于磁贴的 Mipmap 不会在线性布局中打包在一起,这似乎浪费了内存空间,但如前所述,不能使用 CopyTiles 复制到硬件打包在一起的 mipmap。 只需使用泛型复制 API(如 CopyTextureRegion)单独复制小型 mipmap。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | d3d12.h |
Library | D3d12.lib |
DLL | D3d12.dll |