次の方法で共有


WDDM 機能のカーネル モード テスト

この記事では、Windows 11 バージョン 24H2 (WDDM 3.2) で追加された WDDM のカーネル モード テスト インフラストラクチャの設計について説明します。 このインフラストラクチャにより、一部の NPU デバイスのドライバーなど、D3D ランタイムをサポートしていないドライバーのテストと検証が可能になります。 また、D3D ランタイムを使用せずに D3D ランタイムをサポートするドライバーを検証するためにも使用できます。

概要

WDDM または MCDM に基づく新しいコンピューティング デバイスが導入され、これらのデバイスのドライバーが D3D ランタイムをサポートしていないシナリオがあります。 このようなドライバーを検証するために、カーネル モード サンクのみを使用して検証を行う機能が Dxgkrnl に追加されます。つまり、D3D ランタイムとユーザー モード ドライバー (UMD) は関係ありません。

このインフラストラクチャでは、D3D ランタイムや UMD を経由することなく、正確な設定を使用して WDDM 機能をテストすることもできます。これにより、複雑化する可能性があります。

DDI は、特定のコマンド セットのカーネル モードでコマンド バッファーを構築するために導入されます。 コマンドは単純であるため、ほとんどの実行ノードはプリコンパイル済みシェーダーまたはその他の手段を使用して実行できる必要があります。

この機能をサポートするには、カーネル モード ドライバー (KMD) が次のサポートを提供する必要があります。

  • DXGK_FEATURE_KERNEL_MODE_TESTING機能が有効になっていることを報告します。
  • DXGKDDI_KERNELMODETESTINGINTERFACE機能インターフェイスを実装します。
  • テスト コマンド バッファーのビルドと実行をサポートする実行ノードに関する情報を提供します。
  • プライベート ドライバー データのないコンテキスト/ハードウェア キューの作成をサポートします。 通常、プライベート ドライバー コマンドの形式は、デバイスにワークロードを送信するために必要です。 テスト インターフェイスを使用すると、プライベート ドライバー データを使用せずにワークロードを送信できます。
  • pfnBuildTestCommandBuffer によって構築されたコマンド バッファーの実行を、この機能をサポートするデバイスの任意のノードでサポートします。
  • ページング DDI (TRANSFER、FILL など) で NULL 割り当てハンドルをサポートします。

この機能は、コンピューターで テスト署名 が有効になっている場合にのみ使用されます。

この機能を使用する HLK テストが開発されます。

DDI の変更内容

カーネル モード テストをサポートするために、次の構造体と列挙体が更新されました。

カーネル モード テストをサポートするために、次の DDI、構造体、および列挙型が追加されています。

カーネル モード テスト機能のレポートサポート

OS は KMD の DxgkDdiQueryFeatureSupport 追加された DXGK_FEATURE_KERNEL_MODE_TESTING 機能 ID を使用して関数を呼び出して、ドライバーがカーネル モード テストをサポートしているかどうかを確認します。 KMD は、この機能がサポートされていることを報告する必要があります。

次に、システムは同じ機能 ID で DxgkDdiQueryFeatureInterface を呼び出して、 pfnBuildTestCommandBuffer のインターフェイス関数ポインターを取得します。 KMD は、この関数を実装し、 DXGKDDI_KERNELMODETESTINGINTERFACE インターフェイスのポインターを提供する必要があります。

カーネル モード テストをサポートする実行ノードのレポート

SupportBuildTestCommandBufferDXGK_NODEMETADATA_FLAGS 構造体に追加されます。 KMD は、ノードが pfnBuildTestCommandBuffer によってビルドされたコマンド バッファーを実行できることを示すために、このフラグを設定する必要があります。 可能な限り多くのノードでこの機能をサポートすることをお勧めします。

プライベート データのないコンテキストの作成

TestContext は、コンテキストがテスト コンテキストであることを示すために、 DXGK_CREATECONTEXTFLAGS に追加されます。 このフラグは、テスト署名が有効になっている場合にのみ有効になります。

KMD の DxgkDdiCreateContext では、 pfnBuildTestCommandBuffer によって生成されたコマンド バッファーの実行をサポートするすべてのノードに対して、プライベート データのないコンテキストの作成をサポートする必要があります。 このサポートを示すには、コンテキストの作成時に FlagsTestContext フラグを設定します。

ドライバーのプライベート データのないハードウェア キューの作成

TestQueue は、ハードウェア キューがテスト キューであることを示すために、 D3DDDI_CREATEHWQUEUEFLAGS に追加されます。 このフラグは、テスト署名が有効になっている場合にのみ有効になります。

KMD の DxgkDdiCreateHwQueue は、ドライバーのプライベート データのないハードウェア キューの作成をサポートする必要があります。

コマンド バッファーのビルド

KMD の pfnBuildTestCommandBuffer は、一連の単純なコマンドのデバイス固有の命令を含むコマンド バッファーを構築します。 KMD は、 DxgkDdiQueryFeatureInterface(DXGK_FEATURE_KERNEL_MODE_TESTING) からこの関数へのポインターを返します。

1 つのテスト コマンドが pfnBuildTestCommandBuffer に送信されます。 現在、次のコマンドがサポートされています。

command 説明
D3DDDI_TESTCOMMAND_COPY ソースと宛先の GPU 仮想アドレスを使用してバイトをコピーします。
D3DDDI_TESTCOMMANDBUFFER_FILL メモリ位置にパターンを入力します。

テスト コマンドは、GPU 仮想アドレスの使用に基づいています。 OS では、D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAPまたはD3DKMT_STANDARDALLOCATIONTYPE_INTERNALBACKINGSTORE標準の割り当てタイプで作成された割り当てに GPU の CA がマップされることを保証します。

生成されたコマンド バッファーとプライベート データは、ユーザー モードに戻されます。 コマンド バッファーが実行のために送信されると、呼び出しはユーザー モードから送信されます。 悪意のあるアプリケーションは、バッファーとプライベート データの内容を変更する可能性があります。 バグチェックを回避するために、コマンド バッファーとプライベート ドライバー データの両方を検証するのは KMD の責任です。

生成されたコマンド バッファーに特権命令を含めることはできません。

ユーザー モード クライアント ドライバー (Cuda など) は、 D3DKMTSubmitCommand または D3DKMTSubmitCommandToHwQueue を使用して、生成されたコマンド バッファーを実行用に送信します。 今後、バッファーの内容はユーザー モードの送信の一部として送信されます。

生成されたコマンド バッファーが実行のために送信されると、コマンド バッファーに 1 つのテスト コマンドのデバイス命令が含まれていることが保証されます。

生成されたコマンド バッファーは、pfnBuildTestCommandBuffer に渡されるhContextに対応するノードに送信されます。

DMA バッファー (pDmaBuffer) のサイズは 4 KB に制限され、DMA プライベート ドライバー データ (pDmaBufferPrivateData) のサイズは 1 KB に制限されます。