Share via


使用 ID3D10InfoQueue (Direct3D 10) 自訂偵錯輸出

資訊佇列是由介面管理, (請參閱 ID3D10InfoQueue 介面) 儲存、擷取和篩選偵錯訊息。 佇列包含:訊息佇列、選擇性儲存體篩選堆疊,以及選擇性的擷取篩選堆疊。 儲存體篩選堆疊可用來篩選您想要儲存的訊息;擷取篩選堆疊可用來篩選您想要儲存的訊息。 篩選訊息之後,訊息將會列印到偵錯視窗,並儲存在適當的堆疊中。

一般而言:

登錄控制項

使用登錄機碼來調整篩選設定、調整中斷點,以及將偵錯輸出設為靜音。 偵錯層會檢查這些登錄機碼的路徑;將會使用找到的第一個路徑。

  1. HKCU\Software\Microsoft\Direct3D\ < user-defined 子機碼>
  2. HKLM\Software\Microsoft\Direct3D\ < user-defined 子機碼>
  3. HKCU\Software\Microsoft\Direct3D

其中:

  • HKCU 代表HKEY_CURRENT_USER,而 HKLM 則為 HKEY_LOCAL_MACHINE。
  • <使用者定義的子機碼 > 是任意名稱,用來儲存應用程式的偵錯設定

使用登錄機碼篩選偵錯訊息

如果登錄包含 InfoQueueStorageFilterOverride 機碼 (且非零) ,則可以藉由新增下列登錄控制項來篩選訊息 (和偵錯輸出) 。

  • DWORD Mute_CATEGORY_* - 如果此機碼為非零,偵錯輸出。
  • DWORD Mute_SEVERITY_* - 如果此機碼為非零,則會停用偵錯輸出。
  • DWORD Mute_ID_* - 訊息名稱或號碼可用於 * (,就像先前) 所述BreakOn_ID_* 一樣。 如果此機碼為非零,則會停用偵錯輸出。
  • DWORD Unmute_SEVERITY_INFO - 如果此機碼為非零,偵錯輸出會啟用。 根據預設,啟用 InfoQueueStorageFilterOverride 時,具有嚴重性 INFO 的偵錯訊息會設為靜音,因此,此機碼允許重新開啟 INFO。

這些控制項會變更訊息是記錄還是顯示;它們不會影響 API 通過或失敗。

使用登錄機碼設定中斷條件

應用程式可以使用下列登錄機碼強制在訊息上中斷。

EnableBreakOnMessage - 此金鑰可讓訊息 (中斷,並讓 i 的 SetBreakOnCategory () /SetBreakOnSeverity () /SetBreakOnID () 設定忽略) 。 要中斷的實際訊息是使用以下定義的一或多個BreakOn_* 值來定義。

  • BreakOn_CATEGORY_* - 中斷任何通過儲存體篩選器的訊息。 * 是其中一個D3D10_MESSAGE_CATEGORY訊息。
  • BreakOn_SEVERITY_* - 中斷任何通過儲存體篩選器的訊息。 * 是其中一個D3D10_MESSAGE_SEVERITY_訊息。
  • BreakOn_ID_* - 中斷任何通過儲存體篩選的訊息。 * 是其中一個D3D10_MESSAGE_ID_訊息,也可以是錯誤列舉的數值。 例如,假設識別碼為 「D3D10_MESSAGE_ID_HYPOTHETICAL」 的訊息具有 D3D10_MESSAGE_ID 列舉中的值 123。 在此情況下,建立值 BreakOn_ID_HYPOTHETICAL=1 或 BreakOn_ID_123=1 會完成相同的動作 - 遇到識別碼D3D10_MESSAGE_ID_HYPOTHETICAL訊息時中斷。

使用登錄機碼將偵錯輸出設為靜音

偵錯輸出可以使用 MuteDebugOutput 索引鍵進行靜音。 登錄中存在這個值會強制覆寫 InfoQueue 的 ID3D10InfoQueue::SetMuteDebugOutput 方法。 MuteDebugOutput 會停止將儲存體篩選準則傳送至偵錯輸出的訊息。

停用偵錯層訊息

您可以藉由使用 ID3D10InfoQueue::AddStorageFilterEntries指定篩選,在執行時間將偵錯層訊息停用為群組。 ID3D10InfoQueue::AddStorageFilterEntriespFilter引數會採用包含允許清單和拒絕清單的D3D10_INFO_QUEUE_FILTER結構。 允許和拒絕清單是由 D3D10_INFO_QUEUE_FILTER_DESC 結構所描述,這些結構允許依類別、嚴重性和個別訊息識別碼來指定篩選。

下列程式碼是設定 ID3D10InfoQueue 介面 來拒絕D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL訊息的範例。

  //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) API 功能