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 メンバー。
ユーザー モードのディスプレイ ドライバーで、コマンド バッファーのフラッシュのほとんどが、ドライバーがコマンド バッファー、割り当てリスト、またはパッチの場所の一覧の領域を使い切っているためであることが検出された場合、ドライバーはサイズ変更を要求できます。 コマンド バッファーのサイズを変更するために、ドライバーは D3DDDICB_RENDER の Flags メンバーで ResizeCommandBuffer ビット フィールド フラグを設定し、要求されたサイズを D3DDDICB_RENDER の NewCommandBufferSize メンバーに配置します。 同様に、割り当てリストのサイズを変更するために、ドライバーは D3DDDICB_RENDER の Flags メンバーに ResizeAllocationList ビット フィールド フラグを設定し、要求された数の要素を D3DDDICB_RENDER の NewAllocationListSize メンバーに配置します。 パッチの場所リストのサイズを変更するために、ドライバーは D3DDDICB_RENDER の Flags メンバーに ResizePatchLocationList ビット フィールド フラグを設定し、要求された数の要素を D3DDDICB_RENDER の NewPatchLocationListSize メンバーに配置します。
例
次のコード例は、ディスプレイ ミニポート ドライバーにレンダリングするために現在のコマンド バッファーを送信する方法を示しています。 次のコード例では、コマンド バッファーとパッチ リストが生成された後に割り当てリストを生成します。 これは、コマンド バッファーが必要以上に解析されるため、パフォーマンスには最適ではありません。 ただし、この実装は簡単に表示できます。 運用ドライバーでは、割り当てリストとパッチ リストと同時にコマンド バッファーを生成する方が効率的です。
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 を含む) |