설명자 테이블의 고급 사용

다음 섹션에서는 설명자 테이블의 고급 사용에 대한 정보를 제공합니다.

렌더링 호출 사이에 설명자 테이블 항목 변경

설명자 테이블을 설정하는 명령 목록이 실행을 위해 큐에 제출된 후에 애플리케이션은 GPU가 참조 사용을 끝냈다는 사실을 확인할 때까지 GPU가 참조할 수 있는 설명자 힙 부분을 CPU에서 편집하지 않아야 합니다.

작업 완료는 API 펜스를 사용하여 GPU 진행 상황을 추적하는 아주 명확한 메커니즘과 렌더링이 디스플레이로 전송되었음을 확인할 때까지 기다리는 것과 같은 좀 더 대략적인 메커니즘 중에서 애플리케이션에 적합한 방식을 통해 확인될 수 있습니다. 애플리케이션이 설명자 테이블이 가리키는 영역의 하위 시트에만 액세스된다는 사실을 알게 될 경우(셰이더의 흐름 제어를 통해) 참조되지 않은 다른 설명자를 자유롭게 변경할 수 있습니다. 애플리케이션은 렌더링 호출 사이에서 다른 설명자 테이블 간을 전환해야 할 경우 다음 중에서 몇 가지 방법을 선택할 수 있습니다.

  • 설명자 테이블 버전 관리: 명령 목록에서 참조할 설명자의 모든 고유한 컬렉션에 대해 별도의 설명자 테이블을 만들거나 다시 사용합니다. 설명자 힙에서 이전에 채운 영역을 편집하고 다시 사용할 경우 애플리케이션은 먼저 GPU가 재활용될 설명자 힙 부분의 사용을 끝냈는지 확인해야 합니다.
  • 동적 인덱싱: 애플리케이션은 설명자 힙 범위에서 그리기/디스패치에 따라 달라지는 개체를 정렬하거나, 모든 항목에 걸쳐 있는 설명자 테이블을 정의하고, 셰이더 실행 중에 테이블의 동적 인덱싱을 사용하여 사용할 개체를 선택할 수 있습니다.
  • 루트 서명에서 직접 설명자 추가 루트 서명 공간이 제한되어 있으므로 이러한 방식에서는 매우 작은 수의 설명자만 관리할 수 있습니다.

설명자 테이블 버전 관리를 사용하면 설명자 힙의 설명자 메모리가 해당 시점에 실행 중, 실행을 위해 대기 중 또는 기록 중인 모든 명령 목록의 그래픽 파이프라인에서 참조하는 고유한 모든 설명자 세트를 통해 고갈될 것이라는 문제가 있습니다.

D3D12에서는 설명자 힙 및 설명자 테이블을 통해 관리되는 개체 형식에 대한 버전 관리 작업을 애플리케이션에 맡깁니다. 이 경우의 한 가지 이점은 애플리케이션이 모든 명령 목록 제출에서 항상 새 설명자 테이블 버전을 정의하지 않고, 설명자 테이블 콘텐츠를 최대한 많이 재사용하도록 선택할 수 있다는 것입니다. 루트 서명은 D3D12 드라이버가 버전을 자동으로 관리하는 공간입니다.

한 번에 여러 설명자 테이블을 루트 서명(및 파이프라인)에 바인딩하는 기능을 통해 애플리케이션은 원하는 주기에 따라 설명자 참조 세트를 그룹화하고 전환할 수 있습니다. 예를 들어 애플리케이션이 거의 변경되지 않거나, 기본 설명자 힙 메모리의 영역이 텍스처 선택을 위해 셰이더의 동적 인덱싱을 사용하여 필요에 따라 채워질 수 있는 소수(1개 뿐일 수 있음)의 대규모 정적 설명자 테이블을 사용할 수 있습니다. 동시에, 애플리케이션은 각 그리기 호출이 참조하는 세트가 설명자 테이블 버전 관리 기술을 사용하는 CPU에서 전환될 경우 다른 리소스 클래스를 유지 관리할 수 있습니다.

범위를 벗어난 인덱싱

셰이더 결과의 설명자 테이블이 인덱싱이 범위를 벗어날 경우 주로 정의되지 않은 메모리 액세스가 발생하며, 하드웨어 상태 설명자인 경우처럼 프로세스 내 임의 메모리를 읽고 하드웨어가 수행하는 결과를 포함할 수 있게 됩니다. 이로 인해 디바이스가 초기화될 수 있지만 Windows는 중단되지 않습니다.

셰이더 파생물 및 분기 인덱싱

2x2 스탬프에서 실행되는 픽셀 셰이더 호출(파생물 계산을 지원하기 위해)이 설명자 테이블에서 샘플링할 다른 텍스처 인덱스를 선택하며, 선택한 샘플러 구성과 지정된 픽셀의 텍스처가 텍스처 좌표 파생물에서 LOD를 계산할 것을 요구하는 경우 LOD 계산 및 텍스처 샘플링 프로세스는 2x2 스탬프의 각 텍스처 조회와는 별도로 하드웨어에서 수행되므로 성능에 영향을 미칩니다.

설명자 테이블