次の方法で共有


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

CreateResource 関数は、リソースを作成します。

構文

PFND3DDDI_CREATERESOURCE Pfnd3dddiCreateresource;

HRESULT Pfnd3dddiCreateresource(
  HANDLE hDevice,
  D3DDDIARG_CREATERESOURCE *unnamedParam2
)
{...}

パラメーター

hDevice

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

unnamedParam2

pResource [in, out]

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

戻り値

CreateResource は、次のいずれかの値を返します。

リターン コード 説明
S_OK リソースが正常に作成されました。
E_OUTOFMEMORY CreateResource は、完了するために必要なメモリを割り当てませんでした。
D3DERR_NOTAVAILABLE CreateResource は、メモリを割り当てることができない以外の理由でリソースを作成できませんでした。 CreateResource は、頂点バッファーまたはインデックス バッファーを作成する場合にのみ、このエラーを返します。

注釈

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

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

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

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

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

新しい CreateResource DDI は、Microsoft Windows 2000 ディスプレイ ドライバー モデルDdCreateSurface DDI とは次の点で異なります。

  • 新しい CreateResource DDI では、サーフェスが明示的にアタッチされることはありません。 すべての添付ファイルは、アトミック作成によって暗黙的に示されます。
  • 新しい CreateResource DDI では、キューブ マップの部分的な作成は許可されません。
システム メモリ リソースの場合、ディスプレイ ミニポート ドライバーは、システム メモリがグラフィックス処理装置 (GPU) による直接アクセス用に適切に配置されている場合に、システム メモリの周りに割り当てをラップすることを選択できます。 ディスプレイ ミニポート ドライバーは、DxgkDdiCreateAllocation 関数を使用して割り当てを作成するときに、DXGK_ALLOCATIONINFO構造体の Flags メンバーで ExistingSysMem フラグを設定することで、システム メモリの周りの割り当てをラップします。 ディスプレイ ミニポート ドライバーがシステム メモリの周りの割り当てをラップできない場合、またはラップが失敗した場合でも、ドライバーはリソースの作成に成功し、CPU を使用してリソースにアクセスする必要があります。

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

要件

要件
サポートされている最小のクライアント Windows Vista 以降のバージョンの Windows オペレーティング システムで使用できます。
対象プラットフォーム デスクトップ
Header d3dumddi.h (D3dumddi.h を含む)

こちらもご覧ください

Blt

D3DDDIARG_CREATERESOURCE

D3DDDI_DEVICEFUNCS

D3DDDI_RESOURCEFLAGS

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb