次の方法で共有


PFND3DDDI_CREATERESOURCE2 コールバック関数 (d3dumddi.h)

リソースを作成します。 Windows ディスプレイ ドライバー モデル (WDDM) 1.2 以降のユーザー モード ディスプレイ ドライバーによって実装されます。

構文

PFND3DDDI_CREATERESOURCE2 Pfnd3dddiCreateresource2;

HRESULT Pfnd3dddiCreateresource2(
  [in] HANDLE hDevice,
       D3DDDIARG_CREATERESOURCE2 *unnamedParam2
)
{...}

パラメーター

[in] hDevice

リソースの作成に使用されるディスプレイ デバイス (グラフィックス コンテキスト) へのハンドル。

unnamedParam2

pResource2 [in, out]

作成されるリソースを記述する D3DDDIARG_CREATERESOURCE2 構造体へのポインター。

戻り値

S_OK または適切なエラー結果を返します。 WDDM 1.3 以降の Direct3D レベル 9 ドライバーは、次のエラー コードを返す必要があります。

リターン コード 説明
E_INVALIDARG D3DDDIARG_CREATERESOURCE2.Flagsmember には CaptureBuffer フラグ値が設定されており、リソースがドライバーでサポートできる値を超えています。

備考

CreateResource2 呼び出しには、サーフェスの一覧を含めることができます。 pResource2 パラメーターで指定された D3DDDIARG_CREATERESOURCE2 構造体の SurfCount メンバーは、作成するサーフェスの数 (MIP マップ レベルを含む) を指定します。 たとえば、256 x 256 x 9 のテクスチャ MIP マップ リソースには、SurfCount メンバーと MIP マップ レベルの数の両方が 9 に設定されている 9 つのサーフェスの一覧が含まれています。 9 つの MIP マップ レベルを含むキューブ マップでは、MIP マップ レベルの数を 9 に設定し、SurfCount 54 に設定する必要があります。 3 サーフェス スワップ チェーンでは、SurfCount を 3 に設定し、MIP マップ レベルの数を 0 に設定する必要があります。 MIP マップ レベルの数は、SurfCountの値以下であることに注意してください。

CreateResource2 呼び出しに応答して、ユーザー モードディスプレイ ドライバーは、pfnAllocateCb 関数を呼び出して、1 つ以上のメモリ割り当てを作成できます。 ユーザー モード ディスプレイ ドライバーは、サーフェスごとに複数の割り当てを作成する必要があるか、すべてのサーフェスに対して 1 つの割り当てを作成するか、サーフェスごとに 1 つの割り当てを作成する必要があるかを判断する必要があります。 割り当ての詳細については、「ビデオ メモリ管理と GPU スケジューリング」を参照してください。

ドライバーの CreateResource2 関数は、pfnAllocateCb を呼び出してから戻る必要はありません。代わりに、ドライバーは割り当ての作成を延期できます。
 
リソースの割り当てが pfnAllocateCb を 1 回の呼び出しでアトミックに行う場合にのみ、リソース共有できます。
 
D3DDDIARG_CREATERESOURCE2 構造体の hResource メンバーは、リソースを識別するために使用されるハンドルです。 ユーザー モード ディスプレイ ドライバーは、CreateResource2 呼び出しで渡された hResource の値 格納し、CreateResource2 呼び出しが返されたときに Microsoft Direct3D ランタイムが使用できる別の値で値を上書きする必要があります。 つまり、ランタイムの呼び出しでは、ユーザー モード ディスプレイ ドライバーは、CreateResource2 に渡された hResource使用します。ユーザー モード ディスプレイ ドライバーの呼び出し (たとえば、SetTexture または SetStreamSource 関数 呼び出し) では、ランタイムは CreateResource2 から返された hResource使用します。 各サーフェスには明示的なハンドルは存在しないことに注意してください。サーフェスを個別に参照する必要がある場合 (Blt 関数の呼び出しなど)、ハンドルとインデックスによって参照されます。 インデックスは、リソース内のサーフェスを識別します。 インデックスは、D3DDDIARG_CREATERESOURCE2のメンバーである pSurfList に含まれる配列内のサーフェス インデックスと同じです。

リソースは、複数のデバイス (hDevice) とプロセスで共有できます。 ランタイムは、D3DDDIARG_CREATERESOURCE2Flags メンバーで SharedResource ビット フィールド フラグを設定することによって、リソースを共有することを指定します。 このビット フィールド フラグが設定されている場合、ユーザー モード ディスプレイ ドライバーは、共有リソースに対する次の制限に従う必要があります。

  • ユーザー モード ディスプレイ ドライバーは、pfnAllocateCb を呼び出し、pfnDeallocateCb 関数をそれぞれ 1 回だけ実行できます。
  • ユーザー モードのディスプレイ ドライバーは、リソースが最初に作成された後にリソースの追加の割り当てを作成することはできません。同様に、リソース自体が破棄された時点でのみリソースの割り当てを破棄できます。
  • ユーザー モード ディスプレイ ドライバーの DestroyResource 関数が、ドライバーの CreateResource2 または OpenResource 関数の呼び出しによって作成または開かれた共有リソースに対して呼び出 場合、 D3DDDICB_DEALLOCATE 構造体の hResource メンバーを NULL 以外に設定し、pfnDeallocateCb 関数の呼び出しで、D3DDDICB_DEALLOCATENumAllocations メンバーを 0 に設定する必要があります。リソースを破棄または閉じます。 つまり、共有リソースに関連付けられている割り当てを個別に破棄したり閉じたりすることはできません。pfnDeallocateCb する 1 回の呼び出しで、リソースを破棄またはアトミックに閉じる必要があります。
  • 割り当ての数は、リソースの種類に対して一貫している必要があります (つまり、同じリソースの種類を作成する別のプロセスでは、同じ数と種類の割り当てを生成する必要があります)。 さらに、これらのリソースの名前変更は許可されません。
D3DDDI_RESOURCEFLAGS2 構造体で指定されたビット フィールド フラグは、D3DDDIARG_CREATERESOURCE2Flags メンバーで渡されます。
注意 フラグを指定せずにリソースを作成できます。 このようなリソースに関連付けられているサーフェスはロックされる可能性があり、ビット ブロック転送 (bitblt) 操作ではソースまたは宛先にすることができます。 ただし、このようなサーフェスは他の用途には使用できません。
 
Plain サーフェスは、テクスチャ またはプライマリ ビット フィールド フラグがないため、テクスチャまたはスタンドアロン レンダー ターゲット 区別されます。 たとえば、Primary ビット フィールド フラグが存在すると、スタンドアロンのレンダー ターゲットが示され、このフラグが存在しない場合は、バック バッファーであるレンダー ターゲットが示されます。
 
ランタイムに対する変更によって既存のドライバーが破損しないようにするために、ドライバーは、CreateResource2 関数の呼び出しで、D3DDDIARG_CREATERESOURCE2 構造体の次の予約済みメンバーを使用してドライバーの動作に影響を与えてはなりません。
  • Flags メンバーの未定義ビットが予約されています。
  • Primary ビット フィールド フラグが Flagsで設定されていない場合、RefreshRateOutput メンバーが予約されます。
  • RenderTargetDecodeRenderTarget、または VideoProcessRenderTarget ビット フィールド フラグが Flagsで設定されていない場合は、MultisampleType および multisampleQuality メンバー 予約されます。
  • VertexBuffer ビット フィールド フラグが Flagsで設定されていない場合、Fvf メンバーが予約されます。
  • テクスチャCubeMap、および Volume ビット フィールド フラグが Flagsで設定されていない場合、MipLevels メンバーが予約されます。
 
リソースの作成と破棄の詳細については、「リソースの作成と破棄の処理」を参照してください。

システム メモリ リソースの場合、ディスプレイ ミニポート ドライバーは、システム メモリがグラフィックス処理装置 (GPU) による直接アクセス用に適切に配置されている場合、システム メモリの周囲に割り当てをラップすることを選択できます。 ディスプレイ ミニポート ドライバーは、DxgkDdiCreateAllocation 関数を使用して割り当てを作成するときに、DXGK_ALLOCATIONINFO 構造体の フラグ メンバーに ExistingSysMem フラグを設定することで、システム メモリの周囲に割り当てをラップします。 ディスプレイ ミニポート ドライバーがシステム メモリの周囲に割り当てをラップできない場合、または折り返しが失敗した場合でも、ドライバーはリソースの作成に成功し、CPU を使用してリソースにアクセスする必要があります。

ランタイムが頂点バッファーまたはインデックス バッファーの作成を要求し、メモリ不足以外の理由でユーザー モードディスプレイ ドライバーがバッファーを作成できない場合 (ハードウェアサポートの不足など)、ドライバーは D3DERR_NOTAVAILABLEで失敗する必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows 8
サポートされる最小サーバー Windows Server 2012
ターゲット プラットフォーム デスクトップ
ヘッダー d3dumddi.h (D3dumddi.h を含む)

関連項目

Blt する

D3DDDIARG_CREATERESOURCE2

D3DDDI_RESOURCEFLAGS2

DXGK_ALLOCATIONINFO

DxgkDdiCreateAllocation

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb