ID3D10InfoQueue によるデバッグ出力のカスタマイズ (Direct3D 10)
情報キューは、デバッグ メッセージを格納、取得、およびフィルターするインターフェイス (「ID3D10InfoQueue インターフェイス」を参照) によって管理されます。このキューは、メッセージ キュー、オプションのストレージ フィルター スタックおよびの取得フィルター スタックから構成されます。ストレージ フィルター スタックは、格納するメッセージのフィルターに使用できます。また、取得フィルター スタックは取得するメッセージのフィルターに使用できます。フィルターされたメッセージは、デバッグ ウィンドウに出力され、適切なスタックに格納されます。
通常は次のように実行します。
- ユーザー定義メッセージを生成するには、ID3D10InfoQueue::AddApplicationMessage を呼び出します。
- オプションの取得フィルターを渡すメッセージを取得するには、ID3D10InfoQueue::GetMessage 呼び出しを使用します。
レジストリのコントロール
フィルター設定の調整、ブレーク ポイントの調整、およびデバッグ出力のミュートにはレジストリ キーを使用します。デバッグ レイヤーは、レジストリ キーの以下のパスをチェックし、最初に見つかったパスを使用します。
- HKCU¥Software¥Microsoft¥Direct3D¥<ユーザー定義のサブキー>
- HKLM¥Software¥Microsoft¥Direct3D¥<ユーザー定義のサブキー>
- HKCU¥Software¥Microsoft¥Direct3D
この場合
- HKCU は HKEY_CURRENT_USER を、HKLM は HKEY_LOCAL_MACHINE を表します。
- ユーザー定義のサブキーは任意の名前で、ここにはアプリケーションに対するデバッグ設定が格納されます。
レジストリ キーを使用したデバッグ メッセージのフィルター
レジストリに (0 ではない) InfoQueueStorageFilterOverride キーがある場合、次のレジストリ コントロールを追加することにより、メッセージ (およびデバッグ出力) をフィルターすることができます。
- DWORD Mute_CATEGORY_* - このキーが 0 ではない場合のデバッグ出力です。
- DWORD Mute_SEVERITY_* - このキーが 0 ではない場合、デバッグ出力は無効化されます。
- DWORD Mute_ID_* - * に対して使用できるメッセージ名または番号です (前述の BreakOn_ID_* と同じ)。このキーが 0 ではない場合、デバッグ出力は無効化されます。
- DWORD Unmute_SEVERITY_INFO - このキーが 0 ではない場合、デバッグ出力は有効化されます。既定の設定では、InfoQueueStorageFilterOverride が有効化されている場合、重大度が INFO のデバッグ メッセージはミュートされます。したがって、このキーによって、INFO をオンに戻すことが可能です。
これらのコントロールは、メッセージが記録されるか、表示されるかを変更します。API の合格、不合格には影響しません。
レジストリ キーを使用したブレーク条件の設定
メッセージでアプリケーションを強制的にブレークするには、次のレジストリ キーを使用します。
EnableBreakOnMessage - メッセージでブレークするためのキーです (また、SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID() 設定が無視されるようになります)。ブレークする実際のメッセージは、以下の BreakOn_* 値 (複数可) を使用して定義します。
- BreakOn_CATEGORY_* - ストレージ フィルターを通過したメッセージでブレークします。* は D3D10_MESSAGE_CATEGORY メッセージの 1 つです。
- BreakOn_SEVERITY_* - ストレージ フィルターを通過したメッセージでブレークします。* は D3D10_MESSAGE_SEVERITY_ メッセージの 1 つです。
- BreakOn_ID_* - ストレージ フィルターを通過したメッセージでブレークします。* は D3D10_MESSAGE_ID_ メッセージの 1 つです。エラー列挙の数値を指定することもできます。たとえば、"D3D10_MESSAGE_ID_HYPOTHETICAL" という ID を持つメッセージの D3D10_MESSAGE_ID 列挙の値が 123 であるとします。この場合、BreakOn_ID_HYPOTHETICAL=1 の値を作成したときも、BreakOn_ID_123=1 の値を作成したときも、同じ結果が得られます。つまり、D3D10_MESSAGE_ID_HYPOTHETICAL という ID のメッセージが検出されるとブレークします。
レジストリ キーを使用したデバッグ出力のミュート
デバッグ出力のミュートには、MuteDebugOutput キーを使用します。レジストリにこの値が存在すると、InfoQueue の ID3D10InfoQueue::SetMuteDebugOutput メソッドのオーバーライドが強制的に行われます。MuteDebugOutput は、ストレージ フィルターを通過したメッセージがデバッグ出力へ送信されるのを阻止します。
デバッグ レイヤー メッセージの無効化
実行時に個々のデバッグ レイヤー メッセージまたはデバッグ レイヤー メッセージのグループを無効にするには、ID3D10InfoQueue::AddStorageFilterEntries を使用してフィルターを指定します。ID3D10InfoQueue::AddStorageFilterEntries の pFilter 引数は、許可リストと拒否リストを格納した D3D10_INFO_QUEUE_FILTER 構造体を取ります。許可リストと拒否リストは D3D10_INFO_QUEUE_FILTER_DESC 構造体によって記述され、カテゴリ、重大度、および個々のメッセージ ID によるフィルタリングの指定が可能です。
次のコードは、D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL メッセージを拒否するように ID3D10InfoQueue インターフェイス を設定する例です。
//retrieve the ID3D10InfoQueue from a Direct3D device created with the D3D10_CREATE_DEVICE_DEBUG flag ID3D10InfoQueue * pInfoQueue; g_pd3dDevice->QueryInterface( __uuidof(ID3D10InfoQueue), (void **)&pInfoQueue ); //set up the list of messages to filter D3D10_MESSAGE_ID messageIDs [] = { D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL }; //set the DenyList to use the list of messages D3D10_INFO_QUEUE_FILTER filter = { 0 }; filter.DenyList.NumIDs = 1; filter.DenyList.pIDList = messageIDs; //apply the filter to the info queue pInfoQueue->AddStorageFilterEntries( &filter );