IDXGIF工厂版本

IDXGIFactory versions

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

IDXGIFactory IDXGIFactory1 IDXGIFactory2 IDXGIFactory3 IDXGIFactory4 IDXGIFactory5

但我也注意到,只有为前 3 个 IDXGIFactory 版本创建此类实例的方法,但没有为后 3 个版本创建此类实例的方法。

创建DXGIFactory 创建DXGIFactory1 创建DXGIFactory2

没有CreateDXGIFactory3、CreateDXGIFactory4或CreateDXGIFactory5。

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

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

编辑:

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

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

如何枚举 IDXGIAdapter2 实例?

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

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

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

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

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

IDXGIFactory2* factory;
HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory);
if(SUCCEEDED(hr))
{
  // ...
}
  1. IDXGIFactory5接口继承自IDXGIFactory4
  2. IDXGIFactory4接口继承自IDXGIFactory3
  3. IDXGIFactory3接口继承自IDXGIFactory2
  4. IDXGIFactory2接口继承自IDXGIFactory1

您必须包含适当的 header 接口类型

#include <DXGI1_5.h>

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

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

并调用 CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);。如果成功,您将获得一个 IDXGIFactory5,它具有 IDXGIFactory4、IDXGIFactory3、IDXGIFactory2 和 IDXGIFactory1 具有的所有方法,加上它自己的 CheckFeatureSupport. The CreateDXGIFactory1 and CreateDXGIFactory2 functions are just overloaded versions of CreateDXGIFactory for DXGI 1.1 - 1.5, however CreateDXGIFactory is for creating IDXGIFactory DXGI 1.0 objects. To create a DXGIFactory5 object you have to be using DXGI 1.5 (Windows 10 Direct3D 12). To get a better understanding of the purpose of the CheckFeatureSupport function and why you'd want it see this Direct3D 12 级别解释方法。