PFND3DDDI_LOCKASYNC回呼函式 (d3dumddi.h)

LockAsync 函式會鎖定資源內的指定資源或介面。

語法

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

HRESULT Pfnd3dddiLockasync(
  HANDLE hDevice,
  D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}

參數

hDevice

顯示裝置的句柄 (圖形內容) 。

unnamedParam2

pData [in, out]

描述資源內要鎖定之資源或表面之 D3DDDIARG_LOCKASYNC 結構的指標。

傳回值

LockAsync 會傳回下列其中一個值:

傳回碼 描述
S_OK 資源已成功鎖定。
E_OUTOFMEMORY LockAsync 無法配置所需的記憶體,使其完成。
D3DDDIERR_WASSTILLDRAWING 重新命名對應至 D3DDDIARG_LOCKASYNC 結構所指定資源的配置失敗。
只有當 [捨棄] 位字段旗標是在 D3DDDIARG_LOCKASYNC 的 Flags 成員中設定時,驅動程式才會傳回此值。
E_NOTIMPL 使用者模式顯示驅動程式不支援指定資源的LockAsync。

備註

在多處理器計算機上,Microsoft Direct3D 運行時間可能會從背景工作線程呼叫使用者模式顯示驅動程式的大部分功能,而不是從主要應用程式線程呼叫。 這個多處理器優化對使用者模式顯示驅動程式而言是透明的。 當運行時間使用多處理器優化時,它可能會呼叫 LockAsync ,而不是 Lock 函式來鎖定資源。

使用者模式顯示驅動程式選擇性地實作LockAsync;只有在驅動程序實作 LockAsync、UnlockAsyncRename 函式時,Direct3D 運行時間才會呼叫 LockAsync 不過,使用者模式顯示驅動程式應該實作 LockAsyncUnlockAsyncRename 函式,因為經常鎖定動態資源的應用程式可以達到更高的效能。

當 Direct3D 執行時間使用多處理器優化時,它會從運行時間所管理的背景工作線程呼叫大部分的使用者模式顯示驅動程式函式;不過,運行時間會在應用程式的主要線程上呼叫 LockAsync

如果使用者模式顯示驅動程式公開0x0000000B或更新版本的 DDI 版本, (驅動程式會在 D3D10DDIARG_OPENADAPTER結構的 DriverVersion 成員中傳回此值,以呼叫驅動程式的 OpenAdapter 函式) ,Direct3D 運行時間會以重新進入的方式呼叫 LockAsync。 當運行時間以重新進入方式呼叫 LockAsync 時,一個線程可以在 LockAsync 內執行,另一個參考相同顯示裝置的線程會在另一個使用者模式顯示驅動程式函式內執行。 此外,在此類型的驅動程式上,運行時間會呼叫 System 記憶體介面的 LockAsync。 如果在 D3DDDIARG_LOCKASYNCFlags 成員中設定 [捨棄位字段旗標],驅動程式應該嘗試重新命名對應至資源的配置。 一般而言,為了重新命名配置,驅動程式會使用對應至要鎖定之資源的配置句柄呼叫 pfnLockCb 函式。

驅動程式應該會在驅動程式呼叫 pfnLockCb 時,在 D3DDDICB_LOCK 結構的 Flags 成員中設定 Discard 位字段旗標。 只有在驅動程式呼叫 pfnLockCb 時,驅動程式應該設定 D3DDDICB_LOCK 的 NoExistingReference 位字段旗標,只有在 D3DDDIARG_LOCKASYNC 的 Flags 成員中,NoExistingReferences 位欄位旗標設定為 TRUE,而且驅動程式沒有內部排入佇列的資源參考時。

如果驅動程式無法重新命名配置,驅動程式的 LockAsync 函式應該會將失敗傳回運行時間,而且驅動程式不應該排清其命令緩衝區。 如果重新命名成功,驅動程式應該會傳回資源記憶體、間距和配量間距的指標,以及代表 D3DDDIARG_LOCKASYNC成員中已重新命名配置的資源句柄。 驅動程式不應該使用 pfnLockCb 傳回的新配置句柄來更新其內部追蹤結構。 相反地,驅動程式應該等到呼叫其 Rename 函式為止。

如果在 D3DDDIARG_LOCKASYNC 的 Flags 成員中設定 NoOverwrite 位字段旗標,驅動程式應該鎖定具有無覆寫語意的對應配置。 驅動程式應該呼叫 pfnLockCb,並在 D3DDDICB_LOCKFlags 成員中設定 IgnoreSync 位字段旗標,然後應該將指標傳回資源記憶體、間距和配量間距給D3DDDIARG_LOCKASYNC成員中的 Direct3D 運行時間。 如果驅動程式傳回成功 (S_OK) 從已設定 NoOverwrite 位字段旗標的 LockAsync 呼叫傳回成功,可能會呼叫它以鎖定的介面轉譯。 驅動程式應該只會針對鎖定時可轉譯的介面,從呼叫傳回其 LockAsync的成功NoOverwrite 設定。 視訊記憶體管理員需要 AGP 或光圈區段必須支持對應至表面的配置;否則,當命令緩衝區參考鎖定的配置時, pfnRenderCb 函式的呼叫會失敗。

總而言之,如果重新命名失敗或資源不支援覆寫語意,驅動程式應該無法呼叫其 LockAsync 函式。 不過,Direct3D 運行時間會從這些失敗中復原。 對於所有其他情況,驅動程式應該會從 LockAsync 傳回成功,以改善多處理器電腦上的效能。

規格需求

需求
最低支援的用戶端 可在 Windows Vista 和更新版本的 Windows 作業系統中使用。
目標平台 桌面
標頭 d3dumddi.h (include D3dumddi.h)

另請參閱

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

鎖定

重新命名

UnlockAsync

pfnLockCb

pfnRenderCb