KMD とのバッキング ストアの共有
Windows 11 バージョン 22H2 (WDDM 3.1) 以降では、WDDM が拡張され、カーネル モード ドライバー (KMD) からグラフィックス割り当てバッキング ストアにアクセスできるようになりました。 バッキング ストアとは、グラフィックス割り当ての内容がビデオ メモリに常駐していない場合に、その内容を保持するコミットされたメモリ バッファーのことです。
この機能により、ユーザー モード ドライバー (UMD) と KMD の両方が同じ割り当てメモリにアクセスできるようになります。 この機能は、ホストまたは GPU 準仮想化 (GPU-PV) を使用して仮想マシンで UMD が実行されている場合に使用できます。
この機能は、Windows 10 バージョン 20H1 にバックポートされていました。 DDI は、WDDM 3.1 以降のドライバーで使用できます。
WDDM グラフィックスの割り当てとバッキング ストア
WDDM モデル内のすべてのグラフィックス割り当てには、バッキング ストアがあります。 グラフィックス割り当ては、UMD が Dxgkrnl の D3DKMTCreateAllocation 関数を呼び出すと作成されます。 UMD は、この割り当てのプライベート データを渡します。Dxgkrnl は、DxgkddiCreateAllocation の呼び出しを通じて KMD に渡します。 KMD は、目的の割り当てフラグを Dxgkrnl に返します。
機能の可用性の確認
バッキング ストア共有機能を使用できるかどうかをチェックするには、KMD はまず、FeatureId が DXGK_FEATURE_SHARE_BACKING_STORE_WITH_KMD に設定された次のいずれかのコールバックを呼び出す必要があります。
- DXGKCB_QUERYFEATURESUPPORT (WDDM 2.9 以降で使用可能)
- DXGKCB_ISFEATUREENABLED
この機能は、コールバックが成功し 、[有効] が TRUE に設定されている場合にのみ使用できます。
機能のフロー
機能が有効であることが KMD によって正常に判断されると、UMD は D3DKMTCreateAllocation を呼び出して CPU から可視的な共有割り当てを作成し、プライベート データを通じてこの割り当てを KMD と共有する必要があることを KMD に指示します。 …この呼び出しの過程で、次の処理が行われます。
KMD は、OS が KMD の DxgkddiCreateAllocation コールバックを呼び出すときに、DXGK_ALLOCATIONINFOFLAGS2 の ShareBackingStoreWithKmd フラグを設定します。 この機能が有効になっていない場合は、KMD が ShareBackingStoreWithKmd フラグを設定しないようにしてください。
Dxgkrnl は、DXGKDDI_SETALLOCATIONBACKINGSTORE DDI を呼び出して、KMD にカーネル モード アドレスを割り当てバッキング ストアに提供します。
UMD は D3DKMTLock2 を呼び出して、割り当てのユーザー モード アドレスを取得します。
割り当てのプロパティ
この方法で作成される割り当てには、次のプロパティが必要です。
- 割り当ては、システム メモリ セグメント内でのみ許可されます。
- 割り当ては共有として作成する必要があります。
- 割り当てでは、バッキング ストアとして既存のシステム メモリを使用できません。
- UMD は、通常の割り当てに関して任意の操作を実行できます。
- UMD は D3DKMTLock2 を呼び出して、割り当てへのポインターを取得できます。
- UMD は D3DKMTMakeResident を呼び出して、割り当てを GPU からアクセスできるようにします。