2017-02-20 4 views
0

Je travaille avec DXGI et DirectX 11 en utilisant C++. En ce moment j'expérimente avec IDXGIFactory. Après quelques recherches et lecture the documentation j'ai remarqué qu'il existe différentes versions.Versions IDXGIFactory

IDXGIFactory IDXGIFactory1 IDXGIFactory2 IDXGIFactory3 IDXGIFactory4 IDXGIFactory5

Mais j'ai aussi remarqué qu'il existe des méthodes que pour la création d'une telle instance pour les 3 premières versions IDXGIFactory mais pas pour la dernière 3.

CreateDXGIFactory CréerDXGIFactory1 CréerDXGIFactory2

Il n'y a pas CreateDXGIFactory3, CreateDXGIFactory4 ou CreateDXGIFactory5. Donc, ma question est de savoir comment créer une instance IDXGIFactory5?

De plus, je me demande si je ne peux pas instancier une instance de IDXGIFactory5 moi-même comment je peux forcer D3D11CreateDevice à créer et utiliser un IDXGIFactory5 interne afin que je puisse récupérer une référence du ID3D11Device résultant?

EDIT:

OK maintenant je comprends les différentes fonctions de CreateDXGIFactory et comment créer une instance IDXGIFactory5. Mais après avoir compris cela, j'ai eu le prochain problème. La documentation de IDXGIAdapter2 dit que je devrais utiliser IDXGIFactory1 :: EnumAdapters1 pour interroger une instance. Mais en regardant la signature de la fonction je reçois seulement un IDXGIAdapter1. Comment puis-je énumérer des instances IDXGIAdapter2

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

?

+0

'' CreateDXGIFactory'' était la fonction d'origine DXGI 1.0 factory pour Direct3D 10. Pour Direct3D 11, vous devez toujours utiliser '' CreateDXGIFactory1'' et créer une interface '' IDXGIFactory1'' ou une version ultérieure. Pour les versions de débogage sur Windows 8.1 et Windows 10, vous pouvez utiliser '' CreateDXGIFactory2'' pour créer une version de débogage de '' IDXGIFactory1'' ou plus tard - voir [ce modèle] (https://github.com/walbourn /directx-vs-templates/blob/master/d3d11game_uwp_dr/DeviceResources.cpp) pour un exemple. Pour DIrect3D 12, vous pouvez supposer que '' CreateDXGIFactory2'' et '' IDXGIFactory4'' ou plus récent est supporté. –

Répondre

2

Les numéros sur CreateDXGIFactory sont liés aux modifications apportées à la signature de cette fonction, et non aux interfaces implémentées par l'objet COM renvoyé. En particulier, CreateDXGIFactory2 a ajouté le paramètre Flags.

Vous obtiendrez une référence à l'interface souhaitée de la même manière que tout autre objet COM. Soit:

  1. passer le IID de l'interface souhaitée comme riid, coulé puis l'objet retourné à cette interface OR

  2. passer le IID d'une interface telle que IUnknown. Appelez QueryInterface sur l'objet retourné pour obtenir l'interface souhaitée. Cela peut être utile si vous souhaitez prendre en charge plusieurs versions, car vous pouvez essayer la version 5 et, si cela n'est pas le cas, revenir à la version 4, par exemple.

Par exemple, l'option 1 pourrait ressembler à:

IDXGIFactory2* factory; 
HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory); 
if(SUCCEEDED(hr)) 
{ 
    // ... 
} 
2
  1. L'interface IDXGIFactory5 hérite de IDXGIFactory4
  2. L'interface IDXGIFactory4 hérite de IDXGIFactory3
  3. L'interface IDXGIFactory3 hérite de IDXGIFactory2
  4. L'interface IDXGIFactory2 hérite de IDXGIFactory1

Vous devez inclure l'en-tête approprié pour le type d'interface

#include <DXGI1_5.h>

Et ont déclaré une instance du bon type de pointeur

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

Et appelez CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);. Si elle réussit, vous avez un IDXGIFactory5 qui a toutes les méthodes qu'un IDXGIFactory4, IDXGIFactory3, IDXGIFactory2 et IDXGIFactory1 a, plus sa propre méthode de CheckFeatureSupport. Les fonctions CreateDXGIFactory1 et CreateDXGIFactory2 sont juste des versions surchargées de CreateDXGIFactory pour DXGI 1.1 - 1.5, cependant CreateDXGIFactory sert à créer des objets DXGI 1.0 IDXGIFactory. Pour créer un objet DXGIFactory5, vous devez utiliser DXGI 1.5 (Windows 10 Direct3D 12). Pour mieux comprendre le but de la fonction CheckFeatureSupport et pourquoi vous souhaitez l'obtenir, voir l'explication des niveaux de Direct3D 12 sur this.