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 值。
言論
使用者模式顯示驅動程式必須呼叫 pfnUnlockCb 函式,才能解除鎖定先前在呼叫 pfnLockCb 函式 時鎖定的配置。 如果驅動程式未呼叫 pfnUnlockCb ,則Microsoft Direct3D 運行時間、使用者模式顯示驅動程式和顯示迷你埠驅動程式之間的協調會遺失。
使用者模式顯示驅動程式通常會呼叫 pfnUnlockCb ,以回應呼叫其 Unlock 或 ResourceUnmap 函式(或其他 ResourceUnmap 變化,例如 DynamicIABufferUnmap)來解除鎖定資源或資源內的表面。 從 Unlock 或 ResourceUnmap 呼叫傳回之前,使用者模式顯示驅動程式必須先將資源或表面對應至適當的配置,然後 呼叫 pfnUnlockCb 來解除鎖定配置。
使用者模式顯示驅動程式也可以呼叫 pfnUnlockCb ,以回應呼叫其 DestroyDevice 或 DestroyDevice(D3D10) 函式,以釋放它為裝置配置的所有資源。 在裝置的存留期內,pfnLockCb 的每個呼叫都必須與 pfnUnlockCb 函式的 呼叫配對,才能解除鎖定配置。
使用者模式顯示驅動程式可以在一次呼叫 pfnUnlockCb 中解除鎖定多個配置,方法是將 D3DDDICB_UNLOCK 結構的 NumAllocations 成員設定為 D3DDDICB_UNLOCK phAllocations 成員所指定的陣列配置數目。
使用者模式顯示驅動程式應該呼叫 pfnUnlockCb ,以在呼叫 pfnRenderCb 函式之前,先解除鎖定命令數據流中參考的所有配置。 驅動程式可能會鎖定配置以支援,例如,NoOverwrite 位欄位旗標。 如果驅動程式未解除鎖定所有這些配置,可能需要視訊記憶體管理員將這些配置放在AGP記憶體中。
使用者模式顯示驅動程式不應該呼叫 pfnUnlockCb ,以解除鎖定應用程式可以使用的配置。 當驅動程式收到呼叫其 解除鎖定 或 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作系統中使用。 |
目標平臺 | 桌面 |
標頭 | d3dumddi.h (包括 D3dumddi.h) |