Udostępnij przez


Weryfikacja oparta na procesorze GPU i warstwa debugowania Direct3D 12

W tym temacie opisano, jak najlepiej wykorzystać warstwę debugowania Direct3D 12. Walidacja oparta na procesorze GPU (GBV) umożliwia scenariusze walidacji na osi czasu procesora GPU, które nie są możliwe podczas wywołań interfejsu API na procesorze CPU. GbV jest dostępny począwszy od narzędzi graficznych dla rocznicowej aktualizacji systemu Windows 10.

Cel weryfikacji opartej na procesorze GPU

Walidacja oparta na procesorze GPU pomaga zidentyfikować następujące błędy:

  • Używanie niezainicjowanych lub niezgodnych deskryptorów w cieniatorze.
  • Używanie deskryptorów odwołująjących się do usuniętych zasobów w cieniowaniu.
  • Walidacja promowanych stanów zasobów i rozkładu stanu zasobu.
  • Indeksowanie poza końcem stert deskryptora w cieniowaniu.
  • Moduł cieniowania uzyskuje dostęp do zasobów w stanie niezgodnym.
  • Użycie niezainicjowanych lub niezgodnych przykładów w cieniatorze.

GbV działa przez utworzenie poprawek cieniujących, które zostały dodane bezpośrednio do cieniowania. Poprawki cieniowania sprawdzają argumenty główne i zasoby dostępne podczas wykonywania cieniowania i zgłaszają błędy w buforze dziennika. GbV wprowadza również dodatkowe operacje i wywołania Dispatch do list poleceń aplikacji w celu zweryfikowania i śledzenia zmian stanu zasobu nałożonego przez listę poleceń na osi czasu procesora GPU.

Ponieważ GBV wymaga możliwości wykonywania cieniowania, listy poleceń COPY są emulowane przez listę poleceń COMPUTE. Może to spowodować zmianę sposobu wykonywania kopii przez sprzęt, chociaż wynik końcowy nie powinien być zmieniany. Aplikacja nadal będzie widzieć, że są to listy poleceń COPY, a warstwa debugowania zweryfikuje je jako takie.

Włączanie weryfikacji opartej na procesorze GPU

GbV można wymusić przy użyciu Panelu sterowania DirectX (DXCPL), wymuszając warstwę debugowania Direct3D 12 i dodatkowo wymuszając weryfikację opartą na procesorze GPU (nowa karta w panelu sterowania). Po włączeniu gbv pozostanie włączony do momentu wydania urządzenia Direct3D 12. Alternatywnie gbV można włączyć programowo przed utworzeniem urządzenia Direct3D 12:

void EnableShaderBasedValidation()
{
    CComPtr<ID3D12Debug> spDebugController0;
    CComPtr<ID3D12Debug1> spDebugController1;
    VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
    VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
    spDebugController1->SetEnableGPUBasedValidation(true);
}

Ogólnie rzecz biorąc, w większości przypadków należy uruchomić kod z włączoną warstwą debugowania. Jednak GBV może spowolnić wiele rzeczy. Deweloperzy mogą rozważyć włączenie gbV z mniejszymi zestawami danych (na przykład pokazy aparatu lub małe poziomy gier z mniejszą liczbą zasobów i pso) lub w trakcie wczesnego wywołania aplikacji w celu zmniejszenia problemów z wydajnością. W przypadku większej zawartości rozważ włączenie GBV na jednej lub dwóch maszynach testowych w nocnym teście testowym.

Debugowanie danych wyjściowych

GbV generuje dane wyjściowe debugowania po wywołaniu polecenia executeCommandLists kończy wykonywanie na procesorze GPU. Ponieważ znajduje się to na osi czasu procesora GPU, dane wyjściowe debugowania mogą być asynchroniczne z inną walidacją osi czasu procesora CPU. Deweloperzy aplikacji mogą chcieć wstrzyknąć własne oczekiwania po wykonaniu, aby zsynchronizować dane wyjściowe debugowania.

Dane wyjściowe GBV identyfikują, gdzie w cieniowaniu wystąpił błąd, wraz z bieżącą liczbą rysowania/wysyłania i tożsamościami powiązanych obiektów (np. listy poleceń, kolejki, PSO itp.).

Przykładowy komunikat debugowania

Poniższy komunikat o błędzie wskazuje, że zasób o nazwie "Main Color Buffer" był dostępny w cieniatorze jako zasób cieniowania, ale był w stanie nieurządzanego dostępu, gdy cieniowanie zostało uruchomione na procesorze GPU. Podano również dodatkowe informacje, takie jak lokalizacja w źródle cieniowania, nazwa listy poleceń i liczba rysów (Indeks rysowania) oraz nazwy powiązanych obiektów interfejsu D3D.

D3D12 ERROR: Incompatible resource state: Resource: 0x0000016F61A6EA80:'Main Color Buffer', 
Subresource Index: [0], 
Descriptor heap index: [0], 
Binding Type In Descriptor: SRV, 
Resource State: D3D12_RESOURCE_STATE_UNORDERED_ACCESS(0x8), 
Shader Stage: PIXEL, 
Root Parameter Index: [0], 
Draw Index: [0], 
Shader Code: E:\FileShare\MiniEngine_GitHub_160128\MiniEngine_GitHub\Core\Shaders\SharpeningUpsamplePS.hlsl(37,2-59), 
Asm Instruction Range: [0x138-0x16b], 
Asm Operand Index: [3], 
Command List: 0x0000016F6F75F740:'CommandList', SRV/UAV/CBV Descriptor Heap: 0x0000016F6F76F280:'Unnamed ID3D12DescriptorHeap Object', 
Sampler Descriptor Heap: <not set>, 
Pipeline State: 0x0000016F572C89F0:'Unnamed ID3D12PipelineState Object',  
[ EXECUTION ERROR #942: GPU_BASED_VALIDATION_INCOMPATIBLE_RESOURCE_STATE]

Debugowanie interfejsów API warstwy

Aby włączyć warstwę debugowania, wywołaj EnableDebugLayer.

Aby włączyć walidację opartą na procesorze GPU, wywołaj SetEnableGPUBasedValidationi zapoznaj się z metodami następujących interfejsów:

Zapoznaj się z następującymi wyliczeniami i strukturami: