다음을 통해 공유


루트 서명 개요

루트 서명은 앱에서 구성되고 명령 목록을 셰이더에 필요한 리소스에 연결합니다. 그래픽 명령 목록에는 그래픽 및 컴퓨팅 루트 서명이 둘 다 포함됩니다. 컴퓨팅 명령 목록에는 하나의 컴퓨팅 루트 서명만 있습니다. 이 루트 서명은 서로 독립적입니다.

루트 매개 변수 및 인수

루트 서명은 API 함수 서명과 유사하고, 셰이더에 필요한 데이터 형식을 확인하지만, 실제 메모리 또는 데이터를 정의하지 않습니다. 루트 매개 변수는 루트 서명에 있는 하나의 항목입니다. 런타임에 설정 및 변경된 루트 매개 변수의 실제 값을 루트 인수라고 합니다. 루트 인수를 변경하면 셰이더가 읽은 데이터가 변경됩니다.

루트 상수, 설명자 및 테이블

루트 서명은 세 가지 매개 변수인 루트 상수(루트 인수에 인라인된 상수), 루트 설명자(루트 인수에 인라인된 설명자) 및 설명자 테이블(설명자 힙에서 설명자 범위에 대한 포인터)을 포함할 수 있습니다.

루트 상수는 셰이더에서 상수 버퍼로 표시되는 인라인 32비트 값입니다.

인라인된 루트 설명자는 CBV와 원시 또는 구조적 UAV 또는 SRV 버퍼로 제한되지만 가장 자주 액세스되는 설명자를 포함해야 합니다. 2D 질감 SRV와 같은 더 복잡한 형식은 루트 설명자로 사용할 수 없습니다. 루트 설명자에는 크기 제한이 포함되지 않으므로 크기를 포함하는 설명자 힙의 설명자와 달리 범위를 벗어나는지 확인할 수 없습니다.

루트 서명 내의 설명자 테이블 항목에는 설명자, HLSL 셰이더 바인드 이름 및 표시 여부 플래그가 포함됩니다. 셰이더 이름에 대한 자세한 내용은 셰이더 모델 5.1을 참조하세요. 일부 하드웨어에서는 설명자가 필요한 셰이더 단계에 설명자만 표시함으로써 성능이 향상될 수 있습니다( D3D12_SHADER_VISIBILITY 참조).

루트 설명자 테이블 항목

루트 서명의 레이아웃은 매우 유연하며, 성능이 낮은 하드웨어에는 약간의 제약 조건이 적용됩니다. 하드웨어 수준과 관계없이 애플리케이션은 항상 최대 효율성에 필요한 만큼 작게 루트 서명을 만들려고 해야 합니다. 애플리케이션에서 루트 서명에 더 많은 설명자 테이블을 포함하면 루트 상수에 사용할 공간이 부족해지고, 그 반대의 경우도 마찬가지입니다.

애플리케이션이 바인딩되는 루트 서명의 콘텐츠(설명자 테이블, 루트 상수 및 루트 설명자)는 그리기(그래픽)/디스패치(컴퓨팅) 호출 간에 콘텐츠가 변경될 때마다 D3D12 드라이버에 의해 자동으로 버전이 지정됩니다. 따라서 각 그리기/디스패치는 루트 서명 상태의 고유한 전체 세트를 가져옵니다.

이상적으로 동일한 루트 서명을 공유하는 PSO(파이프라인 상태 개체) 그룹이 있습니다. 파이프라인에서 루트 서명이 설정된 후 루트 서명이 정의하는 모든 바인딩(설명자 테이블, 설명자, 상수)은 각각 번들에 대한 상속을 포함하여 개별적으로 설정하거나 변경할 수 있습니다.

앱은 원하는 설명자 테이블 수와 인라인 설명자(더 많은 공간을 차지하지만 간접 참조를 제거함)와 루트 서명에서 원하는 인라인 상수(간접 참조가 없음) 간에 자체적으로 절충할 수 있습니다. 애플리케이션은 대량 데이터를 나타내기 위해 애플리케이션을 가리키는 힙 및 설명자 힙과 같은 애플리케이션 제어 메모리를 사용하여 루트 서명을 최대한 적게 사용해야 합니다.

루트 서명