Quick Flow
text
create Device with D3D11_CREATE_DEVICE_DEBUG
-> QueryInterface<ID3D11InfoQueue>
-> break on CORRUPTION and ERROR
-> run the failing frame
-> read the first relevant message
-> fix cause before suppressing message화면이 검게 나오거나 resource가 예상과 다르게 동작하면 shader 코드를 추측하기 전에 Debug Layer 메시지를 확인합니다.
개발 설정
cpp
Microsoft::WRL::ComPtr<ID3D11InfoQueue> infoQueue;
if (SUCCEEDED(device.As(&infoQueue))) {
infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE);
infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE);
}경고를 모두 breakpoint로 만들면 정상적인 실험 중에도 흐름이 자주 끊길 수 있습니다. Corruption과 error부터 중단하고 warning은 output에서 검토합니다.
메시지 읽기
Debug Layer는 input layout mismatch, 동시에 read/write로 bind된 resource, 아직 참조 중인 swap-chain buffer resize, invalid state 조합을 구체적으로 보고합니다. 뒤에 연쇄 경고가 많아도 최초 오류가 원인인 경우가 많습니다.
Message filter는 외부 library가 만드는 확인된 noise에만 좁게 적용합니다. 메시지를 숨기는 것은 오류를 해결한 것이 아닙니다.
자주 틀리는 점
- Debug Layer가 설치되지 않은 사용자 PC에서 debug flag를 필수로 요구하지 않습니다.
- Validation 통과를 화면 결과의 논리적 정확성 보장으로 보지 않습니다.
- Device 종료 전 live object 보고를 확인할 때 남은 Context binding도 정리합니다.
- Release 성능을 Debug Layer가 켜진 상태로 측정하지 않습니다.
참고 링크
2 sources