共用方式為


處理錯誤

使用者模式顯示驅動程式實作的 Direct3D 第 10 版函 式通常具有傳回參數類型的 VOID。 此規則的主要例外是 CalcPrivateObjTypeSize-type函式 (例如 ,CalcPrivateResourceSize 函式) 。 這種類型的函式會傳回SIZE_T參數類型,指出驅動程式透過 CreateObjType- (type 函式建立特定物件類型所需的記憶體區域大小,例如 CreateResource (D3D10) ) 。

傳回 VOID 可防止使用者模式顯示驅動程式透過使用者模式顯示驅動程式的函式傳回參數) ,以傳統方式通知 Direct3D 執行時間的錯誤 (。 相反地,使用者模式顯示驅動程式必須使用 Direct3D 執行時間的 pfnSetErrorCb 回呼函式,將這類資訊傳回執行時間。 執行時間會在 D3D10DDI_CORELAYER_DEVICECALLBACKS 結構中提供其pfnSetErrorCb的指標,D3D10DDIARG_CREATEDEVICE結構的pUMCallbacks成員指向CreateDevice (D3D10) 函式的呼叫。

每個使用者模式顯示驅動程式函式的參考頁面會指定函式可以透過 對 pfnSetErrorCb的呼叫傳遞的錯誤。 這表示,如果使用者模式顯示驅動程式呼叫 pfnSetErrorCb 時,目前使用者模式顯示驅動程式函式不允許的錯誤碼,執行時間會判斷錯誤狀況很重要,並適當地運作。 因為執行時間會在pfnSetErrorCb期間適當地運作,所以您不應該預期呼叫pfnSetErrorCb ( E_FAIL ) 的效果可以藉由呼叫 pfnSetErrorCb ( S_OK ) 。 事實上,執行時間會判斷S_OK與E_FAIL相同或無效。 S_OK傳回碼的概念相當於使用者模式顯示驅動程式函式,完全不呼叫 pfnSetErrorCb

如果 Direct3D 執行時間判斷錯誤狀況很重要,它會先使用 Dr. Watson 記錄錯誤,這是預設的事後檢視 (Just-In-Time) 偵錯工具。 執行時間接著會基於目的遺失裝置,藉此模擬接收D3DDDIERR_DEVICEREMOVED錯誤碼的案例。 藉由要求驅動程式呼叫 pfnSetErrorCb 回呼函式,驅動程式所發生的每個錯誤都會有與其相關聯的實用呼叫堆疊,其機率會更大。 具有與錯誤相關聯的呼叫堆疊,可快速診斷和精確的 Dr. Watson 記錄。

當驅動程式程式碼發生錯誤時,您應該在驅動程式程式碼中使用 pfnSetErrorCb ,即使傳回執行時間不允許特定驅動程式函式的錯誤碼是由執行時間判斷為驅動程式 Bug 或問題。 使用者模式顯示驅動程式會更糟,以吸收重大錯誤並繼續。 使用者模式顯示驅動程式應該盡可能接近錯誤偵測點來呼叫 pfnSetErrorCb ,以提供有用的呼叫堆疊來進行事後偵錯。

下表列出 Direct3D 執行時間允許來自特定驅動程式函式的錯誤類別。

錯誤類別 意義

NoErrors

驅動程式不應該遇到任何錯誤,包括D3DDDIERR_DEVICEREMOVED。 執行時間會判斷 對 pfnSetErrorCb 的任何呼叫都很重要。

AllowDeviceRemoved

除了D3DDDIERR_DEVICEREMOVED以外,驅動程式不應該遇到任何錯誤。 執行時間會判斷對 pfnSetErrorCb 的任何呼叫都不會通過D3DDDIERR_DEVICEREMOVED非常重要。 如果裝置已移除,則不需要驅動程式才能傳回 DEVICEREMOVED。 不過,執行時間可讓驅動程式傳回 DEVICEREMOVED,以防 DEVICEREMOVED 干擾驅動程式函式,這通常不應該發生。

AllowOutOfMemory

驅動程式可能用盡記憶體。 因此,驅動程式可以透過 pfnSetErrorCb傳遞E_OUTOFMEMORY和D3DDDIERR_DEVICEREMOVED。 執行時間會判斷任何其他錯誤碼都很重要。

AllowCounterCreationErrors

驅動程式可能用盡記憶體。 驅動程式也可能因為計數器的獨佔本質而無法建立計數器。 因此,驅動程式可以透過 pfnSetErrorCb傳遞E_OUTOFMEMORY、DXGI_DDI_ERR_NONEXCLUSIVE和D3DDDIERR_DEVICEREMOVED。 執行時間會判斷任何其他錯誤碼都很重要。

AllowMapErrors

驅動程式應該檢查資源爭用。 因此,如果D3D10_DDI_MAP_FLAG_DONOTWAIT旗標傳遞至驅動程式的ResourceMap函式,驅動程式可以透過pfnSetErrorCb傳遞DXGI_DDI_ERR_WASSTILLDRAWING。 驅動程式也可以透過 pfnSetErrorCb傳遞D3DDDIERR_DEVICEREMOVED。 執行時間會判斷任何其他錯誤碼都很重要。

AllowGetDataErrors

驅動程式應該檢查查詢完成。 因此,如果查詢尚未完成,驅動程式可以透過 pfnSetErrorCb 傳遞DXGI_DDI_ERR_WASSTILLDRAWING。 驅動程式也可以透過 pfnSetErrorCb傳遞D3DDDIERR_DEVICEREMOVED。 執行時間會判斷任何其他錯誤碼都很重要。

AllowWKCheckCounterErrors

驅動程式的 CheckCounter 函式應該指出它是否支援任何執行時間定義的計數器。 因此,驅動程式可以透過 pfnSetErrorCb傳遞DXGI_DDI_ERR_UNSUPPORTED。 執行時間會判斷任何其他錯誤碼都很重要。

驅動程式無法傳回任何檢查類型函式的D3DDDIERR_DEVICEREMOVED。

AllowDDCheckCounterErrors

驅動程式應該驗證裝置相依計數器識別碼 (計數器識別碼) ,以確保計數器識別碼位於範圍內,而且有足夠的空間可將每個計數器字串複製到提供的緩衝區。 當參數以這種方式不正確時,驅動程式可以透過 pfnSetErrorCb傳遞E_INVALIDARG。

驅動程式無法傳回任何檢查類型函式的D3DDDIERR_DEVICEREMOVED。