추가된 D3D12_RESOURCE_STATES 열거형 – D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE

초기(VS2015시절) D3D12와 현재 최신 D3D12 SDK의 D3D12_RESOURCE_STATES 열거형 비교.


요 몇 일 전에 ID3D12Debug5::SetEnableGPUBasedValidation()함수의 존재를 알게 되어 GPU Validation을 켜고 테스트를 돌렸다.
이전까지 d3d validation을 다 통과해왔는데 ID3D12Debug5의 GPU validation을 켜니 새로운 에러가 쏟아져 나왔다. 가장 이해가 안됐던게 Texture Layout Barrier가 호환되지 않는다는 에러.
구글링 해봐도 전혀 정보가 없다.

어제 하루종일 삽질한 끝에 Resource Barrier문제란걸 알았다.
이게 D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE와 D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE를 까다롭게 구분해서 생긴 문제였다.
즉 Compute Shader에서 참조하는 텍스처는 D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE로 상태가 전이되어있어야 하는데 D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE상태면 에러가 발생한다.
일단 기존의 D3D Debug Layer만으로는 절대 잡히지 않는다. 렌더링에도 문제가 없었다. 하지만 GPU에 따라서 문제가 될 수는 있다.

D3D12는 초기부터 지금까지 계속 물밑에서 바뀌어왔고 D3D Debug Layer에서 에러처리하는 규칙도 바뀌어 왔다. Resource Barrier에 대한 규칙도 바뀐것 같다.

일단 에러가 나왔으니 이건 다 해결하고 가야 한다. 아니 어차피 읽기전용 텍스처인데 Pixel Shader에서 쓸지 Compute Shader에서 쓸지 그걸 딱히 구분해야 하나? 예전엔 에러처리 안했던 것을 최근에 와서 에러처리하고 있다는 강한 의심이 든다.
이상하게 생각했는데 D3D12_RESOURCE_STATE열거형을 살펴보다가 못보던 것을 발견했다.

D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE? 예전 D3D12 SDK에선 못봤는데?
보니까 Pixel Shader뿐만 아니라 그 외 Geometry Shader, Compute Shader에서도 사용할 경우 이 타입으로 Resource State를 바꿔주면 되는 것 같다.

그러니까 ‘어차피 텍스처인데 이걸 굳이 Pixel Shader쓸 때, Compute Shader쓸 때 구분해서 쓸 필요가 있나?’ 라는 의문에 대한 답이다. D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE를 사용하면 어떤 Shader든 읽기전용 텍스처는 추가적인 Transition없이 사용할 수 있다. 그러니까 더 엄격한 규칙을 적용하는 대신 프로그래밍을 쉽게 해주는 범용 Resource State를 추가했다는 거네.
혹시나 해서 2015년 당시의 초기 D3D12의 D3D12_RESOURCE_STATE 열거형 타입을 확인해봤다. 역시나 없다. 지금보다 훨씬 적다.

기존에 D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE 로 적어놨던 코드들을 D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE로 다 바꿔야겠다.


댓글 남기기