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

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

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