Udostępnij przez


Dostosuj dane wyjściowe debugowania za pomocą ID3D10InfoQueue (Direct3D 10)

Kolejka informacji jest zarządzana przez interfejs (zobacz ID3D10InfoQueue Interface), który przechowuje, pobiera i filtruje komunikaty debugowania. Kolejka składa się z: kolejki komunikatów, opcjonalnych stosów filtrów magazynowania i opcjonalnych stosów filtrów pobierania. Stos filtrów magazynowania może służyć do filtrowania komunikatów, które mają być przechowywane; stos filtrów pobierania może służyć do filtrowania komunikatów, które mają być pobierane. Po przefiltrowanym komunikacie komunikat zostanie wyświetlony w oknie debugowania i zapisany w odpowiednim stosie.

Ogólnie rzecz biorąc:

Kontrolki rejestru

Użyj kluczy rejestru, aby dostosować ustawienia filtru, punkty przerwania i wyciszyć wyjście debugowania. Warstwa debugowania sprawdzi te ścieżki pod kątem kluczy rejestru; zostanie użyta pierwsza znaleziona ścieżka.

  1. HKCU\Software\Microsoft\Direct3D\<podklucz zdefiniowany przez użytkownika>
  2. HKLM\Software\Microsoft\Direct3D\<podklucz zdefiniowany przez użytkownika>
  3. HKCU\Software\Microsoft\Direct3D

Gdzie:

  • HKCU oznacza HKEY_CURRENT_USER, a HKLM oznacza HKEY_LOCAL_MACHINE.
  • <podklucz zdefiniowany przez użytkownika> jest dowolną nazwą do przechowywania ustawień debugowania dla aplikacji

Filtrowanie komunikatów debugowania przy użyciu kluczy rejestru

Jeśli rejestr zawiera klucz InfoQueueStorageFilterOverride (i jest inny niż zero), komunikaty (i dane wyjściowe debugowania) można filtrować, dodając następujące kontrolki rejestru.

  • DWORD Mute_CATEGORY_* — debuguj dane wyjściowe, jeśli ten klucz jest inny niż zero.
  • DWORD Mute_SEVERITY_*: wyjście debugowania jest wyłączone, jeśli ten klucz jest inny niż zero.
  • DWORD Mute_ID_* — nazwa lub numer wiadomości mogą być używane dla * (podobnie jak w przypadku BreakOn_ID_* opisanych wcześniej). Dane wyjściowe debugowania są wyłączone, jeśli ten klucz jest inny niż zero.
  • DWORD Unmute_SEVERITY_INFO — wyjście debugowania jest włączone, jeśli ten klucz ma wartość inną niż zero. Domyślnie, po włączeniu funkcji InfoQueueStorageFilterOverride, komunikaty debugowania o poziomie INFO są wyciszone — dlatego ten klucz pozwala na ponowne ich włączenie.

Te kontrolki zmieniają, czy komunikat jest rejestrowany, czy wyświetlany; nie mają wpływu na to, czy interfejs API przechodzi lub kończy się niepowodzeniem.

Ustawianie warunków przerwania przy użyciu kluczy rejestru

Aplikacje mogą być wymuszane na przerwanie komunikatu przy użyciu następujących kluczy rejestru.

EnableBreakOnMessage — ten klucz umożliwia zatrzymywanie na komunikatach (i powoduje ignorowanie ustawień SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID()). Faktyczne komunikaty, na których należy przerwać, są zdefiniowane przy użyciu jednej lub więcej wartości BreakOn_*, zdefiniowanych poniżej.

  • BreakOn_CATEGORY_* — Przerwij na komunikaty przechodzące przez filtry pamięci masowej. * jest jednym z komunikatów kategorii D3D10_MESSAGE_CATEGORY.
  • BreakOn_SEVERITY_* — przerwij przy dowolnym komunikacie przechodzącym przez filtry pamięci masowej. * jest jednym z komunikatów D3D10_MESSAGE_SEVERITY_.
  • BreakOn_ID_* — Przerwij na każdym komunikacie przechodzącym przez filtry pamięci. * jest jednym z komunikatów D3D10_MESSAGE_ID_ lub może być wartością liczbową wyliczenia błędu. Na przykład, załóżmy, że komunikat o identyfikatorze "D3D10_MESSAGE_ID_HYPOTHETICAL" miał wartość 123 w wyliczeniu D3D10_MESSAGE_ID. W takim przypadku utworzenie wartości BreakOn_ID_HYPOTHETICAL=1 lub BreakOn_ID_123=1 spowoduje przerwanie działania po napotkaniu komunikatu o identyfikatorze D3D10_MESSAGE_ID_HYPOTHETICAL.

Wyciszanie wyników debugowania przy użyciu kluczy rejestru

Dane wyjściowe debugowania można wyciszyć przy użyciu klucza MuteDebugOutput. Obecność tej wartości w rejestrze wymusza zastąpienie metody ID3D10InfoQueue::SetMuteDebugOutput. MuteDebugOutput zatrzymuje komunikaty, które przechodzą przez filtr magazynowania, aby nie zostały wysłane do danych wyjściowych debugowania.

Wyłączanie komunikatów warstwy debugowania

Komunikaty warstwy debugowania można wyłączyć pojedynczo lub w grupie w trakcie działania, określając filtry przy użyciu ID3D10InfoQueue::AddStorageFilterEntries. Argument pFilter do ID3D10InfoQueue::AddStorageFilterEntries przyjmuje strukturę D3D10_INFO_QUEUE_FILTER zawierającą listę dozwolonych i listę odmowy. Listy dozwolonych i niedozwolonych są opisane przez struktury D3D10_INFO_QUEUE_FILTER_DESC, które umożliwiają określenie filtrowania według kategorii, stopnia ważności oraz indywidualnego identyfikatora komunikatu.

Poniższy kod to przykład konfigurowania interfejsu ID3D10InfoQueue, aby zablokować komunikat 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 );  

warstwy interfejsu API

Funkcje API (Direct3D 10)