2015-07-11 122 views
1

IDXGIFactory interface的參考告訴我,爲了創造一個交換鏈,我可能會使用用於創建Direct3D設備同廠:爲什麼使用相同的IDXGIFactory爲設備和交換鏈

由於您可以在不創建交換鏈的情況下創建Direct3D設備,因此您可能需要檢索用於創建設備的工廠以創建交換鏈。

這也給了下面的代碼〔實施例:(關於

IDXGIDevice * pDXGIDevice; 
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice); 

IDXGIAdapter * pDXGIAdapter; 
hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter); 

IDXGIFactory * pIDXGIFactory; 
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&pIDXGIFactory); 

文章很備用,並試圖在充分了解它,下面的兩個問題出現了,而第一個問題是最主要的問題這個線程的標題):

爲什麼我必須使用與創建Direct3D設備相同的工廠才能創建交換鏈?工廠實例是否維護一個很重要的內部狀態,還是隻是爲了避免創建耗費資源的另一個工廠實例?

此外,代碼示例中我用下面的代碼行掙扎:

hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter); 

對我來說,這是不符合邏輯,該IDXGIAdapter是IDXGIDevice的父。否則,我期望IDXGIAdapter有一個像CreateDevice這樣的方法,它可以使適配器成爲設備的父節點。但事實並非如此。爲什麼適配器是設備的父級?

回答

2

問題的根源可追溯到DXGI 1.0(Direct3D 10)和DXGI 1.1(Direct3D 11)。如果您嘗試使用CreateDXGIFactoryCreateDXGIFactory1在同一個過程中創建的IDXGIFactory,事情會變得很快梨形。

另一個問題是在創建Direct3D 10.x或11.x設備時使用「默認設備」時會創建隱式工廠。上面的「魔法代碼序列」可以讓您隱式創建工廠。

文檔中的第二步應該是dxgiDevice->GetAdapter而不是dxgiDevice->GetParent。我會爲此提出一個文檔錯誤。

這是更容易,如果使用Microsoft::WRL::ComPtr做:

// First, retrieve the underlying DXGI Device from the D3D Device 
    ComPtr<IDXGIDevice1> dxgiDevice; 
    DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice)); 

    // Identify the physical adapter (GPU or card) this device is running on. 
    ComPtr<IDXGIAdapter> dxgiAdapter; 
    DX::ThrowIfFailed(dxgiDevice->GetAdapter(dxgiAdapter.GetAddressOf())); 

    // And obtain the factory object that created it. 
    ComPtr<IDXGIFactory1> dxgiFactory; 
    DX::ThrowIfFailed(dxgiAdapter->GetParent(__uuidof(IDXGIFactory1), &dxgiFactory)); 

的Direct3D 12

需要注意的是,這整個地區已被清理了的Direct3D 12,你不能使用齊從ID3D12Device獲得IDXGIDevice

參考

DirectX Graphics Infrastructure (DXGI): Best Practices
Anatomy of Direct3D 11 Create Device

+0

謝謝你查,爲您詳細的解答。但是不是爲「默認適配器」(dxgiAdapter-> GetParent(...))創建的隱式工廠? Direct3D 12的意義有點令人困惑:是否會有一個明確的方法從ID3D12Device獲取IDXGIDevice? – Sam

相關問題