IDXGIFactory版本

时间:2017-02-20 21:17:07

标签: c++ directx-11 dxgi

我正在使用C ++使用 DXGI DirectX 11 。 目前我正在尝试使用IDXGIFactory。 经过一些研究和阅读the documentation后,我注意到有不同的版本。

IDXGIFactory IDXGIFactory1 IDXGIFactory2 IDXGIFactory3 IDXGIFactory4 IDXGIFactory5

但我也注意到,只有方法可以为前3个IDXGIFactory版本创建这样的实例,但不会为最后3个版本创建这样的实例。

CreateDXGIFactory CreateDXGIFactory1 CreateDXGIFactory2

没有CreateDXGIFactory3,CreateDXGIFactory4或CreateDXGIFactory5。

所以我的问题是如何创建IDXGIFactory5实例?

此外我想知道我是否无法自己实例化IDXGIFactory5的实例如何强制D3D11CreateDevice在内部创建和使用IDXGIFactory5以便我可以从生成的ID3D11Device中检索引用?

修改

现在好了,我了解了不同的CreateDXGIFactory函数以及如何创建IDXGIFactory5实例。 但在理解了这一点后,我得到了下一个问题。 来自IDXGIAdapter2的文档说我应该使用IDXGIFactory1 :: EnumAdapters1来查询实例。 但是看看函数签名我只得到一个IDXGIAdapter1。

HRESULT EnumAdapters1(
    UINT Adapter,
    [out] IDXGIAdapter1 **ppAdapter
);

如何枚举IDXGIAdapter2实例?

2 个答案:

答案 0 :(得分:2)

CreateDXGIFactory上的数字与该函数签名的更改有关,而与返回的COM对象实现的接口无关。特别是,CreateDXGIFactory2添加了Flags参数。

您将以与任何其他COM对象相同的方式获取对所需接口的引用。之一:

  1. 将所需接口的IID传递为riid,然后将返回的对象强制转换为该接口或

  2. 传递IUnknown等接口的IID。在返回的对象上调用QueryInterface以获取所需的接口。如果您想支持多个版本,这可能很有用,因为您可以尝试使用版本5,如果找不到版本,则可以回退到版本4,例如。

  3. 例如,选项1可能如下所示:

    IDXGIFactory2* factory;
    HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory);
    if(SUCCEEDED(hr))
    {
      // ...
    }
    

答案 1 :(得分:2)

  1. IDXGIFactory5接口继承自IDXGIFactory4
  2. IDXGIFactory4接口继承自IDXGIFactory3
  3. IDXGIFactory3接口继承自IDXGIFactory2
  4. IDXGIFactory2接口继承自IDXGIFactory1
  5. 您必须为接口类型

    添加适当的标头

    #include <DXGI1_5.h>

    并声明了正确指针类型的实例

    IDXGIFactory5* outPtr = nullptr; \\this really should be a CComPtr

    并致电CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);。如果成功,您就拥有了IDXGIFactory5,其中包含IDXGIFactory4,IDXGIFactory3,IDXGIFactory2和IDXGIFactory1所具有的所有方法,以及它自己的CheckFeatureSupport方法。对于DXGI 1.1 - 1.5,CreateDXGIFactory1CreateDXGIFactory2函数只是CreateDXGIFactory的重载版本,但CreateDXGIFactory用于创建IDXGIFactory DXGI 1.0对象。要创建DXGIFactory5对象,您必须使用DXGI 1.5(Windows 10 Direct3D 12)。为了更好地理解CheckFeatureSupport函数的用途以及为什么需要它,请查看Direct3D 12级别的this解释。