2016-11-04 4 views
0

Je voudrais appeler méthode IDXGIDevice1 :: SetMaximumFrameLatency à partir de mon dx12app, pour cela j'ai besoin d'obtenir un IDXGIDevice1 valide à partir du périphérique Direct3D 12 en cours. l'interrogation de l'interface renvoie une E_NOINTERFACE:ne peut pas acquérir IDXGIDevice ou IDXGIDevice1 de ID3D12Device dans dx12

IDXGIDevice * pDXGIDevice; 
HRESULT hr = myDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice); 
assert(hr != S_OK); // returns E_NOINTERFACE 

IDXGIDevice1 * pDXGIDevice1; 
HRESULT hr1 = myDevice->QueryInterface(__uuidof(IDXGIDevice1), (void **)&pDXGIDevice1); 
assert(hr != S_OK); // returns E_NOINTERFACE 

Je ne sais pas si je me manque quelque chose ou il y a séquence de la logique de dxgi que je dois mettre en œuvre pour obtenir une interface IDXGIDevice1 valide.

Apprécierait des conseils & merci d'avance! Klip

Répondre

1

Pour Direct3D 12, ce « modèle d'héritage » d'obtenir l'usine de DXGI est pas pris en charge, de sorte que votre code ci-dessus ne fonctionne pas comme il est la première étape:

ComPtr<IDXGIDevice3> dxgiDevice; 
    DX::ThrowIfFailed(
     m_d3dDevice.As(&dxgiDevice) 
     ); 

    ComPtr<IDXGIAdapter> dxgiAdapter; 
    DX::ThrowIfFailed(
     dxgiDevice->GetAdapter(&dxgiAdapter) 
     ); 

    ComPtr<IDXGIFactory4> dxgiFactory; 
    DX::ThrowIfFailed(
     dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)) 
     ); 

Pour Direct3D 12, vous devrait toujours créer l'usine DXGI explicitement. Voir Anatomy of Direct3D 12 Create Device.

Dans les chaînes d'échange Direct3D 12, vous contrôlez explicitement le comportement d'échange de backbuffer. Idéalement, vous devez utiliser DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT, puis utiliser l'objet waitable pour limiter votre vitesse de rendu. Vous pouvez définir le nombre de latence via IDXGISwapChain2::SetMaximumFrameLatency qui est par défaut 3 (MSDN est actuellement incorrect sur les valeurs par défaut).

Si vous souhaitez prendre en charge des mises à jour 'supérieures au taux de rafraîchissement' (telles que nVidia G-Sync ou AMD FreeSync), vous devez utiliser le nouveau drapeau DXGI_PRESENT_ALLOW_TEARING pour Present. Pour plus de détails sur l'utilisation de ce drapeau, voir MSDN ou cette vidéo YouTube. Voir aussi DirectX 12: Presentation Modes In Windows 10 (YouTube)

+0

Merci pour la réponse Chuck. J'utilise déjà une fabrique créée explicitement, 'CreateDXGIFactory1 (__ uuidof (IDXGIFactory4), & dxgiFactory)' puis scanne les adaptateurs DXGI pour en trouver un qui supporte Direct3D 12, puis crée un périphérique similaire aux étapes décrites dans votre blog. 'D3D12CreateDevice (myAdapter, D3D_FEATURE_LEVEL_11_0, __uuidof (ID3D12Device), et MyDevice)' Donc, à moins que je mal compris votre réponse, je ne suis toujours pas sûr pourquoi je ne peux pas acquérir IDXGIDevice1. Ma compréhension de la latence de trame, est que c'est une valeur <= que le nombre de tampons de la chaîne d'échange pour limiter la file d'attente actuelle du pilote –

+0

Vous pouvez utiliser '' IDXGISwapChain2 :: SetMaximumFrameLatency'' à la place. –

+0

Notez que vous pouvez utiliser '' IDXGISwapChain2 :: SetMaximumFrameLatency'' uniquement pour les swapchains. –