次の方法で共有


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 呼び出した後、ユーザー モード ディスプレイ ドライバーは、pNewCommandBuffer および NewCommandBufferSizeD3DDDICB_RENDERメンバーで返される値から、次の送信に使用する必要があるコマンド バッファーの基本アドレスとサイズを決定する必要があります。 同様に、ドライバーは、pNewAllocationList および NewAllocationListSize メンバーと pNewPatchLocationList および NewPatchLocationListSize メンバーで返される値から、次の割り当てリストとパッチロケーション リストの要素の基本アドレスと数を決定する必要があります。

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

ドライバーはコマンド バッファーと割り当てとパッチの場所の一覧のサイズ変更を要求できますが、ビデオ メモリ マネージャーが準拠できない可能性があります。 したがって、pfnRenderCb 呼び出しが成功したかどうかに関係なく、ドライバーは、NewCommandBufferSizeNewAllocationListSizeおよび D3DDDICB_RENDER の 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 オペレーティング システムで使用できます。
ターゲット プラットフォーム デスクトップ
ヘッダー d3dumddi.h (D3dumddi.h を含む)

関連項目

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

フラッシュ

pfnCreateContextCb