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

pfnRenderCb 関数は、ディスプレイ ミニポート ドライバーにレンダリングするための現在のコマンド バッファーを送信します。

構文

PFND3DDDI_RENDERCB Pfnd3dddiRendercb;

HRESULT Pfnd3dddiRendercb(
  HANDLE hDevice,
  D3DDDICB_RENDER *unnamedParam2
)
{...}

パラメーター

hDevice

ディスプレイ デバイス (グラフィックス コンテキスト) へのハンドル。

unnamedParam2

pData [in, out]

レンダリングする現在のコマンド バッファーを記述する D3DDDICB_RENDER 構造体へのポインター。

戻り値

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

リターン コード 説明
S_OK コマンド バッファーが正常にレンダリングされました。
D3DDDIERR_PRIVILEGEDINSTRUCTION ディスプレイ ミニポート ドライバーは、コマンド バッファーで特権命令を検出しました。特権命令は、コマンド バッファーに存在できません。
D3DDDIERR_ILLEGALINSTRUCTION ディスプレイ ミニポート ドライバーは、グラフィックス ハードウェアがサポートできない命令を検出しました。
D3DDDIERR_INVALIDHANDLE ディスプレイ ミニポート ドライバーは、コマンド バッファーで無効なハンドルを検出しました。
D3DDDIERR_CANTRENDERLOCKEDALLOCATION ビデオ メモリ マネージャーは、割り当て一覧でロックされた割り当てへの参照を検出しました。 ビデオ メモリ マネージャーは、AGP またはシステム メモリ セグメントへの割り当てを再配置できなかった場合にのみ、このエラーを返します。
D3DDDIERR_INVALIDUSERBUFFER ディスプレイ ミニポート ドライバーは、データまたは命令のアンダーランまたはオーバーランを検出しました。 つまり、ドライバーは予想よりも少ない、またはそれ以上の命令またはデータを受け取った。
E_OUTOFMEMORY メモリ不足のため、pfnRenderCb を完了できませんでした。
E_INVALIDARG パラメーターが検証され、正しくないと判断されました。

この関数は、他の HRESULT 値も返す場合があります。

注釈

ユーザー モードディスプレイ ドライバーが表示ミニポート ドライバーにレンダリングするための現在のコマンド バッファーを送信する必要がある場合 (たとえば、ユーザー モードディスプレイ ドライバーの Flush または Flush (D3D10) 関数の呼び出し中)、ユーザー モードディスプレイ ドライバーは pfnRenderCb 関数を呼び出す必要があります。 ユーザー モードディスプレイ ドライバーは、CreateDevice または CreateDevice(D3D10) 呼び出し中に指定された Microsoft Direct3D ランタイムの値に hDevice パラメーターを設定する必要があります。 pData パラメーターによって指されるD3DDDICB_RENDER構造体では、ユーザー モード ディスプレイ ドライバーも次のように設定する必要があります。

  • CommandLength メンバーから、オフセット 0 から始まるコマンド バッファー内のコマンドのバイト数。
  • ユーザー モード表示ドライバーがコマンド バッファー内の最初のハードウェア コマンドへのオフセットを指定する必要がある場合は、 CommandOffset メンバーを 0 以外にします。
  • 割り当てリスト内の要素の数に対する NumAllocations メンバー。
  • パッチの場所リスト内の要素の数に対する NumPatchLocations メンバー。
pfnRenderCb の呼び出し後、ユーザー モードディスプレイ ドライバーは、D3DDDICB_RENDERの pNewCommandBuffer および NewCommandBufferSize メンバーで返される値から、次の送信に使用する必要があるコマンド バッファーのベース アドレスとサイズを決定する必要があります。 同様に、ドライバーは、pNewAllocationList メンバーと NewAllocationListSize メンバーと pNewPatchLocationList メンバーと NewPatchLocationListSize メンバーで返される値から、次の割り当てリストとパッチ位置リストの要素の基本アドレスと数をそれぞれ決定する必要があります。

ユーザー モードのディスプレイ ドライバーで、コマンド バッファーのフラッシュのほとんどが、ドライバーがコマンド バッファー、割り当てリスト、またはパッチの場所の一覧の領域を使い切っているためであることが検出された場合、ドライバーはサイズ変更を要求できます。 コマンド バッファーのサイズを変更するために、ドライバーは D3DDDICB_RENDER の Flags メンバーで ResizeCommandBuffer ビット フィールド フラグを設定し、要求されたサイズを D3DDDICB_RENDERNewCommandBufferSize メンバーに配置します。 同様に、割り当てリストのサイズを変更するために、ドライバーは D3DDDICB_RENDER の Flags メンバーに ResizeAllocationList ビット フィールド フラグを設定し、要求された数の要素を D3DDDICB_RENDER の NewAllocationListSize メンバーに配置します。 パッチの場所リストのサイズを変更するために、ドライバーは D3DDDICB_RENDER の Flags メンバーに ResizePatchLocationList ビット フィールド フラグを設定し、要求された数の要素を D3DDDICB_RENDER の NewPatchLocationListSize メンバーに配置します。

メモ ドライバーは、コマンド バッファーと割り当てとパッチの場所の一覧のサイズを変更するように要求できますが、ビデオ メモリ マネージャーが準拠できない可能性があります。 したがって、 pfnRenderCb の呼び出しが成功したかどうかに関係なく、ドライバーは、 D3DDDICB_RENDERの NewCommandBufferSizeNewAllocationListSize、および NewPatchLocationListSize メンバーで返される値を確認する必要があります。
 
ユーザー モードディスプレイ ドライバーが pData パラメーターによって指されるD3DDDICB_RENDER構造体の hContext メンバーを NULL に設定した場合、Microsoft Direct3D ランタイムはレンダリング操作をデバイスの既定のコンテキストに送信します。 ユーザー モードディスプレイドライバーが、以前に pfnCreateContextCb 関数が返した有効なハンドルに hContext を設定し、デバイス コンテキストを表す場合、Direct3D ランタイムはそのコンテキストにレンダリング操作を送信します。 Direct3D バージョン 11 注: ドライバーが pfnRenderCb を呼び出す方法の詳細については、「 Direct3D 10 からの変更」を参照してください。

次のコード例は、ディスプレイ ミニポート ドライバーにレンダリングするために現在のコマンド バッファーを送信する方法を示しています。 次のコード例では、コマンド バッファーとパッチ リストが生成された後に割り当てリストを生成します。 これは、コマンド バッファーが必要以上に解析されるため、パフォーマンスには最適ではありません。 ただし、この実装は簡単に表示できます。 運用ドライバーでは、割り当てリストとパッチ リストと同時にコマンド バッファーを生成する方が効率的です。

VOID CD3DContext::SubmitDXVABuffer(DWORD Size) {
    D3DDDICB_RENDER     renderCBData = {0};
    DWORD               dwAllocationListUsed;
    HRESULT             hr;

    if (GenerateAllocationListFromCmdBuf(R200UpdateQSParamsForDXVASubmit(m_pR200Ctx, Size), m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBufAllocList, m_dwHwCmdBufAllocListSize, &dwAllocationListUsed) == FALSE)
    {
        DBG_BREAK;
        return;
    }

    // 3-D and video packets must be in sync. If the last packet that was sent went to 
    // the 3-D engine, that packet must finish before the new packet runs on the hardware.

    renderCBData.CommandOffset  = 0;
    renderCBData.CommandLength  = Size + sizeof(UMD_CMDBUF_INFO);
    renderCBData.NumAllocations = dwAllocationListUsed;
    renderCBData.hContext = m_sContexts[MULTI_ENGINE_NODE_VIDEO].hContext;

    // Copy command-buffer data from the internal buffer to the buffer that was created by dxgkrnl
    memcpy(m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBuf, m_pHwCmdBuf + GetCmdBufPreambleSize(m_pR200Ctx), renderCBData.CommandLength);
 
    m_d3dCallbacks.pfnRenderCb(m_hD3D, &renderCBData);

        // Makes video the last engine that work was submitted to
        m_LastEngineSubmit = MULTI_ENGINE_NODE_VIDEO;
    }

要件

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

こちらもご覧ください

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

フラッシュ

pfnCreateContextCb