ID3D10InfoQueue を使用してデバッグ出力をカスタマイズする (Direct3D 10)
情報キューは、デバッグ メッセージを格納、取得、およびフィルター処理する インターフェイス (ID3D10InfoQueue インターフェイスを参照) によって管理されます。 キューは、メッセージ キュー、オプションのストレージ フィルター スタック、およびオプションの取得フィルター スタックで構成されます。 ストレージ フィルター スタックを使用して、格納するメッセージをフィルター処理できます。取得フィルター スタックを使用して、格納するメッセージをフィルター処理できます。 メッセージをフィルター処理すると、メッセージがデバッグ ウィンドウに出力され、適切なスタックに格納されます。
一般的には次のとおりです。
- ID3D10InfoQueue::AddApplicationMessage を呼び出してユーザー定義メッセージを生成する
- 呼び出し ID3D10InfoQueue::GetMessage は、(オプションの取得フィルターを渡す) メッセージを取得するために使用されます。
レジストリ コントロール
レジストリ キーを使用して、フィルター設定の調整、ブレークポイントの調整、デバッグ出力のミュートを行います。 デバッグ レイヤーは、レジストリ キーのこれらのパスをチェックします。最初に見つかったパスが使用されます。
- HKCU\Software\Microsoft\Direct3D\<ユーザー定義サブキー>
- HKLM\Software\Microsoft\Direct3D\<ユーザー定義サブキー>
- 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::AddStorageFilterEntries の pFilter 引数は、許可リストと拒否リストを含む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 );
関連トピック