次の方法で共有


エラーの処理

Direct3D バージョン 10 は、通常、ユーザー モードのディスプレイ ドライバーが実装する関数は、戻り値のパラメーター型の VOID を持ちます。 このルールの主な例外は、CalcPrivateObjTypeSize-type 関数 (CalcPrivateResourceSize 関数など) です。 この型の関数は、CreateObjType 型関数 (CreateResource(D3D10) など) を使用して特定のオブジェクト型を作成するためにドライバーが必要とするメモリ領域のサイズを示すSIZE_Tパラメーター型を返します。

VOID を返すと、ユーザー モードのディスプレイ ドライバーは、従来の方法 (つまり、ユーザー モードのディスプレイ ドライバーの関数の戻りパラメーターを介して) で Direct3D ランタイムにエラーを通知できなくなります。 代わりに、ユーザー モード ディスプレイ ドライバーは、Direct3D ランタイムの pfnSetErrorCb コールバック関数を使用して、このような情報をランタイムに渡す必要があります。 ランタイムは、D3D10DDIARG_CREATEDEVICE構造体のpUMCallbacks メンバーが CreateDevice(D3D10) 関数の呼び出しで指すD3D10DDI_CORELAYER_DEVICECALLBACKS構造体内の pfnSetErrorCb へのポインターを提供します。

各ユーザー モード ディスプレイ ドライバー関数の参照ページでは、pfnSetErrorCb の呼び出しを通じて関数が渡すことができるエラーを 指定します。 つまり、現在のユーザー モード ディスプレイ ドライバー関数に対して許可されていないエラー コードを使用してユーザー モード ディスプレイ ドライバーが pfnSetErrorCb を呼び出した場合、ランタイムはエラー状態が重大であると判断し、適切に動作します。 ランタイムは pfnSetErrorCb 中に適切に動作するため、pfnSetErrorCb( S_OK ) などの呼び出しによって pfnSetErrorCb( E_FAIL ) を呼び出す効果を元に戻すことができるとは想定しないでください。 実際、ランタイムは、S_OKがE_FAILと同様に無効または重大であると判断します。 S_OKリターン コードの概念は、pfnSetErrorCb をまったく呼び出さないユーザー モードのディスプレイ ドライバー関数と同じです。

Direct3D ランタイムは、エラー状態が重大であると判断すると、まずワトソン博士 (既定の事後分析 (Just-In-Time) デバッガー) でエラーをログに記録してアクションを実行します。 その後、ランタイムは意図的にデバイスを失い、D3DDDIERR_DEVICEREMOVEDエラー コードを受信するシナリオをエミュレートします。 pfnSetErrorCb コールバック関数を呼び出すようドライバーに要求することで、ドライバーから出てくるすべてのエラーに便利な呼び出し履歴が関連付けられる確率が大幅に高くなります。 エラーにコールスタックを関連付けることで、迅速な診断と正確なワトソン博士のログが可能になります。

ランタイムが特定のドライバー関数に対して許可しないエラー コードを返す場合は、ドライバーのバグまたは問題としてランタイムによって決定される場合でも、ドライバー コードで pfnSetErrorCb を使用する必要があります。 ユーザー モードのディスプレイ ドライバーが重大なエラーを吸収して続行することはさらに悪いことです。 ユーザー モードのディスプレイ ドライバーは、エラー検出のポイントにできるだけ近い pfnSetErrorCb を呼び出して、事後デバッグに役立つ呼び出し履歴を提供する必要があります。

次の表は、Direct3D ランタイムが特定のドライバー関数から許可するエラーのカテゴリの一覧です。

エラーのカテゴリ 意味

NoErrors

ドライバーは、D3DDDIERR_DEVICEREMOVEDを含むエラーに遭遇しないはずです。 ランタイムは、pfnSetErrorCb の呼び出しが重要であると判断します。

AllowDeviceRemoved

ドライバーは、D3DDDIERR_DEVICEREMOVED 以外のエラーに遭遇しないはずです。 ランタイムは、D3DDDIERR_DEVICEREMOVEDを渡さない pfnSetErrorCb への呼び出しが重要であると判断します。 デバイスが取り外されている場合、ドライバーは 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

ドライバーは、デバイスに依存するカウンター識別子 (カウンター ID) を検証して、カウンター ID が範囲内にあり、各カウンター文字列を指定されたバッファーにコピーするのに十分な領域があることを確認する必要があります。 この方法でパラメーターが正しくない場合、ドライバーは pfnSetErrorCb を介してE_INVALIDARGを渡すことができます。

ドライバーは、チェックの種類の関数のD3DDDIERR_DEVICEREMOVEDを返すことはできません。