次の方法で共有


ID3D10InfoQueue を使用してデバッグ出力をカスタマイズする (Direct3D 10)

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

一般的には次のとおりです。

レジストリ コントロール

レジストリ キーを使用して、フィルター設定の調整、ブレークポイントの調整、デバッグ出力のミュートを行います。 デバッグ レイヤーは、レジストリ キーのこれらのパスをチェックします。最初に見つかったパスが使用されます。

  1. HKCU\Software\Microsoft\Direct3D\<ユーザー定義サブキー>
  2. HKLM\Software\Microsoft\Direct3D\<ユーザー定義サブキー>
  3. HKCU\Software\Microsoft\Direct3D

この場合、

  • HKEY_CURRENT_USER用 HKCU スタンド、HKEY_LOCAL_MACHINE用 HKLM スタンド。
  • <ユーザー定義サブキー> は、アプリケーションのデバッグ設定を格納するための任意の名前です

レジストリ キーを使用したデバッグ メッセージのフィルター処理

レジストリに InfoQueueStorageFilterOverride キー (および が 0 以外) が含まれている場合は、次のレジストリ コントロールを追加してメッセージ (およびデバッグ出力) をフィルター処理できます。

  • DWORD Mute_CATEGORY_* - このキーが 0 以外の場合に出力をデバッグします。
  • DWORD Mute_SEVERITY_* - このキーが 0 以外の場合、デバッグ出力は無効になります。
  • DWORD Mute_ID_* - メッセージ名または番号を * に使用できます (前述のBreakOn_ID_* の場合と同様)。 このキーが 0 以外の場合、デバッグ出力は無効になります。
  • DWORD Unmute_SEVERITY_INFO - このキーが 0 以外の場合、デバッグ出力は有効になります。 既定では、InfoQueueStorageFilterOverride が有効になっている場合、重大度 INFO を持つデバッグ メッセージはミュートされます。そのため、このキーでは INFO をオンに戻すことができます。

これらのコントロールは、メッセージを記録するか表示するかを変更します。API が成功するか失敗したかには影響しません。

レジストリ キーを使用した中断条件の設定

アプリケーションは、次のレジストリ キーを使用して、メッセージを強制的に中断させることができます。

EnableBreakOnMessage - このキーを使用すると、メッセージの中断が有効になります (また、i の SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID() 設定は無視されます)。 中断する実際のメッセージは、以下に定義されている 1 つ以上のBreakOn_* 値を使用して定義されます。

  • BreakOn_CATEGORY_* - ストレージ フィルターを通過するメッセージを中断します。 * は、D3D10_MESSAGE_CATEGORYメッセージの 1 つです。
  • BreakOn_SEVERITY_* - ストレージ フィルターを通過するメッセージを中断します。 * は、D3D10_MESSAGE_SEVERITY_ メッセージの 1 つです。
  • BreakOn_ID_* - ストレージ フィルターを通過するメッセージを中断します。 * は、D3D10_MESSAGE_ID_ メッセージの 1 つです。エラー列挙の数値を指定することもできます。 たとえば、ID "D3D10_MESSAGE_ID_HYPOTHETICAL" のメッセージのD3D10_MESSAGE_ID列挙に値 123 があるとします。 この場合、値 BreakOn_ID_HYPOTHETICAL=1 または BreakOn_ID_123=1 を作成すると、どちらも同じことが実現されます。ID D3D10_MESSAGE_ID_HYPOTHETICALを持つメッセージが見つかったときに中断します。

レジストリ キーを使用したデバッグ出力のミュート

デバッグ出力は、MuteDebugOutput キーを使用してミュートできます。 レジストリにこの値が存在すると、InfoQueue の ID3D10InfoQueue::SetMuteDebugOutput メソッドが強制的にオーバーライドされます。 MuteDebugOutput は、ストレージ フィルターを渡すメッセージがデバッグ出力に送信されないようにします。

デバッグ レイヤー メッセージの無効化

デバッグ レイヤー メッセージは、 ID3D10InfoQueue::AddStorageFilterEntries を使用してフィルターを指定することで、個別に無効にすることも、実行時にグループとして無効にすることもできます。 ID3D10InfoQueue::AddStorageFilterEntriespFilter 引数は、許可リストと拒否リストを含むD3D10_INFO_QUEUE_FILTER構造体を受け取ります。 許可リストと拒否リストは、catergory、severity、および個々のメッセージ ID でフィルター処理を指定できる D3D10_INFO_QUEUE_FILTER_DESC構造体によって 記述されます。

次のコードは、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 レイヤー

API 機能 (Direct3D 10)