2

IDXGIFactory インターフェイスの参照は、スワップ チェーンを作成するために、Direct3D デバイスの作成に使用されたものと同じファクトリを使用する可能性があることを示しています。

スワップ チェーンを作成せずに 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);

記事は非常に控えめで、完全に理解しようとすると、次の 2 つの疑問が生じましたが、最初の疑問が主な疑問です (このスレッドのタイトルに関するものです)。

スワップ チェーンを作成するために、Direct3D デバイスの作成に使用したものと同じファクトリを使用する必要があるのはなぜですか? ファクトリ インスタンスは、重要な内部状態を維持していますか?それとも、リソースを消費するファクトリの別のインスタンスを作成しないようにするだけですか?

また、コード サンプル内で、次のコード行に苦労しています。

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

私にとって、IDXGIAdapter が IDXGIDevice の親であることは論理的ではありません。それ以外の場合、IDXGIAdapterには、アダプターをデバイスの親にする CreateDevice のようなメソッドが必要です。しかし、そうではありません。アダプターがデバイスの親であるのはなぜですか?

4

1 に答える 1

3

問題の根本は、DXGI 1.0 (Direct3D 10) および DXGI 1.1 (Direct3D 11) にまでさかのぼります。IDXGIFactory両方CreateDXGIFactoryで作成された を同じプロセスで使用しようとするCreateDXGIFactory1と、物事はすぐにナシ型になります。

もう 1 つの問題は、Direct3D 10.x または 11.x デバイスの作成で「既定のデバイス」を使用すると、暗黙的なファクトリが作成されることです。上記の「マジック コード シーケンス」を使用すると、ファクトリを暗黙的に作成できます。

ドキュメントの 2 番目のステップはすべきではあり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));

ダイレクト3D 12

この領域全体が Direct3D 12 でクリーンアップされており、QI を使用してIDXGIDeviceからを取得できないことに注意してくださいID3D12Device

参考文献

DirectX Graphics Infrastructure (DXGI): Direct3D 11 Create Device のベスト プラクティスの分析

于 2015-07-11T16:06:02.333 に答える