處理資源建立和解構
若要讓 Microsoft DirectX 圖形核心子系統能夠正確追蹤資源存留期,並防止作業系統中的記憶體流失,使用者模式顯示驅動程式必須正確建立和終結資源。
Microsoft Direct3D 執行時間會呼叫下列使用者模式顯示驅動程式函式,以建立使用者模式資源。
CreateResource 會建立新的共用或未共用資源。
OpenResource 會開啟現有共用資源的檢視。
在這兩個呼叫中,Direct3D 執行時間都會傳遞使用者模式顯示驅動程式用來回呼執行時間的唯一 使用者模式執行時間資源控制碼 。 當 CreateResource或OpenResource成功傳回時,使用者模式顯示驅動程式會傳回代表資源的唯一使用者模式控制碼。 此控制碼是 使用者模式驅動程式資源控制碼。 執行時間會在後續的驅動程式呼叫中使用使用者模式驅動程式資源控制碼。
使用者模式執行時間資源控制碼與使用者模式驅動程式資源控制碼之間存在一對一對應。 Direct3D 執行時間和使用者模式顯示驅動程式會透過D3DDDIARG_CREATERESOURCE和D3DDDIARG_OPENRESOURCE結構的hResource成員交換使用者模式執行時間和驅動程式資源控制碼。
當使用者模式顯示驅動程式呼叫 Direct3D 執行時間的pfnAllocateCb函式來建立使用者模式資源的配置時,驅動程式應該在pData參數所指向之D3DDDICB_ALLOCATE結構的hResource成員中指定使用者模式執行時間資源控制碼。 Direct3D 執行時間會產生資源的唯一核心模式控制碼,並將它傳回 D3DDDICB_ALLOCATE hKMResource 成員中的使用者模式顯示驅動程式。 使用者模式顯示驅動程式可以在命令資料流程中插入核心模式資源控制碼,以供顯示迷你埠驅動程式稍後使用。
注意 雖然使用者模式資源控制碼對於每個使用者模式資源建立而言一律是唯一的,但核心模式資源控制碼不一定是唯一的。 當 Direct3D 執行時間呼叫使用者模式顯示驅動程式的OpenResource函式來開啟現有共用資源的檢視時,執行時間會在pResource參數指向之D3DDDIARG_OPENRESOURCE結構的hKMResource成員中傳遞資源的核心模式控制碼。 執行時間先前在執行時間之後建立此核心模式控制碼,稱為使用者模式顯示驅動程式的 CreateResource 函式。
若要終結CreateResource 或 OpenResource所建立的使用者模式資源,Direct3D 執行時間會在呼叫使用者模式顯示驅動程式的 DestroyResource函式時,在hResource參數中傳遞使用者模式驅動程式資源控制碼。 若要釋放核心模式資源控制碼和與使用者模式資源相關聯的所有配置,使用者模式顯示驅動程式會將使用者模式執行時間資源控制碼傳遞至pfnDeallocateCb函式呼叫中,pData參數指向之D3DDDICB_DEALLOCATE結構的hResource執行時間資源控制碼。
當使用者模式顯示驅動程式建立並終結資源時,請考慮下列專案:
對於使用者模式顯示驅動程式所建立的配置,以回應共用資源 (,也就是為了回應ShareResource呼叫,而SharedResource位欄位旗標是在D3DDDIARG_CREATERESOURCE) 的Flags成員中設定,驅動程式必須將非Null值指派給D3DDDICB_ALLOCATE的hResource成員。
對於使用者模式顯示驅動程式為了回應非共用資源而建立的配置,驅動程式不需要將非Null 值指派給 D3DDDICB_ALLOCATE 的 hResource 成員。 如果驅動程式將 Null 指派給 hResource,則配置會與裝置相關聯,而不是特定資源 (和核心模式資源控制碼) 。 不過,如果配置確實與資源相關,驅動程式應該將配置與該資源產生關聯。 注意只有在使用者模式顯示驅動程式將D3DDDICB_ALLOCATE的 hResource成員設定為使用者模式運行時間資源控制碼時,才會建立核心模式資源控制碼,該驅動程式是在呼叫CreateResource時從 D3DDDIARG_CREATERESOURCE 結構的hResource成員收到的。
呼叫 DestroyResource 以終結非共用使用者模式資源時,使用者模式顯示驅動程式可以呼叫 pfnDeallocateCb ,且該成員的 hResource 成員D3DDDICB_DEALLOCATE只有在驅動程式從未與資源相關聯的任何配置 時,才會 設定為 Null 。 如果使用者模式顯示與資源相關聯的配置,驅動程式必須呼叫 pfnDeallocateCb ,並將 D3DDDICB_DEALLOCATE 的 hResource 成員設定為非Null 值;否則,就會發生記憶體流失。