次の方法で共有


リソースの作成および破棄の処理

Microsoft DirectX グラフィックス カーネル サブシステムがリソースの有効期間を適切に追跡し、オペレーティング システムのメモリ リークを防ぐには、ユーザー モードディスプレイ ドライバーがリソースを適切に作成して破棄する必要があります。

Microsoft Direct3D ランタイムは、次のユーザー モード ディスプレイ ドライバー関数を呼び出して、ユーザー モード リソースを作成します。

  • CreateResource は、新しい共有リソースまたは共有されていないリソースを作成します。

  • OpenResource は、既存の共有リソースに対してビューを開きます。

どちらの呼び出しでも、Direct3D ランタイムは、ユーザー モード ディスプレイ ドライバーがランタイムへのコールバックに使用する一意 のユーザー モード ランタイム リソース ハンドル を渡します。 CreateResourceまたはOpenResource、ユーザー モード ディスプレイ ドライバーは、リソースを表す一意のユーザー モード ハンドルを返します。 このハンドルは、 ユーザー モード ドライバーのリソース ハンドルです。 ランタイムは、後続のドライバー呼び出しでユーザー モード ドライバー リソース ハンドルを使用します。

ユーザー モード ランタイム リソース ハンドルとユーザー モード ドライバー リソース ハンドルの間には、1 対 1 の対応が存在します。 Direct3D ランタイムとユーザー モード ディスプレイ ドライバーは、D3DDDIARG_CREATERESOURCEおよびD3DDDIARG_OPENRESOURCE構造体hResourceメンバーを介して、ユーザー モード ランタイムとドライバー リソース ハンドルを交換します。

ユーザー モード ディスプレイ ドライバーが Direct3D ランタイムの pfnAllocateCb 関数を呼び出してユーザー モード リソースの割り当てを作成する場合、ドライバーは pData パラメーターが指す D3DDDICB_ALLOCATE 構造体 hResource メンバーでユーザー モード ランタイム リソース ハンドルを指定する必要があります。 Direct3D ランタイムは、リソースに一意のカーネル モード ハンドルを生成し、D3DDDICB_ALLOCATEの hKMResource メンバーの ユーザー モード ディスプレイ ドライバーに渡します。 ユーザー モードディスプレイ ドライバーは、後で使用するディスプレイ ミニポート ドライバーのコマンド ストリームにカーネル モード リソース ハンドルを挿入できます。

注: ユーザー モード リソース ハンドルは、ユーザー モード リソースの作成ごとに常に一意ですが、カーネル モードのリソース ハンドルは常に一意とは限りません。 Direct3D ランタイムがユーザー モード ディスプレイ ドライバーの OpenResource 関数を呼び出してビューを既存の共有リソースに開くと、ランタイムは pResource パラメーターが指す D3DDDIARG_OPENRESOURCE 構造体の hKMResource メンバーでリソースのカーネル モード ハンドルを渡します。 ランタイムは、ユーザー モード ディスプレイ ドライバーの CreateResource 関数と呼ばれるランタイムの後に、このカーネル モード ハンドルを以前に作成しました。

CreateResource または OpenResource によって作成されたユーザー モード リソースを破棄するために、Direct3D ランタイムは、ユーザー モード ディスプレイ ドライバーの DestroyResource 関数の呼び出しで、hResource パラメーターのユーザー モード ドライバー リソースハンドルを渡します。 カーネル モード リソース ハンドルおよびユーザー モード リソースに関連付けられているすべての割り当てを解放するために、ユーザー モード ディスプレイ ドライバーは、pData パラメーターが pfnDeallocateCb 関数の呼び出しで指すD3DDDICB_DEALLOCATE 構造体の hResource メンバーでユーザー モード ランタイム リソース ハンドルを渡します。

ユーザー モード ディスプレイ ドライバーがリソースを作成および破棄する場合は、次の項目を考慮してください。

  • 共有リソースに応答してユーザー モード ディスプレイ ドライバーが作成する割り当て (つまり、D3DDDIARG_CREATERESOURCEFlagsメンバーで設定された SharedResource ビット フィールド フラグを使用した CreateResource 呼び出しへの応答) の場合、ドライバーは、D3DDDICB_ALLOCATEhResource メンバーに NULL 以外の値を割り当てる必要があります。

  • ユーザー モード ディスプレイ ドライバーが共有されていないリソースに応答して作成する割り当ての場合、ドライバーは、D3DDDICB_ALLOCATEの hResourceメンバーに NULL 以外 の値を 割り当てる必要はありません。 ドライバーが hResource に NULL割り当てる場合、割り当ては、特定のリソース (およびカーネル モードのリソース ハンドル) ではなく、デバイスに関連付けられます。 ただし、割り当てがリソースに本当に関連している場合、ドライバーは割り当てをそのリソースに関連付ける必要があります。 注: カーネル モード リソース ハンドルは、ユーザー モードのディスプレイ ドライバーが、createResource の呼び出しでD3DDDIARG_CREATERESOURCE構造体の hResource メンバーから ドライバーが受信したユーザー モード ランタイム リソース ハンドルにD3DDDICB_ALLOCATE hResourceメンバー設定する場合にのみ作成されます

  • 非共有ユーザー モード リソースを破棄するために DestroyResource が呼び出されると、ユーザー モード ディスプレイ ドライバーは、 ドライバーがリソースに割り当てを関連付けなかった場合にのみ、D3DDDICB_DEALLOCATEの hResourceメンバー をNULLに 設定して pfnDeallocateCb を呼び出す ことが できます。 ユーザー モード ディスプレイ ドライバーがリソースに割り当てに関連付けられている場合、ドライバーは、D3DDDICB_DEALLOCATEの hResource メンバーを NULL 以外 の値に設定して pfnDeallocateCbを呼び出す 必要があります。それ以外の場合は、メモリ リークが発生します。