다음을 통해 공유


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호출하고 다음 인터페이스의 메서드를 참조합니다.

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