LPD3DHAL_DRAWPRIMITIVES2CB コールバック関数 (d3dhal.h)
D3dDrawPrimitives2 関数はプリミティブをレンダリングし、更新されたレンダリング状態を返します。
構文
LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;
DWORD Lpd3dhalDrawprimitives2cb(
LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}
パラメーター
unnamedParam1
pdp [in]
ドライバーが 1 つ以上のプリミティブをレンダリングするために必要な情報を含むD3DHAL_DRAWPRIMITIVES2DATA構造体を指します。
戻り値
D3dDrawPrimitives2 は、次のいずれかのコールバック コードを返します。
注釈
D3dDrawPrimitives2 は、Microsoft Direct3D ドライバーに実装する必要があります。
ドライバーは、次の操作を行う必要があります。
- pdp のD3DHAL_DRAWPRIMITIVES2DATA構造体の dwhContext メンバーによって指定されたコンテキスト ハンドルが有効であることを確認します。
- コンテキストに関連付けられている図面サーフェスへの反転が進行中でないことを確認します。 描画サーフェスが反転に関係している場合、ドライバーは D3DHAL_DRAWPRIMITIVES2DATA の ddrval メンバーをDDERR_WASSTILLDRAWINGに設定し、DDHAL_DRIVER_HANDLEDを返す必要があります。
- D3DHAL_DRAWPRIMITIVES2DATA の dwCommandOffset メンバーのバイト数を、D3DHAL_DRAWPRIMITIVES2DATAの lpDDCommands メンバーが指すコマンド バッファーに追加して、最初のD3DHAL_DP2COMMAND構造体の位置を確認します。
- 頂点バッファー内の最初の頂点の位置を決定します。 これは、頂点バッファーにデータがある場合にのみ行う必要があります。つまり、D3DDP2OP_Xxx コマンド トークンが受信されたとき (トークンがD3DDP2OP_LINELIST_IMMまたはD3DDP2OP_TRIANGLEFAN_IMMされている場合を除く)。 これら 2 つのオペコードは、頂点データが頂点バッファーではなく、コマンド ストリームですぐに渡されることを示します。 そのため、頂点バッファーにデータがあると仮定すると、頂点バッファーがユーザー メモリ内にある場合、最初の頂点は lpVertices が指すバッファーへの dwVertexOffset バイトです。 それ以外の場合、ドライバーは、lpDDVertex が指すDD_SURFACE_LOCAL構造体に関連付けられているメモリに dwVertexOffset を適用する必要があります。 dwVertexOffset、 lpVertices、 lpDDVertex は、D3DHAL_DRAWPRIMITIVES2DATAのメンバーです。
- D3DHAL_DRAWPRIMITIVES2DATA の dwVertexType メンバーを調べて、ドライバーが要求された FVF をサポートしていることを確認します。 次のいずれかの条件が存在する場合、ドライバーは呼び出しを失敗させる必要があります。
- 頂点座標は指定されていません。つまり、D3DFVF_XYZRHWが設定されていない場合は 。
- 法線を指定します。つまり、D3DFVF_NORMALが設定されている場合は 。
- 予約済みD3DFVF_RESERVED x ビットのいずれかが設定されます。
- コマンド バッファー内のすべてのコマンドを順番に処理します。 D3DHAL_DP2COMMAND構造ごとに、ドライバーは次の操作を行う必要があります。
- コマンドがD3DDP2OP_RENDERSTATEされている場合は、コマンド バッファーに続く wStateCount D3DHAL_DP2RENDERSTATE 構造体を処理し、各レンダリング状態構造体のドライバー状態を更新します。 D3DHALDP2_EXECUTEBUFFER フラグが設定されている場合、 ドライバーは lpdwRStates が指す配列の状態の変化も反映する必要があります。 wStateCount と lpdwRStates は、D3DHAL_DRAWPRIMITIVES2DATAのメンバーです。
- コマンドがD3DDP2OP_TEXTURESTAGESTATEされている場合は、コマンド バッファーに続く wStateCount D3DHAL_DP2TEXTURESTAGESTATE 構造体を処理し、各テクスチャ状態構造体の指定したテクスチャ ステージに関連付けられているドライバーのテクスチャ状態を更新します。
- コマンドがD3DDP2OP_VIEWPORTINFOされている場合は、コマンド バッファーで次の D3DHAL_DP2VIEWPORTINFO 構造を処理し、ドライバーの内部レンダリング コンテキストに格納されているビューポート情報を更新します。
- コマンドがD3DDP2OP_WINFOされている場合は、コマンド バッファーに続く D3DHAL_DP2WINFO 構造体を処理し、ドライバーの内部レンダリング コンテキストに格納されている w バッファー情報を更新します。
- それ以外の場合は、コマンド バッファーの D3DDP2OP_Xxx プリミティブ レンダリング コマンドに従う、D3DHAL_DP2 Xxx プリミティブ構造体を処理します。
- コマンドが不明な場合は、ランタイムの D3dParseUnknownCommand コールバックを 呼び出します。 ランタイムは、GUID_D3DParseUnknownCommandCallback GUID を使用して、ドライバーの DdGetDriverInfo コールバックにこのコールバックを提供します。
ドライバーが D3dDrawPrimitives2 に失敗する必要がある場合は、D3DHAL_DRAWPRIMITIVES2DATAの dwErrorOffset メンバーに、最初の未処理のD3DHAL_DP2COMMANDが見つかるコマンド バッファーへのオフセットを入力する必要があります。
DirectX 8.0 以降のインターフェイスを使用して記述されたアプリケーションでは、次のコメントは無効です。このようなアプリケーションでは、現在の頂点バッファーの概念が使用されなくなりました (つまり、頂点データは、D3DHAL_DRAWPRIMITIVES2DATA の lpDDVertex メンバーを介して渡されなくなります)。 したがって、これらのアプリケーションでは、ドライバーの D3dDrawPrimitives2 関数では、バッファーが暗黙的または明示的であり、未処理のロックがある場合でも、頂点バッファーからのレンダリングが停止することはありません。
ドライバーが DirectX 8.0 ランタイムで使用されている場合、同期の問題や破損を防ぐために、暗黙的な現在の頂点バッファーからのレンダリング時にドライバーが停止することがあります。 さらに、DirectX 8.0 ランタイムは、ドライバーの D3dDrawPrimitives2 関数を呼び出して、ロックされた明示的な現在の頂点バッファーからレンダリングする頻度が高くなり、パフォーマンスが低下するために実際に必要になります。 DirectX 8.0 ランタイムで使用されるドライバーの回避策を次に示します。
-
ドライバーは、(D3DHALDP2_USERMEMVERTICESで識別される) ユーザー メモリ プリミティブのレンダリングと、バッファーの名前を変更しない (D3DHALDP2_SWAPVERTEXBUFFER設定されていない) 場合にのみ、暗黙的な現在の頂点バッファーからのレンダリングの間で遷移すると、停止する必要があります。
次の例は、 D3dDrawPrimitives2 が暗黙的な現在の頂点バッファーで停止するタイミングを示しています。
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, 0); // Stall
次の例は、 D3dDrawPrimitives2 が暗黙的な現在の頂点バッファーで停止しない場合を示しています。
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
ランタイムが D3DHALDP2_REQCOMMANDBUFSIZE フラグを設定した場合、ドライバーは停止する必要はありません。 一致して、DirectX 8.0 ランタイムは、ロックされた明示的な現在の頂点バッファーから最も一般的にレンダリングされる場合に、D3DHALDP2_REQCOMMANDBUFSIZEも設定します。 そのため、ドライバーは、ロックされた明示的な現在の頂点バッファーからのレンダリング中にD3DHALDP2_REQCOMMANDBUFSIZEを検出したときに停止しないことでパフォーマンスを向上させることができます。
次の例は、 D3dDrawPrimitives2 が明示的な現在の頂点バッファーで停止するタイミングを示しています。
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
次の例は、 D3dDrawPrimitives2 が明示的な現在の頂点バッファーで停止しない場合を示しています。
DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
要件
要件 値 対象プラットフォーム デスクトップ Header d3dhal.h (D3dhal.h を含む) こちらもご覧ください