次の方法で共有


ID3D10InfoQueue によるデバッグ出力のカスタマイズ (Direct3D 10)

情報キューは、デバッグ メッセージを格納、取得、およびフィルターするインターフェイス (「ID3D10InfoQueue インターフェイス」を参照) によって管理されます。このキューは、メッセージ キュー、オプションのストレージ フィルター スタックおよびの取得フィルター スタックから構成されます。ストレージ フィルター スタックは、格納するメッセージのフィルターに使用できます。また、取得フィルター スタックは取得するメッセージのフィルターに使用できます。フィルターされたメッセージは、デバッグ ウィンドウに出力され、適切なスタックに格納されます。

通常は次のように実行します。

レジストリのコントロール

フィルター設定の調整、ブレーク ポイントの調整、およびデバッグ出力のミュートにはレジストリ キーを使用します。デバッグ レイヤーは、レジストリ キーの以下のパスをチェックし、最初に見つかったパスを使用します。

  1. HKCU¥Software¥Microsoft¥Direct3D¥<ユーザー定義のサブキー>
  2. HKLM¥Software¥Microsoft¥Direct3D¥<ユーザー定義のサブキー>
  3. 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::AddStorageFilterEntriespFilter 引数は、許可リストと拒否リストを格納した 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 );   

関連項目

API の機能 (Direct3D 10)