次の方法で共有


サーフェス メモリの要求と使用

ユーザー モード ディスプレイ ドライバーは、Microsoft Direct3D ランタイムがサーフェスのリストを作成する必要がある場合に、CreateResource 関数の呼び出しを受け取ります。 Direct3D ランタイムは、ユーザー モード ディスプレイ ドライバーがランタイムにコールバックするために使用するサーフェスのリストへのリソース ハンドルを指定します。 ユーザー モード ディスプレイ ドライバーは、サーフェスのリストを表すリソース オブジェクトを作成し、このオブジェクトに対して一意のハンドルを生成して、Direct3D ランタイムにハンドルを返します。 ランタイムは、後続のドライバー呼び出しでこの一意のハンドルを使用し、サーフェスのリストを識別します。 ランタイムは、D3DDDIARG_CREATERESOURCE 構造体の pSurfList メンバーに含まれる配列内のサーフェスのインデックスを指定することで、特定のサーフェスを識別します。

ユーザー モード ディスプレイ ドライバーは、リソースを参照する呼び出しでドライバー定義のリソース ハンドルを受け取るため、ドライバーがドライバー定義のリソース オブジェクトを見つけるためにコストのかかるハンドル参照を実行する必要はありません。 同様に、ランタイムがハンドル参照を実行する必要もないように、ユーザー モード ディスプレイ ドライバーは、ユーザー モード ディスプレイ ドライバーがランタイムにコールバックするときに、Direct3D ランタイム定義のリソース ハンドルを使用します。

ユーザー モード ディスプレイ ドライバーは、pfnAllocateCb 関数を呼び出して、サーフェスのメモリを割り当てます。 pfnAllocateCb 呼び出しでは、ユーザー モード ディスプレイ ドライバーは、サーフェスのリストと、D3DDDICB_ALLOCATE 構造体と D3DDDI_ALLOCATIONINFO 構造体の pPrivateDriverData メンバー内のサーフェスにプライベート データを個々に渡すことができます。 ただし、ユーザー モード ディスプレイ ドライバーは、pPrivateDriverData メンバーからプライベート データを受け取ることはできません。 ユーザー モード ディスプレイ ドライバーは、このプライベート データのメモリを割り当てることができ、pfnAllocateCb 呼び出しが返された後にメモリを解放するか、スタック メモリを使用してこのプライベート データを渡すことができます。 pfnAllocateCb 関数は、割り当てられた各サーフェスの割り当てごとにハンドルをユーザー モード ディスプレイ ドライバーに返します。

ユーザー モード ディスプレイ ドライバーは、各デバイスの共有サーフェスごとに pfnAllocateCb 関数を呼び出す必要があります。 たとえば、デバイス 1 でデバイス 2、3、4 でも使用される共有サーフェスを作成する場合、デバイス 2、3、4 は、割り当てハンドルを取得するために共有サーフェスに対して pfnAllocateCb を 1 回呼び出す必要があります。

ユーザー モード ディスプレイ ドライバーは通常、サーフェスから割り当てハンドルへのテーブルを維持することで、各サーフェスを各割当てハンドルまで追跡する必要があります。 ユーザー モード ディスプレイ ドライバーは、ドライバー定義のリソース オブジェクト内の各割り当てハンドルを格納する必要があります。

Direct3D ランタイムが以前に割り当てられたサーフェス (たとえば、ユーザー モード ディスプレイ ドライバーの Blt 関数の呼び出し) に対して操作を実行すると、ユーザー モード ディスプレイ ドライバーはリソースへのハンドルを受け取ります (サーフェス インデックスを使用する場合もあります)。 ユーザー モード ディスプレイ ドライバーは、このリソース ハンドルを使用して、ドライバー定義のリソース オブジェクトを取得します。 ドライバーは、リソース オブジェクトに格納されている割り当てハンドルを取得し、コマンド バッファーでそれらをアセンブルします。 ユーザー モード ディスプレイ ドライバーは、pfnRenderCb 関数を呼び出してディスプレイ ミニポート ドライバーにコマンド バッファーを送信するときに、サーフェスに対応する割り当てハンドルを使用します。 ディスプレイ ミニポート ドライバーは、DxgkCbGetHandleData 関数を呼び出して、ユーザー モード ディスプレイ ドライバーが参照するサーフェス割り当てを判断できます。