d3d笔记

名词解释:
  • 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 为未来的图形组件提供了一个通用框架。
初始化相关接口
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之一。

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类型的值,它指定了描述符堆的类型,以获取句柄增量的大小。
);

返回值:返回给定类型的描述符堆的句柄增量的大小,包括任何必要的填充。

HRESULT CheckFeatureSupport(
            D3D12_FEATURE Feature,  //一个来自D3D12_FEATURE枚举的常量,它描述了你想查询以获得支持的特性。
  [in, out] void          *pFeatureSupportData,
            UINT          FeatureSupportDataSize
);

D3D12_FEATURE
返回值:如果成功返回S_OK。如果一个不支持的数据类型被传递给pFeatureSupportData参数,或者如果FeatureSupportDataSize参数的大小不匹配,则返回E_INVALIDARG。

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核心。

HRESULT CreateCommandAllocator(
  [in]  D3D12_COMMAND_LIST_TYPE type, //一个D3D12_COMMAND_LIST_TYPE类型的值,它指定要创建的命令分配器的类型。命令分配器的类型可以是记录直接命令列表或命令包的类型。参见创建命令队列的参数说明。
        REFIID                  riid,
  [out] void                    **ppCommandAllocator
);

返回值:如果没有足够的内存来创建命令分配器,这个方法返回E_OUTOFMEMORY。其他可能的返回值请参见Direct3D 12返回代码。

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错误代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值