IDXGIFactory версии

Я работаю с DXGI а также DirectX 11 используя C ++.
На данный момент я экспериментирую с IDXGIFactory.
После некоторых исследований и чтения документация Я заметил, что есть разные версии.

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?

0

Решение

Числа на 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))
{
// ...
}
2

Другие решения

  1. Интерфейс IDXGIFactory5 наследуется от IDXGIFactory4
  2. Интерфейс IDXGIFactory4 наследуется от IDXGIFactory3
  3. Интерфейс IDXGIFactory3 наследуется от IDXGIFactory2
  4. Интерфейс IDXGIFactory2 наследуется от IDXGIFactory1

Вы должны включить соответствующий заголовок для типа интерфейса

#include <DXGI1_5.h>

И объявили экземпляр правильного типа указателя

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

И позвонить CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);, Если это удается, у вас есть IDXGIFactory5, который имеет все методы, которые есть у IDXGIFactory4, IDXGIFactory3, IDXGIFactory2 и IDXGIFactory1, плюс его собственный метод CheckFeatureSupport. CreateDXGIFactory1 а также CreateDXGIFactory2 функции просто перегруженные версии CreateDXGIFactory для DXGI 1.1 — 1.5, однако CreateDXGIFactory для создания IDXGIFactory DXGI 1.0 объекты. Для создания объекта DXGIFactory5 вы должны использовать DXGI 1.5 (Windows 10 Direct3D 12). Чтобы лучше понять назначение функции CheckFeatureSupport и почему вы хотите ее увидеть этот объяснение Direct3D 12 уровней.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector