※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.

Direct3D 12 GPU별 Descriptor Size, 문제점 등

(원문 : Direct3D 12 GPU 毎の Descriptor Size, 問題点等)

Direct3D 12에서는 리소스 바인드의 방법이 크게 바뀌었습니다. 셰이더의 종류도, 넘기는 리소스 수도 늘어났고, 바인드의 비용도 무시할 수 없게 되었기 때문입니다. 리소스는 디스크립터 힙 위에 확보한 일련의 디스크립터에 등록합니다. 이 힙 위의 앞 어드레스를 지정하는 것만으로 묘화 시의 바인드가 완료되는 구조입니다.

디스크립터는 GPU가 액세스하는 영역이므로, 하드웨어에 따라 사이즈가 다릅니다. 실제로 어느 정도나 차이가 나는지 조사해보았습니다. 수치의 단위는 바이트입니다.

GPUFeatureLevelCBV_SRV_UAVSAMPLERRTVDSV
RADEON GCN 1.011_1321632144
RADEON GCN 1.112_0321632144
GeForce Kepler11_03232328
GeForce Maxwell GM111_03232328
GeForce Maxwell GM212_13232328
Intel HD Graphics Gen7.511_132163296
Intel HD Graphcis Gen811_1641632128

이와 같이 GPU에 따라 사이즈가 다른 만큼, 디스크립터의 어드레스를 계산할 때에는 반드시 GetDescriptorHandleIncrementSize()를 참조해야 합니다. 디스크립터란 말하자면 리소스를 참조하기 위한 포인터같은 것인데, 뷰에 해당하는 액세스에 필요한 정보도 포함합니다. 사이즈를 보면 단순한 어드레스일 뿐이 아니라는 것을 알 수 있습니다.

전체적으로 DSV가 큰 것은 Depth 외에 Stencil Surface의 필요, 고속화를 위한 (PreZ 등의) 추가 리소스가 포함되어 있기 때문이라 생각됩니다. 그런 의미에서 DSV가 8바이트 밖에 없는 GeForce는 그야말로 어드레스 뿐. 나아가 다른 정보구조체를 간접적으로 참조하고 있는 것이 아닐까요.

Intel HD Graphcis의 경우에는 세대간에도 차이가 발생합니다. 외부에서는 그다지 차이를 알 수 없습니다만, 하드웨어의 차이는 생각보다 큰 것 같습니다.

이 표는 아래 페이지에도 게재했습니다.

알게 된 문제점 등

DirectX12는 현재에도 빈번히 드라이버가 갱신되고 있습니다. 아직 안정되지 않은 상태인 것 같습니다. 이하는 사용하면서 알게 된 것입니다. (2015/09/22현재)

GeForce Maxwell/Kepler (355.82)

  • Indirect Draw의 CommandSignature에서 RootDescriptor가 반영되지 않는 문제가 있었으나 드라이버 355.82에서 수정됨

RADEON GCN 1.0/1.1 (15.8Beta)

  • CommandSignature에서 Root 32bit Constant/Root Descriptor가 반영되지 않음
  • Bundle에서 RootSignature의 파라미터가 상속되지 않음

Intel HD Graphcis Gen7.5/8 (10.18.15.4256)

  • RootSignature에 Root 32bit Constant가 복수 존재하는 경우, CommandSignature에서 첫 32bit Constant 밖에 갱신할 수 없음

아래 페이지도 갱신했습니다.

그 외에도 문제점은 아니지만 API의 거동이 GPU에 따라 자잘한 차이가 꽤 있습니다.

관련글

+ Recent posts