D3D12_HEAP_TYPE枚举 (d3d12.h)

指定堆的类型。 驻留时,堆驻留在具有特定 CPU 缓存属性的特定物理内存池中。

语法

typedef enum D3D12_HEAP_TYPE {
  D3D12_HEAP_TYPE_DEFAULT = 1,
  D3D12_HEAP_TYPE_UPLOAD = 2,
  D3D12_HEAP_TYPE_READBACK = 3,
  D3D12_HEAP_TYPE_CUSTOM = 4,
  D3D12_HEAP_TYPE_GPU_UPLOAD
} ;

常数

 
D3D12_HEAP_TYPE_DEFAULT
值:1
指定默认堆。 此堆类型体验 GPU 的最大带宽,但无法提供 CPU 访问。 GPU 可以从此池读取和写入内存,并且可能会更改资源转换屏障。 大多数堆和资源应位于此处,通常通过上传堆中的资源进行填充。
D3D12_HEAP_TYPE_UPLOAD
值:2
指定用于上传的堆。 此堆类型具有针对上传到 GPU 的优化 CPU 访问,但不会体验 GPU 的最大带宽量。 此堆类型最适合 CPU-write-once、GPU-read-once 数据;但 GPU 读取一次比必要更严格。 GPU-read-once-or-from-cache 是数据的可接受用例;但是,由于 GPU 缓存设计和大小不同,此类用法很难判断。 如有疑问,请坚持 GPU 读取一次定义或分析将数据复制到_DEFAULT堆与从_UPLOAD堆读取数据之间的许多 GPU 的差异。

必须使用此堆中的资源创建 D3D12_RESOURCE_STATE_GENERIC_READ,并且无法从此更改。 此类堆的 CPU 地址通常对于 CPU 读取效率不高。

下面是_UPLOAD堆的典型用法:

  • 使用 CPU 中的数据初始化_DEFAULT堆中的资源。

  • 在每个顶点或像素读取的常量缓冲区中上传动态数据。



对于_UPLOAD堆,以下情况可能不太好:

  • 重新初始化每个帧的资源内容。

  • 上传仅使用所有其他 Draw 调用的常量数据,其中每个 Draw 使用非普通的其他数据量。

D3D12_HEAP_TYPE_READBACK
值:3
指定用于回读的堆。 此堆类型具有针对从 GPU 中读取数据而优化的 CPU 访问,但不会体验 GPU 的最大带宽量。 此堆类型最适合 GPU-write-once、CPU 可读数据。 CPU 缓存行为是写回的,这有利于多个子缓存行 CPU 读取。

必须使用此堆中的资源创建 D3D12_RESOURCE_STATE_COPY_DEST,并且无法从此更改。
D3D12_HEAP_TYPE_CUSTOM
值:4
指定自定义堆。 应用程序可以直接指定内存池和 CPU 缓存属性,这对于 UMA 优化、多引擎、多适配器或其他特殊情况非常有用。 为此,应用程序应了解适配器体系结构,以便做出正确的选择。 有关详细信息,请参阅

D3D12_FEATURE_ARCHITECTURE,
D3D12_FEATURE_DATA_ARCHITECTURE
GetCustomHeapProperties

言论

以下 API 项使用此枚举:

堆类型分为两类:抽象堆类型和自定义堆类型。

以下是抽象堆类型:

  • D3D12_HEAP_TYPE_DEFAULT
  • D3D12_HEAP_TYPE_UPLOAD
  • D3D12_HEAP_TYPE_READBACK
下面是自定义堆类型:
  • D3D12_HEAP_TYPE_CUSTOM
抽象堆类型(_DEFAULT、_UPLOAD和_READBACK)对于简化编写非适配器性应用程序非常有用,因为此类应用程序不需要了解适配器内存体系结构。 若要使用抽象堆类型来简化编写非特定适配器的应用程序,应用程序实质上将适配器视为离散或 NUMA 适配器。 但是,使用堆类型可为 UMA 适配器提供高效的转换。 适配器体系结构中性应用程序应假定有两个可用内存池,其中具有最多 GPU 带宽的池无法提供 CPU 访问。 具有最小 GPU 带宽的池可以具有 CPU 访问权限;但必须针对上传到 GPU 或从 GPU 进行读回进行优化。

请注意,纹理(与缓冲区不同)不能是堆类型 UPLOAD 或 READBACK。

要求

要求 价值
标头 d3d12.h

另请参阅

核心枚举

描述符堆