次の方法で共有


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

pfnAllocateCb 関数は、システムまたはビデオ メモリを割り当てます。

構文

PFND3DDDI_ALLOCATECB Pfnd3dddiAllocatecb;

HRESULT Pfnd3dddiAllocatecb(
  [in] HANDLE hDevice,
       D3DDDICB_ALLOCATE *unnamedParam2
)
{...}

パラメーター

[in] hDevice

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

unnamedParam2

pData [in, out]

割り当てを記述する D3DDDICB_ALLOCATE 構造体へのポインター。

戻り値

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

リターン コード 説明
S_OK メモリが正常に割り当てられました。
E_INVALIDARG パラメーターが検証され、正しくないと判断されました。
E_OUTOFMEMORY pfnAllocateCb は、完了するために必要なメモリを割り当てませんでした。
D3DERR_OUTOFVIDEOMEMORY ビデオ メモリが不足しているため、pfnAllocateCb を完了できませんでした。 ビデオ メモリ マネージャーは、ビデオ メモリの仮想化を試みます。ただし、仮想化が失敗した場合 (仮想アドレス空間が不足した場合など)、メモリ マネージャーはこのエラー コードを返す可能性があります。
D3DDDIERR_DEVICEREMOVED pfnAllocateCb は、プラグ アンド プレイ (PnP) の停止またはタイムアウト検出と回復 (TDR) イベントが発生したため、ディスプレイ ミニポート ドライバーの DxgkDdiCreateAllocation 関数への呼び出しを開始できませんでした。 pfnAllocateCb (通常、CreateResourceCreateResource(D3D10)CreateResource(D3D11) 関数) を呼び出したユーザー モード表示ドライバー関数は、このエラー コードを Direct3D ランタイムに返す必要があります。
Direct3D バージョン 9 注: エラー コードの返しの詳細については、「ランタイム関数 から受信したエラー コードを返すを参照してください。
Direct3D バージョン 10 および 11 注: ドライバー関数が値を返さない場合 (つまり、戻り値のパラメーター型に VOID がある場合)、ドライバー関数は pfnSetErrorCb 関数 を呼び出して、エラー コードをランタイムに返します。 エラー コードの処理の詳細については、「エラー の処理」を参照してください。

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

備考

ユーザー モードのディスプレイ ドライバーは、pfnAllocateCb を呼び出して、システムまたはビデオ メモリ (割り当てとも呼ばれます) を割り当てます。 次に、Microsoft DirectX グラフィックス カーネル サブシステム (Dxgkrnl.sys) は、ディスプレイ ミニポート ドライバーの DxgkDdiCreateAllocation 関数を呼び出して、pfnAllocateCb 要求で渡されたプライベート データを解釈して格納します。 ディスプレイ ミニポート ドライバーは、ビデオ メモリ マネージャー (Dxgkrnl.sysの一部) が実際にメモリを割り当てるために使用する DxgkDdiCreateAllocation 呼び出しから情報を返します。

通常、ユーザー モードのディスプレイ ドライバーは、CreateResourceCreateResource(D3D10)、または CreateResource(D3D11) 関数 の呼び出しに応答して割り当てを作成します。 ただし、ユーザー モード ディスプレイ ドライバーは、ユーザー モード ディスプレイ ドライバーの CreateDevice、または CreateDevice(D3D10) 関数がビデオ メモリにスクラッチ パッド領域を作成する場合など、いつでも割り当てを作成できます。

ユーザー モード ディスプレイ ドライバーは、次の種類の割り当てを作成できます。

  • Microsoft Direct3D ランタイムがシステム メモリを事前に割り当てるシステム メモリ割り当て。 この状況では、ユーザー モードのディスプレイ ドライバーは、配置またはその他のパラメーターを設定できません。 ユーザー モード ディスプレイ ドライバーは、ハードウェアからアクセスできる事前に割り当てられたシステム メモリが必要な場合は、pfnAllocateCb 呼び出します。 Direct3D ランタイムは、pData が指す D3DDDICB_ALLOCATE 構造体の pAllocationInfo メンバーの D3DDDI_ALLOCATIONINFO 構造体の pSystemMem メンバー内のシステム メモリ ポインター返します。 ユーザー モード ディスプレイ ドライバーが、ハードウェアからアクセスできる事前に割り当てられたシステム メモリを必要としない場合は、この種類のメモリ pfnAllocateCb を呼び出さないでください。
  • ユーザー モード ディスプレイ ドライバーが作成に参加できるシステムとビデオのメモリ割り当て。
ドライバーが複数の割り当てを作成しようとすると、ドライバーはすべての割り当てを親リソースに関連付けることができます (たとえば、各バックバッファーが個々の割り当てである反転チェーンを作成するとき)。 ドライバーは、pData が指す D3DDDICB_ALLOCATE 構造体の hResource メンバーを、ドライバーの CreateResourceCreateResource(D3D10)、または CreateResource(D3D11) 関数 渡された値に設定することで、このような関連付けを実行できます。 これに対して、Direct3D ランタイムは、hKMResource D3DDDICB_ALLOCATE メンバーのカーネル モード リソース ハンドル (D3DKMT_HANDLE データ型) を返します。 ユーザー モードディスプレイ ドライバーは、その後、ディスプレイ ミニポート ドライバーで使用するコマンド ストリームにこのカーネル モード リソース ハンドルを挿入できます。

ディスプレイ ミニポート ドライバーは、このカーネル モード のリソース ハンドル (通常は、その DxgkDdiRender 関数内) で DxgkCbGetHandleData 関数を呼び出して、リソースに関連付けられているプライベート データを取得できます。また、ディスプレイ ミニポート ドライバーは、DxgkCbEnumHandleChildren 関数を呼び出して、リソースに関連付けられているすべての割り当てを取得できます。 ディスプレイ ミニポート ドライバーは、DxgkCbGetHandleParent 関数を呼び出して、子割り当てハンドルから親カーネル モード リソース ハンドルを取得することもできます。

ユーザー モード ディスプレイ ドライバーが pfnAllocateCb を呼び出すときに、D3DDDICB_ALLOCATEの hResource メンバーが NULL設定されている場合、割り当てはリソースではなくデバイスに関連付けられます。 ドライバーは、違いがセマンティックであることを判断できます。 リソースへの割り当ての関連付けは省略可能ですが、デバッグと診断の目的で推奨されます。

Direct3D バージョン 9 注: リソースの作成と破棄の詳細については、「リソースの作成と破棄のの処理」を参照してください。

Direct3D バージョン 11 注: ドライバーが pfnAllocateCb 呼び出す方法の詳細については、Direct3D 10 からの変更を参照してください。

次のコード例は、リソースにメモリを割り当てる方法を示しています。

    D3DDDICB_ALLOCATE           allocCB;
    D3DDDI_ALLOCATIONINFO       allocInfo;
    HRESULT                     hr;
    memset(&allocInfo,   0, sizeof(allocInfo));
    memset(&allocCB,     0, sizeof(allocCB));
    // Set the VidPN source ID for the primary and fullscreen back buffer
    if (m_dwCurResCaps.Primary) {
        allocInfo.Flags.Primary = TRUE;
        allocInfo.VidPnSourceId = m_VidPnSourceId;
    }
    // Check if the allocation is in system memory
    if (pSysMem) {
        allocInfo.pSystemMem = pSysMem;
    }
    // Use the runtime handle of the resource being created
    // NOTE: This is critical for supporting a shared resource
    allocCB.hResource = m_hCurResRuntime;

    allocCB.NumAllocations = 1;
    allocCB.pAllocationInfo = &allocInfo;

    hr = m_d3dCallbacks.pfnAllocateCb(m_hD3D, &allocCB);

    if (FAILED(hr)) {
        allocInfo.hAllocation = NULL;
    }
    else {
        *phAllocation = allocInfo.hAllocation;
    }

    return (hr);

必要条件

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

関連項目

CreateDevice

CreateDevice(D3D10)

CreateResource

CreateResource(D3D10)

CreateResource(D3D11)

D3DDDICB_ALLOCATE

D3DDDI_ALLOCATIONINFO

D3DDDI_DEVICECALLBACKS

DxgkCbEnumHandleChildren する

DxgkCbGetHandleData

DxgkCbGetHandleParent

DxgkDdiCreateAllocation  

User-Mode ディスプレイ ドライバー によって呼び出される Direct3D ランタイム関数の