D3D12_TEXTURE_LAYOUT 枚举 (d3d12.h)

指定纹理布局选项。

语法

typedef enum D3D12_TEXTURE_LAYOUT {
  D3D12_TEXTURE_LAYOUT_UNKNOWN = 0,
  D3D12_TEXTURE_LAYOUT_ROW_MAJOR = 1,
  D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE = 2,
  D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE = 3
} ;

常量

 
D3D12_TEXTURE_LAYOUT_UNKNOWN
值: 0
指示布局未知,并且可能依赖于适配器。
在创建期间,驱动程序会基于其他资源属性(尤其是资源大小和标志)选择最有效的布局。
除非其他纹理布局需要某些功能,否则首选此选项。

UMA 体系结构存在零复制纹理上传优化;请参阅 ID3D12Resource::WriteToSubresource
D3D12_TEXTURE_LAYOUT_ROW_MAJOR
值:1
指示纹理的数据以行为主顺序存储 (有时称为“间距线性顺序”) 。

此纹理布局在内存中连续定位一行的连续纹素,位于下一行的纹素之前。
同样,特定深度或数组切片的连续纹素在内存中位于下一个深度或数组切片的纹素之前是连续的。
在行之间以及深度或数组切片之间可能存在填充,以对齐数据集合。
步幅是内存中行、深度或数组切片之间的距离;它包括任何填充。

当其他布局不可用时,此纹理布局允许在多个适配器之间共享纹理数据。

许多限制适用,因为此布局通常不适用于大量使用:


  • 附近纹素的位置不是旋转固定的。

  • 仅支持以下纹理属性:


  • 必须在具有 D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER的堆上创建纹理。


缓冲区是使用 D3D12_TEXTURE_LAYOUT_ROW_MAJOR 创建的,因为行主纹理数据可以在其中找到,而无需创建纹理对象。
这通常用于上传或读取回纹理数据,尤其是离散/NUMA 适配器。
但是,在 GPU 或适配器之间封送纹理数据时,也可以使用 D3D12_TEXTURE_LAYOUT_ROW_MAJOR。
有关 使用 ID3D12GraphicsCommandList::CopyTextureRegion 的示例,请参阅以下一些主题:

D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE
值: 2
指示 64KB 磁贴和尾 mip 打包内的布局由驱动程序决定。
无标准重排模式。

此纹理布局排列为连续的 64KB 区域(也称为磁贴),每个维度包含近等边数量的连续纹素。
磁贴按行主顺序排列。
虽然磁贴之间没有填充,但每个维度中最后一个磁贴中通常有未使用的纹素。
图块中的纹素布局未定义。
每个子资源紧跟在上一个子资源结束的位置,子资源顺序遵循与子资源序号相同的序列。
但是,尾 mip 打包是特定于适配器的。
有关详细信息,请参阅平铺资源层和 ID3D12Device::GetResourceTiling

当与虚拟内存页映射功能一起使用时,此纹理布局支持部分驻留或稀疏纹理方案。
此纹理布局必须与 ID3D12Device::CreateReservedResource 一起使用,才能使用 ID3D12CommandQueue::UpdateTileMappings

一些限制适用于具有此布局的纹理:

D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE
值: 3
指示默认纹理使用标准化重排模式。

此纹理布局的排列方式与D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE相同,只不过磁贴中的纹素布局已定义。 尾 mip 打包特定于适配器。

在多个适配器之间或 CPU 与 GPU 之间封送数据时,此纹理布局可实现优化。
当多个组件理解纹理内存布局时,可以减少复制量。
由于相邻纹素的旋转固定位置,此布局通常比行主布局更高效。
此布局通常只能与支持标准重排的适配器一起使用,但跨适配器共享堆存在异常。

此布局的限制是不支持以下各项:

注解

此枚举由 D3D12_RESOURCE_DESC 结构使用。

此枚举控制默认纹理的重排模式,并在默认纹理上启用地图支持。 调用方必须查询 D3D12_FEATURE_DATA_D3D12_OPTIONS 以确保每个选项都受支持。

标准重排格式适用于每个页面大小的区块,页面按线性顺序彼此排列。 16 位交错模式定义从预重排页内位置到后重排位置的转换。

标准重排模式

为了演示,请考虑上面的 2D 32bpp 重排格式。 这由以下交错掩码表示,其中左侧的位最为重要:

UINT xBytesMask = 1010 1010 1000 1111
UINT yMask =      0101 0101 0111 0000

若要计算重排地址,可以在支持 _pdep_u32内部指令) (使用以下代码:

UINT swizzledOffset = resourceBaseOffset +
                      _pdep_u32(xOffset, xBytesMask) +
                      _pdep_u32(yOffset, yBytesMask);

要求

要求
Header d3d12.h

另请参阅

CD3DX12_RESOURCE_DESC

核心枚举

UMA 优化:CPU 可访问纹理和标准重排