名词解释:
- DXGI
Microsoft DirectX Graphics Infrastructure (DXGI) recognizes that some parts of graphics evolve more slowly than others. The primary goal of DXGI is to manage low-level tasks that can be independent of the DirectX graphics runtime. DXGI provides a common framework for future graphics components;
DXGI就是DirectX 图形基础结构,微软意识到图形的一些部分比其他部分发展的缓慢,因此将发展缓慢的部分剥离出来形成DXGI。DXGI主要目标是管理可以独立于 DirectX 图形运行时的低级任务。DXGI 为未来的图形组件提供了一个通用框架。
初始化相关接口
- CreateDXGIFactory1
创建一个可以用来生成其他DXGI对象的DXGI 1.1工厂。
HRESULT CreateDXGIFactory1(
REFIID riid, //ppFactory参数引用的IDXGIFactory对象的全局唯一标识符(GUID)。
[out] void **ppFactory//指向IDXGIFactory对象的指针地址。
);
返回值:如果成功返回S_OK;否则,返回以下DXGI_ERROR之一。
- CreateDXGIFactory
创建一个可以用来生成其他DXGI对象的DXGI 1.0工厂。
HRESULT CreateDXGIFactory(
REFIID riid, //ppFactory参数引用的IDXGIFactory对象的全局唯一标识符(GUID)。
[out] void **ppFactory //指向IDXGIFactory对象的指针地址。
);
返回值:如果成功返回S_OK;否则,返回以下DXGI_ERROR之一。
- D3D12CreateDevice
创建表示显示适配器的设备。
HRESULT D3D12CreateDevice(
[in, optional] IUnknown *pAdapter,//在创建设备时要使用的视频适配器的指针。传递NULL以使用默认适配器,这是IDXGIFactory1::EnumAdapters枚举的第一个适配器。
D3D_FEATURE_LEVEL MinimumFeatureLevel,//成功创建设备所需的最小D3D_FEATURE_LEVEL。
[in] REFIID riid,//设备接口的全局唯一标识符(GUID)。这个参数和ppDevice可以用单个宏IID_PPV_ARGS寻址。
[out, optional] void **ppDevice//一个指向内存块的指针,它接收到一个指向设备的指针。传递NULL以测试设备创建是否成功,但不实际创建设备。如果传入NULL并且设备创建成功,则返回S_FALSE。
);
typedef enum D3D_FEATURE_LEVEL {
D3D_FEATURE_LEVEL_1_0_CORE,
D3D_FEATURE_LEVEL_9_1,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_12_0,
D3D_FEATURE_LEVEL_12_1,
D3D_FEATURE_LEVEL_12_2
} ;
注意:不要在应用程序中混合使用DXGI 1.0 (IDXGIFactory)和DXGI 1.1 (IDXGIFactory1)。在应用程序中使用IDXGIFactory或IDXGIFactory1,但不要同时使用。
返回值:这个方法可以返回一个Direct3D 12返回码。
可能的返回值包括那些为CreateDXGIFactory1和IDXGIFactory::EnumAdapters文档化的值。
如果ppDevice为NULL且函数成功,则返回S_FALSE,而不是S_OK。
- EnumWarpAdapter
提供一个适配器,可以提供给D3D12CreateDevice来使用WARP渲染器。
HRESULT EnumWarpAdapter(
[in] REFIID riid, //ppvAdapter参数引用的IDXGIAdapter对象的GUID (global unique identifier)
[out] void **ppvAdapter //指向适配器的IDXGIAdapter接口指针的地址。该参数不能为NULL。
);
返回值:如果成功返回S_OK;否则为错误码。有关错误码的列表,请参见DXGI_ERROR。参见Direct3D 12返回代码。
HRESULT CreateFence(
UINT64 InitialValue, //栅栏的初始值
D3D12_FENCE_FLAGS Flags, //D3D12_FENCE_FLAGS类型值的组合,通过使用按位或运算(bitwise OR operation)组合而成。结果值指定fence的选项
REFIID riid, //fence接口(ID3D12Fence)的全局唯一标识符(GUID)。fence接口的REFIID或GUID可以通过使用__uuidof()宏获得。例如,__uuidof(ID3D12Fence)将得到一个fence的接口的GUID。
[out] void **ppFence //一个指向内存块的指针,该内存块接收到一个指向ID3D12Fence接口的指针,该接口用于访问fence。
);
typedef enum D3D12_FENCE_FLAGS {
D3D12_FENCE_FLAG_NONE, //不指定选项
D3D12_FENCE_FLAG_SHARED, //围栏是公用的
D3D12_FENCE_FLAG_SHARED_CROSS_ADAPTER, //围栏与另一个GPU适配器共享
D3D12_FENCE_FLAG_NON_MONITORED //围栏属于非监控类型。仅当适配器不支持受监控的围栏,或者当一个围栏与不支持受监控的围栏的适配器共享时,才应该使用非受监控的围栏。
} ;
返回值:如果成功返回S_OK;否则,返回其中一个Direct3D 12返回代码。
- GetDescriptorHandleIncrementSize
获取给定类型的描述符堆的句柄增量的大小。这个值通常用于将描述符数组的句柄按正确的数量递增。
UINT GetDescriptorHandleIncrementSize(
[in] D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapType // D3D12_DESCRIPTOR_HEAP_TYPE类型的值,它指定了描述符堆的类型,以获取句柄增量的大小。
);
返回值:返回给定类型的描述符堆的句柄增量的大小,包括任何必要的填充。
- CheckFeatureSupport
获取有关当前图形驱动程序支持的特性的信息。
HRESULT CheckFeatureSupport(
D3D12_FEATURE Feature, //一个来自D3D12_FEATURE枚举的常量,它描述了你想查询以获得支持的特性。
[in, out] void *pFeatureSupportData,
UINT FeatureSupportDataSize
);
D3D12_FEATURE
返回值:如果成功返回S_OK。如果一个不支持的数据类型被传递给pFeatureSupportData参数,或者如果FeatureSupportDataSize参数的大小不匹配,则返回E_INVALIDARG。
- CreateCommandQueue
创建一个命令队列
HRESULT CreateCommandQueue(
const D3D12_COMMAND_QUEUE_DESC *pDesc,
REFIID riid, //命令队列接口的全局唯一标识符(GUID)。
void **ppCommandQueue //一个指向内存块的指针,它接收到一个指向命令队列的ID3D12CommandQueue接口的指针。
);
typedef struct D3D12_COMMAND_QUEUE_DESC {
D3D12_COMMAND_LIST_TYPE Type; //指定D3D12_COMMAND_LIST_TYPE的一个成员。
INT Priority; //命令队列的优先级,作为D3D12_COMMAND_QUEUE_PRIORITY枚举常量来选择普通优先级或高优先级。
D3D12_COMMAND_QUEUE_FLAGS Flags; //从D3D12_COMMAND_QUEUE_FLAGS枚举中指定任何标志。
UINT NodeMask;//对于单个GPU操作,将此设置为零。如果有多个GPU节点,通过设置位来标识命令队列应用的节点(即设备的物理适配器)。掩码中的每个位对应一个节点。只需要设置1位。
} D3D12_COMMAND_QUEUE_DESC;
typedef enum D3D12_COMMAND_LIST_TYPE {
D3D12_COMMAND_LIST_TYPE_DIRECT, //指定GPU可以执行的命令缓冲区。直接命令列表不继承任何GPU状态。
D3D12_COMMAND_LIST_TYPE_BUNDLE, //指定只能通过直接命令列表直接执行的命令缓冲区。一个bundle命令列表继承所有的GPU状态(除了当前设置的管道状态对象和基元拓扑)。
D3D12_COMMAND_LIST_TYPE_COMPUTE, //指定用于计算的命令缓冲区。
D3D12_COMMAND_LIST_TYPE_COPY, //指定用于复制的命令缓冲区。
D3D12_COMMAND_LIST_TYPE_VIDEO_DECODE, //指定用于视频解码的命令缓冲区。
D3D12_COMMAND_LIST_TYPE_VIDEO_PROCESS, //指定用于视频处理的命令缓冲区。
D3D12_COMMAND_LIST_TYPE_VIDEO_ENCODE //指定用于视频编码的命令缓冲区。
} ;
typedef enum D3D12_COMMAND_QUEUE_PRIORITY {
D3D12_COMMAND_QUEUE_PRIORITY_NORMAL, //正常优先级
D3D12_COMMAND_QUEUE_PRIORITY_HIGH, //高优先级
D3D12_COMMAND_QUEUE_PRIORITY_GLOBAL_REALTIME //全局实时优先级。
} ;
typedef enum D3D12_COMMAND_QUEUE_FLAGS {
D3D12_COMMAND_QUEUE_FLAG_NONE, //默认命令队列
D3D12_COMMAND_QUEUE_FLAG_DISABLE_GPU_TIMEOUT //表示该命令队列应禁用GPU超时。
} ;
返回值:如果没有足够的内存来创建命令队列,这个方法将返回E_OUTOFMEMORY。其他可能的返回值请参见Direct3D 12返回代码。
评论:对于多显示适配器的设备而言,创建显示适配器设备时需指定为哪一个显示适配器创建的设备。
对于多GPU的显示适配器,使用D3D设备创建命令队列时,需指明是为哪个GPU节点创建的命令队列。
目前对多GPU适配器的理解为:一个显示适配器上可以有多个GPU适配器。简单的说就是一个显卡上有多个GPU核心。
- CreateCommandAllocator
创建一个命令分配器对象
HRESULT CreateCommandAllocator(
[in] D3D12_COMMAND_LIST_TYPE type, //一个D3D12_COMMAND_LIST_TYPE类型的值,它指定要创建的命令分配器的类型。命令分配器的类型可以是记录直接命令列表或命令包的类型。参见创建命令队列的参数说明。
REFIID riid,
[out] void **ppCommandAllocator
);
返回值:如果没有足够的内存来创建命令分配器,这个方法返回E_OUTOFMEMORY。其他可能的返回值请参见Direct3D 12返回代码。
- CreateCommandList
创建一个命令列表
HRESULT CreateCommandList(
[in] UINT nodeMask, //对于单gpu操作,将此设置为零。如果有多个GPU节点,则设置一个位来标识要创建命令列表的节点(设备的物理适配器)。掩码中的每个位对应一个节点。只需要设置一个位。请参见多适配器系统。
[in] D3D12_COMMAND_LIST_TYPE type, //参见创建命令队列的参数说明
[in] ID3D12CommandAllocator *pCommandAllocator, //指向命令分配器对象的指针,设备从中创建命令列表。
[in, optional] ID3D12PipelineState *pInitialState, //指向管道状态对象的可选指针,该对象包含命令列表的初始管道状
//态。如果它是nullptr,那么运行时设置一个虚拟的初始管道状态,这样驱动程序就不必处理未定义的状态。这种方法的开销很低,
//特别是对于命令列表来说,记录命令列表的总开销很可能比单个初始状态设置的开销小得多。因此,如果不方便的话,不设置初始
//管道状态参数的代价很小。
[in] REFIID riid,
[out] void **ppCommandList
);
返回值:如果函数成功,它返回S_OK。否则,它将返回一个HRESULT错误代码。