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 写入一次、GPU 读取一次数据;但 GPU-read-once 比必要更严格。 GPU-read-once-or-from-cache 是数据可接受的用例;但由于 GPU 缓存设计和大小不同,此类用法难以判断。 如有疑问,请坚持 GPU-read-once 定义,或分析将数据复制到_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 写入一次、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。

要求

要求
Header d3d12.h

另请参阅

核心枚举

描述符堆