次の方法で共有


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 256x9 テクスチャ 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_CREATERESOURCE2の Flags メンバーで SharedResource ビットフィールド フラグを設定することで、リソースを共有することを指定します。 このビット フィールド フラグが設定されている場合、ユーザー モード ディスプレイ ドライバーは、共有リソースに対する次の制限に従う必要があります。

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

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

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

要件

要件
サポートされている最小のクライアント Windows 8
サポートされている最小のサーバー Windows Server 2012
対象プラットフォーム デスクトップ
Header d3dumddi.h (D3dumddi.h を含む)

こちらもご覧ください

Blt

D3DDDIARG_CREATERESOURCE2

D3DDDI_RESOURCEFLAGS2

DXGK_ALLOCATIONINFO

DxgkDdiCreateAllocation

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb