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_DRAWPRIMITIVES2DATAdwCommandOffset メンバーのバイト数を、D3DHAL_DRAWPRIMITIVES2DATAの lpDDCommands メンバーがポイントするコマンド バッファーに追加して、最初のD3DHAL_DP2COMMAND構造体の場所を確認します。
  • 頂点バッファー内の最初の頂点の位置を決定します。 これは、頂点バッファーにデータがある場合にのみ行う必要があります。つまり、D3DDP2OP_Xxx コマンド トークンを受信した場合 (トークンがD3DDP2OP_LINELIST_IMMまたはD3DDP2OP_TRIANGLEFAN_IMMされている場合を除く)。 これら 2 つのオペコードは、頂点データが頂点バッファーではなく、コマンド ストリームですぐに渡されることを示します。 そのため、頂点バッファーにデータがあると仮定すると、頂点バッファーがユーザー メモリ内にある場合、最初の頂点は lpVertices が指すバッファーへの dwVertexOffset バイトです。 それ以外の場合、ドライバーは、lpDDVertex がポイントするDD_SURFACE_LOCAL構造体に関連付けられているメモリに dwVertexOffset を適用する必要があります。 dwVertexOffsetlpVerticeslpDDVertex は、D3DHAL_DRAWPRIMITIVES2DATAのメンバーです。
  • ドライバーが要求された FVF をサポートしていることを確認するには、D3DHAL_DRAWPRIMITIVES2DATAの dwVertexType メンバーを確認します。 次のいずれかの条件が存在する場合、ドライバーは呼び出しに失敗する必要があります。
    • 頂点座標は指定されていません。つまり、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 コールバックにこのコールバックを提供します。
ドライバーは、コマンドバッファーと頂点バッファーが格納されているメモリを読みやすくするためにプローブする必要はありません。 ただし、ドライバーは、 D3DHAL_DRAWPRIMITIVES2DATAの dwCommandLength メンバーと dwVertexLength メンバーによって指定された境界内に留まる必要があります。

ドライバーが D3dDrawPrimitives2 に失敗する必要がある場合は、D3DHAL_DRAWPRIMITIVES2DATAの dwErrorOffset メンバーに、最初の未処理のD3DHAL_DP2COMMANDが見つかるコマンド バッファーへのオフセットを入力する必要があります。

メモ 次のコメントは、Microsoft DirectX 7.0 インターフェイスを使用して記述され、DirectX 8.0 および DirectX 8.1 ランタイムを介してドライバーと通信するアプリケーションに対してのみ有効です。

次のコメントは、DirectX 8.0 以降のインターフェイスを使用して記述されたアプリケーションでは有効ではありません。このようなアプリケーションでは現在の頂点バッファーの概念が使用されなくなったためです (つまり、頂点データは D3DHAL_DRAWPRIMITIVES2DATA の lpDDVertex メンバーを介して渡されなくなりました)。 したがって、これらのアプリケーションでは、ドライバーの D3dDrawPrimitives2 関数では、バッファーが暗黙的または明示的で、未処理のロックがある場合でも、頂点バッファーからのレンダリングがストールすることはありません。

 
ドライバーが DirectX 8.1 以降のランタイムで使用されている場合、ドライバーの D3dDrawPrimitives2 関数では、バッファーが暗黙的な場合に現在の頂点バッファー ( lpDDVertex 経由で渡される) からのレンダリングがストールすることはありません。 バッファーが明示的で、未処理のロックがある場合、ドライバーはバッファーの名前を変更しない (D3DHALDP2_SWAPVERTEXBUFFER設定されていない) 場合は、 D3dDrawPrimitives2 関数の末尾でストールする必要があります。 ドライバーがバッファーの名前を変更した場合、ドライバーはストールしません。 DirectX 8.1 以降のランタイムは、ドライバーの D3dDrawPrimitives2 関数を呼び出して、必要な場合にのみロックされた明示的な頂点バッファーからレンダリングするため、パフォーマンスにほとんど影響しません。 暗黙的な頂点バッファーは、ドライバーの CreateD3DBuffer コールバックによって作成され、DDSCAPS_EXECUTEBUFFER フラグのみが設定されます。 明示的な頂点バッファーは、ドライバーの CreateD3DBuffer コールバックによって作成され、DDSCAPS_EXECUTEBUFFERフラグとDDSCAPS2_VERTEXBUFFER フラグが設定されます。 明示的な頂点バッファーは、ドライバーの LockD3DBuffer コールバックによってロックされます。

ドライバーが 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 を含む)

    関連項目

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    Fvf