Personalizzare l'output di debug con ID3D10InfoQueue (Direct3D 10)

La coda di informazioni viene gestita da un'interfaccia (vedere ID3D10InfoQueue Interface) che archivia, recupera e filtra i messaggi di debug. La coda è costituita da: una coda di messaggi, uno stack di filtri di archiviazione facoltativo e uno stack di filtri di recupero facoltativo. Lo stack di filtri di archiviazione può essere usato per filtrare i messaggi archiviati; lo stack di filtri di recupero può essere usato per filtrare i messaggi archiviati. Dopo aver filtrato un messaggio, il messaggio verrà stampato nella finestra di debug e archiviato nello stack appropriato.

In generale:

Controlli del Registro di sistema

Usare le chiavi del Registro di sistema per modificare le impostazioni di filtro, regolare i punti di interruzione e disattivare l'output di debug. Il livello di debug verificherà questi percorsi per le chiavi del Registro di sistema; verrà usato il primo percorso trovato.

  1. HKCU\Software\Microsoft\Direct3D\<sottochiave definite dall'utente>
  2. HKLM\Software\Microsoft\Direct3D\<sottochiave definite dall'utente>
  3. HKCU\Software\Microsoft\Direct3D

Dove:

  • HKCU stand for HKEY_CURRENT_USER e HKLM stand for HKEY_LOCAL_MACHINE.
  • <la sottochiave> definita dall'utente è un nome arbitrario per archiviare le impostazioni di debug per un'applicazione

Filtro dei messaggi di debug tramite chiavi del Registro di sistema

Se il Registro di sistema contiene una chiave InfoQueueStorageFilterOverride (e non zero), i messaggi (e l'output di debug) possono essere filtrati aggiungendo i controlli del Registro di sistema seguenti.

  • DWORD Mute_CATEGORY_* - Eseguire il debug dell'output se questa chiave non è zero.
  • DWORD Mute_SEVERITY_* - L'output di debug è disabilitato se questa chiave non è zero.
  • DWORD Mute_ID_* - Nome messaggio o numero può essere usato per * (come per BreakOn_ID_* descritto in precedenza). L'output di debug è disabilitato se questa chiave non è zero.
  • DWORD Unmute_SEVERITY_INFO: l'output di debug è ABILITATO se questa chiave non è zero. Per impostazione predefinita, quando InfoQueueStorageFilterOverride è abilitato, i messaggi di debug con informazioni di gravità vengono disattivati, pertanto per questa chiave le informazioni possono essere riattivate.

Questi controlli cambiano se un messaggio viene registrato o visualizzato; non influiscono sul fatto che un'API passi o abbia esito negativo.

Impostazione delle condizioni di interruzione usando le chiavi del Registro di sistema

È possibile forzare l'interruzione delle applicazioni in un messaggio usando le chiavi del Registro di sistema seguenti.

EnableBreakOnMessage : questa chiave consente l'interruzione dei messaggi (e causa l'ignorare le impostazioni SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID(). I messaggi effettivi da interrompere sono definiti usando uno o più valori BreakOn_* definiti di seguito.

  • BreakOn_CATEGORY_* - Interruzione su qualsiasi messaggio che passa attraverso i filtri di archiviazione. * è uno dei messaggi D3D10_MESSAGE_CATEGORY.
  • BreakOn_SEVERITY_* - Interruzione su qualsiasi messaggio che passa attraverso i filtri di archiviazione. * è uno dei messaggi D3D10_MESSAGE_SEVERITY_.
  • BreakOn_ID_* - Interruzione su qualsiasi messaggio che passa attraverso i filtri di archiviazione. * è uno dei messaggi D3D10_MESSAGE_ID_ o può essere il valore numerico dell'enumerazione degli errori. Si supponga, ad esempio, che il messaggio con ID "D3D10_MESSAGE_ID_HYPOTHETICAL" abbia il valore 123 nell'enumerazione D3D10_MESSAGE_ID. In questo caso, la creazione del valore BreakOn_ID_HYPOTHETICAL=1 o BreakOn_ID_123=1 esegue entrambe la stessa operazione, interrompendo quando viene rilevato un messaggio con ID D3D10_MESSAGE_ID_HYPOTHETICAL.

Modifica dell'output di debug con chiavi del Registro di sistema

L'output di debug può essere disattivato usando una chiave MuteDebugOutput. La presenza di questo valore nel registro forza l'override del metodo ID3D10InfoQueue::SetMuteDebugOutput . MuteDebugOutput arresta i messaggi che passano il filtro di archiviazione da inviare all'output di debug.

Disabilitazione dei messaggi di livello di debug

I messaggi del livello di debug possono essere disabilitati singolarmente o come gruppo in fase di esecuzione specificando filtri usando ID3D10InfoQueue::AddStorageFilterEntries. L'argomento pFilter in ID3D10InfoQueue::AddStorageFilterEntries accetta una struttura D3D10_INFO_QUEUE_FILTER che contiene un elenco consenti e un elenco di rifiuto. Gli elenchi consenti e nega vengono descritti dalle strutture D3D10_INFO_QUEUE_FILTER_DESC che consentono di specificare il filtro da parte di catergory, gravità e ID singolo messaggio.

Il codice seguente è un esempio di configurazione dell'interfaccia ID3D10InfoQueue per negare il messaggio di 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 );  

Livelli API

Funzionalità API (Direct3D 10)