クロス アダプター リソースを使用した個別の GPU でのレンダリング

Windows 8.1 以降、ディスクリート GPU は、クロス アダプター リソースを次に示すものとして使用します。

  • ビット ブロック転送 (bitblt) または present 操作の保存先として。ただし、ストレッチや色変換は行われません。
  • オペレーティング システムが、ユーザー モード ディスプレイ ドライバーに対して bitblt または present 操作の実行を要求するリソース。

統合 GPU は、クロス アダプター リソースを次に示すものとして使用します。

  • デスクトップ ウィンドウ マネージャー (DWM) による構成時のテクスチャ。
  • GDI ハードウェア アクセラレーションのレンダー ターゲット。
  • ディスプレイ プライマリ。
  • 3-D 操作のレンダー ターゲットにはなりません。

次のセクションでは、アプリケーションがハイブリッド システム内のディスクリート GPU 上でレンダリングされる 3 つのシナリオに関連するアーキテクチャとプロセスについて説明します。

リダイレクトされた bitblt プレゼンテーション モデル

Diagram showing the hybrid graphics redirected bitblt model for rendering on a discrete GPU.

  1. 最上位ウィンドウのクロス アダプター リソースは、統合 GPU 上での標準割り当てとしてカーネル モードで作成されます。
  2. このリソースが、ディスクリート GPU で開かれると、DirectX グラフィックス カーネル サブシステム (Dxgkrnl.sys) は DxgkDdiGetStandardAllocationDriverData 関数を呼び出し、統合 GPU と同じバッキング ストア (大容量記憶装置) を使用して、ディスクリート GPU 上に新しいリソースを作成します。
  3. Direct3D ランタイムは、ディスクリート GPU のユーザー モード ディスプレイ ドライバーにプライベート ドライバー データを使用してクロス アダプター リソースを開くように指示します。
  4. DirectX アプリケーションは、ディスクリート GPU 上でバック バッファー リソースにレンダリングされます。 図の「Render」操作を参照してください。
  5. DirectX アプリケーションが、Present メソッドを呼び出すと、Direct3D ランタイムはディスクリート GPU のユーザー モード ドライバーの PresentDXGI (または pfnPresent) 関数を呼び出して、バック バッファーをクロス アダプター リソースにコピーします。 図の「Present」操作を参照してください。
  6. Windows グラフィックス デバイス インターフェイス (GDI) アプリケーションが、最上位ウィンドウにレンダリングされると、DirectX グラフィックス カーネル サブシステムは、統合 GPU のディスプレイ ミニポート ドライバーの DxgkDdiRenderKm 関数を呼び出し、クロス アダプター リソースがレンダー ターゲットであることを示します。 図の GDI アプリケーションとクロス アダプター サーフェスの間の接続を参照してください。
  7. DWM プロセスは、統合 GPU 内のクロス アダプター リソースを開き、構成時にソース テクスチャとして使用します。 図の「Composition」操作を参照してください。

直接反転プレゼンテーション モデル

Diagram illustrating the hybrid graphics direct flip model for rendering on a discrete GPU.

  1. Direct3D ランタイムは、ディスクリート GPU のユーザー モード ディスプレイ ドライバーに、スワップ チェーン サーフェスごとにクロス アダプター リソースを作成するように指示します。
  2. 直接反転モードが使用可能な場合、ディスクリート GPU は、Direct3D ランタイムが D3DDDI_ALLOCATIONINFO 構造体の Primary メンバーと VidPnSourceId メンバーを設定する場合があります。 これらのメンバー値は、pfnAllocateCb 関数が呼び出されたときに渡す必要があります。
  3. Direct3D ランタイムは、統合 GPU のユーザー モード ディスプレイ ドライバーに、DWM によって管理されることになるクロス アダプター リソースを開くように指示します。
  4. アプリケーションは、レンダー ターゲット テクスチャを保存先として使用して、ディスクリート GPU でレンダリングします。 図の「Render」操作を参照してください。
  5. アプリケーションが、Present メソッドを呼び出すと、Direct3D ランタイムはディスクリート GPU のユーザー モード ドライバーの BltDXGI (または pfnBlt) 関数を呼び出して、クロス アダプター リソースへのコピーを実行します。 ランタイムは、ディスクリート GPU のユーザー モード ドライバーの PresentDXGI (または pfnPresent) 関数を呼び出します。その際には、ソースをクロス アダプター リソースに設定し、保存先の割り当てを NULL に設定します。 図の「Copy」操作を参照してください。
  6. DWM は、統合 GPU のリソースを使用して、その構成を実行します。 直接反転操作が必要な場合 (DXGK_SEGMENTFLAGS.DirectFlip が設定されている)、DWM は、統合 GPU のディスプレイ ミニポート ドライバーに、1 つのクロス アダプターの割り当てから別の割り当てへの反転操作を実行するように指示します。 図の「DWM flip」操作を参照してください。

全画面表示モデル

  1. Direct3D ランタイムは、統合 GPU のユーザー モード ディスプレイ ドライバーに、スワップ チェーン サーフェスごとにクロス アダプター共有プライマリ割り当てを作成するように指示します。
  2. Direct3D ランタイムは、ディスクリート GPU のユーザー モード ディスプレイ ドライバーに、クロス アダプター リソースを開くように指示します。
  3. アプリケーションは、レンダー ターゲット テクスチャを保存先として使用して、ディスクリート GPU でレンダリングします。
  4. アプリケーションが、Present メソッドを呼び出すと、Direct3D ランタイムはディスクリート GPU のユーザー モード ディスプレイ ドライバーに、クロス アダプター リソースへのコピーを実行するように指示します。
  5. 統合 GPU のユーザー モード ディスプレイ ドライバーとディスプレイ ミニポート ドライバーは、このクロス アダプター リソースに反転するように指示されます。