다음을 통해 공유


GPU 기반 유효성 검사 및 Direct3D 12 디버그 계층

이 항목에서는 Direct3D 12 디버그 계층을 최대한 활용하는 방법을 설명합니다. GPU 기반 유효성 검사(GBV)를 사용하면 CPU에서 API 호출 중에는 불가능한 GPU 타임라인 대한 유효성 검사 시나리오를 사용할 수 있습니다. GBV는 Windows 10 1주년 업데이트를 위한 그래픽 도구부터 사용할 수 있습니다.

GPU 기반 유효성 검사의 목적

GPU 기반 유효성 검사는 다음 오류를 식별하는 데 도움이 됩니다.

  • 셰이더에서 초기화되지 않거나 호환되지 않는 설명자를 사용합니다.
  • 셰이더에서 삭제된 리소스를 참조하는 설명자를 사용합니다.
  • 승격된 리소스 상태 및 리소스 상태 감쇠의 유효성 검사
  • 셰이더에서 설명자 힙의 끝부분에서 인덱싱합니다.
  • 셰이더가 호환되지 않는 상태의 리소스에 액세스합니다.
  • 셰이더에서 초기화되지 않거나 호환되지 않는 샘플러를 사용합니다.

GBV는 유효성 검사가 셰이더에 직접 추가된 패치된 셰이더를 만들어 작동합니다. 패치된 셰이더는 셰이더 실행 중에 액세스하는 루트 인수 및 리소스를 검사하고 로그 버퍼에 오류를 보고합니다. 또한 GBV는 추가 작업 및 디스패치 호출을 애플리케이션 명령 목록에 삽입하여 GPU-타임라인 명령 목록에 의해 부과된 리소스 상태의 변경 내용을 확인하고 추적합니다.

GBV에는 셰이더를 실행하는 기능이 필요하므로 COPY 명령 목록은 COMPUTE 명령 목록에 의해 에뮬레이트됩니다. 이렇게 하면 최종 결과를 변경해서는 안 되지만 하드웨어에서 복사본을 수행하는 방법이 변경될 수 있습니다. 애플리케이션은 여전히 COPY 명령 목록임을 인식하고 디버그 계층은 이러한 목록의 유효성을 검사합니다.

GPU 기반 유효성 검사 켜기

DIRECT3D 12 디버그 계층을 강제로 적용하고 GPU 기반 유효성 검사(제어판의 새 탭)를 강제로 적용하여 DXCPL(DirectX 제어판)을 강제로 사용할 수 있습니다. 사용하도록 설정되면 Direct3D 12 디바이스가 해제될 때까지 GBV가 계속 사용하도록 설정됩니다. 또는 Direct3D 12 디바이스를 만들기 전에 GBV를 프로그래밍 방식으로 사용하도록 설정할 수 있습니다.

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

일반적으로 대부분의 경우 디버그 계층이 사용하도록 설정된 코드를 실행해야 합니다. 그러나 GBV는 많은 속도를 늦출 수 있습니다. 개발자는 더 작은 데이터 집합(예: 엔진 데모 또는 PSO 및 리소스가 적은 작은 게임 수준)으로 GBV를 사용하도록 설정하거나 초기 애플리케이션을 도입하는 동안 성능 문제를 줄이는 것을 고려할 수 있습니다. 콘텐츠가 클수록 야간 테스트 패스에서 하나 또는 두 개의 테스트 머신에서 GBV를 켜는 것이 좋습니다.

출력 디버그

GBV는 ExecuteCommandLists 호출이 GPU에서 실행을 완료한 후 디버그 출력을 생성합니다. GPU 타임라인 있으므로 디버그 출력은 다른 CPU 타임라인 유효성 검사와 비동기적일 수 있습니다. 애플리케이션 개발자는 디버그 출력을 동기화하기 위해 자체 대기 후 실행을 삽입할 수 있습니다.

GBV 출력은 셰이더에서 현재 그리기/디스패치 수 및 관련 개체의 ID(예: 명령 목록, 큐, PSO 등)와 함께 오류가 발생한 위치를 식별합니다.

디버그 메시지 예제

다음 오류 메시지는 "기본 색 버퍼"라는 리소스가 셰이더 리소스로 셰이더에서 액세스되었지만 셰이더가 GPU에서 실행될 때 순서가 지정되지 않은 액세스 상태에 있음을 나타냅니다. 셰이더 원본의 위치, 명령 목록의 이름 및 그리기 수(인덱스 그리기) 및 관련 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]

계층 API 디버그

디버그 계층을 사용하도록 설정하려면 EnableDebugLayer를 호출합니다.

GPU 기반 유효성 검사를 사용하도록 설정하려면 SetEnableGPUBasedValidation을 호출하고 다음 인터페이스의 메서드를 참조하세요.

다음 열거형 및 구조를 참조하세요.