次の方法で共有


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

pfnUnlockCb 関数は、pfnLockCb 関数の呼び出しによってロックされた割り当てのロックを解除します。

構文

PFND3DDDI_UNLOCKCB Pfnd3dddiUnlockcb;

HRESULT Pfnd3dddiUnlockcb(
  HANDLE hDevice,
  const D3DDDICB_UNLOCK *unnamedParam2
)
{...}

パラメーター

hDevice

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

unnamedParam2

pData [in]

ロック解除する割り当てを記述する D3DDDICB_UNLOCK 構造体へのポインター。

戻り値

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

リターン コード 説明
S_OK 割り当てが正常にロック解除されました。
E_OUTOFMEMORY メモリ不足のため、pfnUnlockCb を完了できませんでした。 (このエラーは、システムが極端にメモリ不足の状況にあり、ページの配列を割り当てるのに十分な領域がない場合に発生します)。
E_INVALIDARG パラメーターが検証され、正しくないと判断されました。

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

注釈

ユーザー モード ディスプレイ ドライバーは 、pfnLockCb 関数の呼び出しで以前にロックされていた割り当てのロックを解除するには 、pfnUnlockCb 関数を呼び出す必要があります。 ドライバーが pfnUnlockCb を呼び出さない場合、Microsoft Direct3D ランタイム、ユーザー モードディスプレイ ドライバー、およびディスプレイ ミニポート ドライバー間の調整が失われます。

通常、ユーザー モードディスプレイ ドライバーは、Unlock 関数または ResourceUnmap 関数 (または DynamicIABufferUnmap などの ResourceUnmap のその他のバリエーション) の呼び出しに応じて pfnUnlockCb を呼び出して、リソースまたはリソース内のサーフェスのロックを解除します。 Unlock 呼び出しまたは ResourceUnmap 呼び出しから戻る前に、ユーザー モードディスプレイ ドライバーは最初にリソースまたはサーフェスを適切な割り当てにマップしてから、pfnUnlockCb を呼び出して割り当てのロックを解除する必要があります。

また、ユーザー モード ディスプレイ ドライバーは、DestroyDevice 関数または DestroyDevice(D3D10) 関数の呼び出しに応じて pfnUnlockCb を呼び出して、デバイスに割り当てたすべてのリソースを解放することもできます。 デバイスの有効期間中に、割り当てをロックするために pfnLockCb を呼び出すたびに、割り当てのロックを解除するために pfnUnlockCb 関数の呼び出しとペアにする必要があります。

ユーザー モードディスプレイ ドライバーは、D3DDDICB_UNLOCK構造体の NumAllocations メンバーを、D3DDDICB_UNLOCKphAllocations メンバーによって指定された配列内の割り当ての数に設定することで、pfnUnlockCb への 1 回の呼び出しで複数の割り当てのロックを解除できます。

ユーザー モード ディスプレイ ドライバーは 、pfnRenderCb 関数を呼び出す前に、コマンド ストリームで参照されるすべての割り当てのロックを解除するために pfnUnlockCb を呼び出す必要があります。 ドライバーでは、割り当てがサポートにロックされている可能性があります。たとえば、 NoOverwrite ビット フィールド フラグです。 ドライバーがこれらすべての割り当てのロックを解除しない場合は、これらの割り当てを AGP メモリに配置するためにビデオ メモリ マネージャーが必要になる場合があります。

ユーザー モード ディスプレイ ドライバーは、アプリケーションで使用できる割り当てのロックを解除するために pfnUnlockCb を呼び出さないでください。 ドライバーは、ドライバーが対応するリソースの Unlock 関数または ResourceUnmap 関数の呼び出しを受け取ると、アプリケーションが割り当ての読み取りまたは書き込みを行っていないという通知を受け取ります。

次のコード例は、割り当てのロックを解除する方法を示しています。

HRESULT CD3DContext::SyncEnginesUsingLock(VOID) {
    HRESULT hr;
    D3DDDICB_LOCK   lockCB;
    D3DDDICB_UNLOCK Unlock;

    memset(&lockCB, 0, sizeof(D3DDDICB_LOCK));
    lockCB.hAllocation = m_HandleUsedInLastSubmit;
    lockCB.PrivateDriverData = 0;                       
    hr = m_d3dCallbacks.pfnLockCb(m_hD3D, &lockCB);
    if (FAILED(hr)) {
        DBG_BREAK;
        return hr;
    }
    Unlock.NumAllocations = 1;
    Unlock.phAllocations = &m_HandleUsedInLastSubmit;
    m_d3dCallbacks.pfnUnlockCb(m_hD3D, &Unlock);   
    return hr;
}

要件

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

こちらもご覧ください

D3DDDICB_UNLOCK

D3DDDI_DEVICECALLBACKS

DestroyDevice

DestroyDevice(D3D10)

ResourceUnmap

Unlock

pfnLockCb

pfnRenderCb