クロスアダプター リソース スキャンアウトのサポート (CASO)
CASO 前のパフォーマンス (2 コピー パス)
Windows 8.1 (WDDM 1.3) 以降、D3D9 および DXGI アプリケーションでは、ハイブリッド システムなどのマルチアダプター構成でクロスアダプター プレゼンテーション のサポートを使用できました。 このサポートにより、レンダリングはレンダー アダプター (通常は個別の GPU) で実行され、ディスプレイにスキャンアウトするためにディスプレイ アダプター (通常は統合 GPU) にコンテンツを取得するために 2 つのコピーが実行されます。
- コピー 1 は、レンダー アダプター リソースからクロスアダプター リソースへのコピーです。
- コピー 2 は、クロスアダプター リソースからディスプレイ アダプター リソースへのコピーです。
これらのコピーにより、特に待ち時間が短い場合に最適化されたアプリでは、アプリのパフォーマンスが制限される可能性があります。
CASO を使用したフリップ プレゼンテーション モデルの最適化 (1 コピー パス)
Windows Server 2022 (WDDM 2.9) 以降のドライバーでは、適切なクロスアダプター リソース層のサポートを宣言できるため、システムのプレゼンテーション スタックでクロスアダプター プレゼンテーションを最適化できます。 ドライバーは、デバイスの構成に関係なく、独自のアダプター機能に基づいてこの機能のサポートを宣言する必要があります。これにより、機能の値は、該当するすべてのハードウェア構成でスケーリングされます。 このスケーリングには、他の外部 GPU を動的にアタッチする 1 つの GPU デバイスが含まれますが、これに限定されません。
ディスプレイ アダプターが CASO をサポートしている場合、システムはレンダー アダプター サーフェイスからクロス アダプター サーフェイスへの最初のコピーのみを実行し、その後、クロスアダプター サーフェイスから直接スキャンアウトします。 この機能により、処理、帯域幅、電力、待機時間が削減されます。
CASO 機能は、フリップ プレゼンテーション モデルの DXGI ランタイム用に実装されます。
CASO の DDI の変更と追加
クロスアダプター リソースの階層のサポートを示す
DXGI では、クロスアダプター リソースに対して次の 3 つの層のサポートが実装されています。
- クロスアダプター リソースとの間でのコピー (最下位層)
- クロスアダプター リソースからのテクスチャリング
- クロスアダプター リソースのスキャンアウト (最上位層)
より高い層の各サポートでは、その下位層のサポートを保証する必要があります。 たとえば、クロスアダプター リソースのスキャン アウトのサポートを要求するには、ドライバーもテクスチャリングとコピーをサポートする必要があります。
ドライバーは、DXGK_DRIVERCAPS.MemoryManagementCaps で次のDXGK_VIDMMCAPS ビット フィールド値を設定することで、各層の サポートを宣言します。
レベル | 階層の意味 | DXGK_VIDMMCAPS 値 |
---|---|---|
第 1 層 | コピーのサポート: クロスアダプター リソースとの間でコピーする | CrossAdapterResource (D3DKMT_WDDM_1_3_CAPS の SupportCrossAdapterResource ビットを介してグラフィックス カーネルによってユーザー モードに公開されます) |
階層 2 | テクスチャのサポート: クロスアダプター リソースからのテクスチャ | CrossAdapterResourceTexture (シェーダー リソース ビュー、順序なしアクセス ビュー、レンダー ターゲットのサポートを含む) |
階層 3 | CASO のサポート: クロスアダプター リソースからのスキャンアウト | CrossAdapterResourceScanout |
グラフィックス カーネルは、3 つの層のスーパーセット方式でサポートが示されていない場合、アダプターの起動に失敗します。 たとえば、CrossAdapterResourceTexture が設定されている場合は、CrossAdapterResource を設定する必要があります。
階層 1 のサポート要件
クロスアダプター リソースは、WDDM 1.3 階層 1 のコピー のサポートで使用されるのと同じように定義されます。
階層 2 のサポート要件
要件は、D3D12 ユーザー モード ドライバー CrossAdapterRowMajorTextureSupported 機能 (cap) に似ています。つまり、デバイスはシェーダー リソース ビュー、順序なしアクセス ビュー、クロスアダプターの行優先テクスチャのレンダー ターゲット ビューをサポートします。 ただし、D3D12 の CrossAdapterRowMajorTextureSupported では関連するすべてのテクスチャ形式のサポートが必要ですが、この階層 2 の上限では、少なくとも階層 3 のサポート要件に記載されている DisplayScanOut 形式のサポートのみが必要です。
D3D12 の上限はこの階層 2 の上限のスーパーセットであるため、D3D12CreateDevice は、CrossAdapterRowMajorTextureSupported キャップが設定されている場合にカーネル ドライバーの CrossAdapterResourceTexture キャップが設定されていることを確認し、設定されていない場合はデバイスの作成に失敗します。
階層 3 のサポート要件
システムは、次の最小仕様のクロスアダプター リソースに対して、DXGK_FLIPCAPS でドライバーによって宣言されているように、サポートされている反転機能を実行できる必要があります。
- クロスアダプターのプライマリ バッファー サイズが 1920 x 1080 以下
- サポートされている DisplayScanOut 形式のバッファー ピクセル形式。 Windows 10 バージョン 20H1 の時点では、次の形式が使用されています。
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
ドライバーが、より多くのテクスチャ形式のクロスアダプター リソースのスキャンをサポートしている場合は、階層のサポート要件に従って、それらの形式からのテクスチャリングもサポートする必要があります。
Note
DXGI ランタイムは、ドライバーに対して CrossAdapterResourceScanout のサポートを照会します。 サポートされている場合、プレゼンテーション スタックは 1 コピー パスの下に配置されます。 そのため、DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI をサポートするには、CrossAdapterResourceScanout のサポートを宣言するドライバーが必要です。 さらに、上記の最小仕様のクロスアダプター プライマリーに関連するすべてのプレゼンテーション関連 DDI もサポートする必要があります。 たとえば、pfnCreateResource、pfnCheckMultiplaneOverlaySupport、pfnPresentMultiplaneOverlay/pfnPresent1 などです。 詳細については、「マルチプレーン オーバーレイのサポート」を参照してください。 CASO から抜け出す方法の詳細については、「プレゼンテーションの最適化のためのドライバー DDI」を参照してください。
どちらの階層にも、検証用の HLK テストが付属しています。
DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 の StaticCheck フラグのサポート
StaticCheck フラグが WDDM 3.0 の DXGK_MULTIPLANE_OVERLAY_FLAGS に追加されました。 このフラグにより、CASO サポート用の DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI の使用が拡張されます。 このフラグを使用すると、DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 はドライバーにクエリを実行して、StaticCheck フラグでマークされたプレーンがスキャンアウトできるかどうかを判断できます。この呼び出しは 1 回限りの呼び出しであり、実際のプレゼンテーションの動作には影響しません。 そのため、DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 から現在の情報のキャッシュを実行するドライバーには、StaticCheck プレーンを使用した DDI 呼び出しからの情報を含めることはできません。 スタンドアロンまたは静的な方法でサポートの決定を実行する必要があります。
StaticCheck フラグを設定した DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 は、次の場合に保証されます。
- フラグでマークされたプレーンを 1 つだけ持つ
- PostComposition プレーン情報を含まない
StaticCheck フラグが設定された DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 の呼び出しは、スワップチェーンの作成時や ResizeBuffers などのバッファーの作成時に DXGI のアプリ プロセスから使用され、CASO が現在のハードウェア構成でサポートされているかどうかを判断するためのベスト エフォート試行として使用されます。
HybridIntegrated 特殊なケース
HybridIntegrated ドライバーは、階層 3 のスキャンアウト サポートを持つよう設計されていることに注意してください。 WDDM 3.0 以降では、HybridIntegrated ドライバーが CrossAdapterResourceScanout のサポートを宣言する必要があります。 HLK テストでは、この要件が検証されます。
既存のハイブリッド キャップは、今後非推奨と見なされる可能性があります。 そのため、CrossAdapterResourceScanout キャップを切り離して、この領域をより柔軟に進化できるようにすることが重要です。 そのため、HybridIntegrated ではないドライバーでも、必要に応じてクロスアダプター サポート層を設定できます。
グラフィックス カーネルの変更
WDDM 2.9 以降では、クロスアダプター リソースのサポートに対して次の追加/変更が行われました。
KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT 値が既存の KMTQUERYADAPTERINFOTYPE 列挙型に追加されました
D3DKMT_CROSSADAPTERRESOURCE_SUPPORT 構造体と D3DKMT_CROSSADAPTERRESOURCE_SUPPORT_TIER 列挙体が追加されました
使用例:
D3DKMT_CROSSADAPTERRESOURCE_SUPPORT KernelSupport = {};
D3DKMT_QUERYADAPTERINFO QueryAdapterInfo;
QueryAdapterInfo.hAdapter = m_hAdapter;
QueryAdapterInfo.Type = KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT;
QueryAdapterInfo.pPrivateDriverData = &KernelSupport;
QueryAdapterInfo.PrivateDriverDataSize = sizeof( KernelSupport );
VERIFY_SUCCEEDED(D3DKMTQueryAdapterInfo(&QueryAdapterInfo));
// Use KernelSupport.SupportTier as appropriate
プレゼンテーションの最適化のためのドライバー DDI
ドライバーは、次の DDI を使用して、クロスアダプター スキャンアウトがサポートされているかどうかを示します。
DXGK_VIDMMCAPS::CrossAdapterResourceScanout キャップ
システムはこのキャップを早期に照会して、ドライバーが CASO 機能をサポートしているかどうかを判断します。
ドライバーが CASO をサポートしている場合、DXGI は 1 コピーの CASO パスを続行します。それ以外の場合、DXGI は 2 コピー パスにフォールバックします。
-
DXGI は、1 コピーの CASO パスで、pfnCreateResource を使用して 、クロスアダプター リソースをディスプレイ アダプターのプライマリとして作成します。 ドライバーは、そのリソースからスキャンアウトできるかどうかをリソースのプロパティに基づいて評価する必要があります。
ドライバーがリソースのプロパティに基づいてスキャンアウトをサポートしている場合、DXGI は 1 コピー CASO パスを続行します。 それ以外の場合、ドライバーは、DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT を返すことによってスキャンアウトをオプトアウトする必要があります。 この場合、DXGI は 2 コピー パスにフォールバックします。 このフォールバックは、リソース プロパティが階層 3 のサポート要件に記載されている最小要件を超えている場合にのみ発生する必要があります。
pfnCheckMultiplaneOverlaySupport DDI
現在の動作ごとに、デスクトップ ウィンドウ マネージャー (DWM) はディスプレイ ドライバーの pfnCheckMultiplaneOverlaySupport DDI を呼び出して、プライマリ サーフェスをスキャンアウトできるかどうかを正確に判断します。ドライバーでサポートされている場合は、スキャンアウトが発生します。 それ以外の場合、DWM は DWM コンポジション モードにフォールバックします。
DWM で構成されるプレゼンテーションは、2 コピー パスを介した独立フリップ (iFlip) または 1 コピー CASO パス経由の iFlip よりも望ましくない可能性があることに注意してください。 そのため、回転ディスプレイや複数のディスプレイなど、プレゼンテーション帯域幅が制限される一般的な表示シナリオがあり、ドライバーが DWM で pfnCheckMultiplaneOverlaySupport のサポートに一貫して失敗する可能性があり、その結果、2 コピー パスよりもエクスペリエンスが低下する可能性があります。
負のフォールバック エクスペリエンスを軽減するために、DXGI はバッファー作成時に pfnCheckMultiplaneOverlaySupport をクロスアダプター リソースで StaticCheck フラグでマークされたプレーンとして呼び出し、ドライバーが既存の既知の帯域幅特性を考慮してスキャンアウトを実行できるかどうかを高い精度で検証します。 サポートされている場合、DXGI は 1 コピー CASO パスを続行します。それ以外の場合は、2 コピー パスにフォールバックします。
HLK テスト
WDDM 3.0 HLK の要件および機能、対応する HLK テストが追加されました。 この要件は、ドライバーが宣言できる DXGK_VIDMMCAPS サポート (具体的には CrossAdapterResourceTexture と CrossAdapterResourceScanout) に関連付けられています。
CrossAdapterResourceTexture
クロスアダプター リソースに対するシェーダー リソース ビュー (SRV) 操作を確認するための HLK テストが追加されました。
D3D12 の場合、Device.Graphics.AdapterRender.D3D12Core.CoreRequirement テスト用の既存の HLK "D3D12 - クロス アダプター リソース DX12" が追加されました。具体的には、CrossAdapterResource::CrossAdapterTextureSRV テスト ケースです。
この HLK テスト ケースに追加されたのは、CrossAdapterResourceTexture KMD キャップと D3D12 UMD CrossAdapterRowMajorTextureSupported キャップの間のスーパーセット関係の検証です。 同様に、ロジックが D3D12CreateDevice に追加され、UMD キャップが設定されている場合は、カーネル層 2 ドライバー キャップも設定する必要があり、設定されていない場合はデバイスの作成に失敗します。
D3D11 の場合、上記のテスト ケースが HLK test for Device.Graphics.WDDM30.Render.CrossAdapterScanOut の HLK テストに追加されました。具体的には、D3DConf_11_CrossAdapterResource::CrossAdapterResourceSRV です。
クロスアダプター リソースのスキャンアウト
次の HLK テストが追加されました。
Device.Graphics.WDDM30.Render.CrossAdapterScanOut
- ドライバーが、DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT フラグを使用してスキャンアウト動作をオプトアウトすることなく、クロスアダプター プライマリ リソースを正常に作成できることを確認する HLK テスト。
- これらのドライバーが DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI をサポートしていることを確認する HLK テスト。
- テスト担当者が手動で確認するための手動 HLK テスト:
- スキャンアウトされたクロスアダプターサーフェスには、視覚的な破損/アーティファクトや予期しない引き裂きが発生しない
- クロスアダプター サーフェスは、内部変換やコピーを行わずに直接スキャンされます。
これらのエンド ツー エンド テストでは、CheckMultiplaneOverlaySupport と Present DDI がクロスアダプター リソースでサポートされていることも自然に確認されます。 手動テスト アプリには、高解像度や高リフレッシュ レート モニターなど、いくつかの特定のハードウェア要件があります。 詳細については、テストに付属するリファレンス ドキュメントを参照してください。
Device.Graphics.WDDM30.Render.CoreRequirement
- HybridIntegrated キャップを宣言するドライバーが CrossAdapterResourceScanout キャップも宣言していることを確認する HLK テスト。
System.Fundamentals.Graphics.HybridGraphics.MultiGPU
- OEM がエンド ツー エンドのシステム検証の一環として DXGI のワンコピー パスを実行できるハイブリッド デバイスで、これらのテストを実行できるようにするシステム ベースの HLK テスト。