2016-11-04 37 views
0

我想從我的dx12app中調用IDXGIDevice1 :: SetMaximumFrameLatency方法,因爲我需要從當前Direct3D 12設備獲取有效的IDXGIDevice1。查詢接口返回E_NOINTERFACE:無法從dx12中的ID3D12Device獲取IDXGIDevice或IDXGIDevice1

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 

不知道如果我想的東西或者有DXGI邏輯我需要實現獲得有效IDXGIDevice1接口的序列。

將不勝感激任何提示&在此先感謝! 的Klip

回答

1

支持Direct3D 12,獲得DXGI工廠的這種「傳統模式」,不支持,所以上面的代碼將無法正常工作,因爲它是第一個步驟:

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)) 
     ); 

支持Direct3D 12,你應該始終明確地創建DXGI工廠。見Anatomy of Direct3D 12 Create Device

在Direct3D 12交換鏈中,您可以明確控制backbuffer交換行爲。理想情況下,您可以使用DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT,然後使用可等待的對象來改變渲染速度。您可以通過IDXGISwapChain2::SetMaximumFrameLatency設置延遲計數,默認爲3(MSDN目前對於默認設置錯誤)。

如果您希望支持'更高刷新率'的更新(如nVidia G-Sync或AMD FreeSync),那麼您可以使用Present的新DXGI_PRESENT_ALLOW_TEARING標誌。有關使用此標誌的詳細信息,請參閱MSDN或此YouTube視頻。請參閱DirectX 12: Presentation Modes In Windows 10 (YouTube)

+0

感謝您的回覆查克。 我已經使用了一個明確創建工廠, 「CreateDXGIFactory1(__ uuidof(IDXGIFactory4),dxgiFactory)」 然後掃描DXGI適配器找到一個支持的Direct3D 12,然後創建一個類似於在您的博客中描述的步驟的裝置。 'D3D12CreateDevice(myAdapter,D3D_FEATURE_LEVEL_11_0,__uuidof(ID3D12Device),mydevice在)' 所以,除非我誤解你的答覆,我仍然不知道爲什麼我不能獲得IDXGIDevice1。 我對幀延遲的理解是,這是一個小於交換鏈的緩衝區計數的值,用於限制驅動程序的當前隊列。 –

+0

您可以使用IDXGISwapChain2 :: SetMaximumFrameLatency來代替。 –

+0

請注意,您只能將「IDXGISwapChain2 :: SetMaximumFrameLatency」用於可等待的交換鏈。 –