설명자 테이블의 고급 사용Advanced use of Descriptor Tables

다음 섹션에서는 설명자 테이블의 고급 사용에 대한 정보를 제공합니다.The following sections provide information about the advanced use of descriptor tables.

렌더링 호출 사이에 설명자 테이블 항목 변경Changing Descriptor Table Entries between Rendering Calls

설명자 테이블을 설정하는 명령 목록이 실행을 위해 큐에 제출된 후에 애플리케이션은 GPU가 참조 사용을 끝냈다는 사실을 확인할 때까지 GPU가 참조할 수 있는 설명자 힙 부분을 CPU에서 편집하지 않아야 합니다.After command lists that set descriptor tables have been submitted to a queue for execution, the application must not edit from the CPU the portions of descriptor heaps that the GPU might reference until the application knows that the GPU has finished using the references.

작업 완료는 API 펜스를 사용하여 GPU 진행 상황을 추적하는 아주 명확한 메커니즘과 렌더링이 디스플레이로 전송되었음을 확인할 때까지 기다리는 것과 같은 좀 더 대략적인 메커니즘 중에서 애플리케이션에 적합한 방식을 통해 확인될 수 있습니다.Work completion can be determined at a tight bound using API fences for tracking GPU progress, or more coarse mechanisms like waiting to see that rendering has been sent to display - whatever suits the application. 애플리케이션이 설명자 테이블이 가리키는 영역의 하위 시트에만 액세스된다는 사실을 알게 될 경우(셰이더의 흐름 제어를 통해) 참조되지 않은 다른 설명자를 자유롭게 변경할 수 있습니다.If an application knows that only a subset of the region a descriptor table points to will be accessed (say due to flow control in the shader), the other unreferenced descriptors are still free to be changed. 애플리케이션은 렌더링 호출 사이에서 다른 설명자 테이블 간을 전환해야 할 경우 다음 중에서 몇 가지 방법을 선택할 수 있습니다.If an application needs to switch between different descriptor tables between rendering calls, there are a few approaches the application can choose from:

  • 설명자 테이블 버전 관리: 명령 목록에서 참조될 설명자의 모든 고유 컬렉션에 대해 별도 설명자 테이블을 만들거나 다시 사용합니다.Descriptor Table Versioning: Create (or reuse) a separate descriptor table for every unique collection of descriptors that is to be referenced by a command list. 설명자 힙에서 이전에 채운 영역을 편집하고 다시 사용할 경우 애플리케이션은 먼저 GPU가 재활용될 설명자 힙 부분의 사용을 끝냈는지 확인해야 합니다.When editing and reusing previously populated areas on descriptor heaps, applications must first ensure that the GPU has finished using any portion of a descriptor heap that will be recycled.
  • 동적 인덱싱: 애플리케이션은 설명자 힙 범위의 그리기/디스패치에서 달라지는(또는 그리기 내에서 달라지는) 개체를 정렬하고, 전체에 걸쳐 있는 설명자 테이블을 정의하고, 셰이더에서 셰이더 실행 동안 테이블의 동적 인덱싱을 사용하여 사용할 개체를 선택할 수 있습니다.Dynamic Indexing: Applications can arrange objects that vary across draw/dispatch (or even vary within a draw) in a range of a descriptor heap, define a descriptor table that spans all of them, and from the shader, use dynamic indexing of the table during shader execution to select which object to use.
  • 루트 서명에서 직접 설명자 추가Putting descriptors in the root signature directly. 루트 서명 공간이 제한되어 있으므로 이러한 방식에서는 매우 작은 수의 설명자만 관리할 수 있습니다.Only a very small number of descriptors can be managed this way because root signature space is limited.

설명자 테이블 버전 관리를 사용하면 설명자 힙의 설명자 메모리가 해당 시점에 실행 중, 실행을 위해 대기 중 또는 기록 중인 모든 명령 목록의 그래픽 파이프라인에서 참조하는 고유한 모든 설명자 세트를 통해 고갈될 것이라는 문제가 있습니다.The implication of using descriptor table versioning is that descriptor memory out of a descriptor heap must be burned through for every unique set of descriptors referenced by the graphics pipeline for every command list that could be either executing, queued for execution, or being recorded at any given time.

D3D12에서는 설명자 힙 및 설명자 테이블을 통해 관리되는 개체 형식에 대한 버전 관리 작업을 애플리케이션에 맡깁니다.D3D12 leaves the responsibility of managing versioning to the application for the object types managed via descriptor heaps and descriptor tables. 이 경우의 한 가지 이점은 애플리케이션이 모든 명령 목록 제출에서 항상 새 설명자 테이블 버전을 정의하지 않고, 설명자 테이블 콘텐츠를 최대한 많이 재사용하도록 선택할 수 있다는 것입니다.One benefit of this is that applications can choose to reuse descriptor table contents as much as possible rather than always defining a new descriptor table version for every command list submission. 루트 서명은 D3D12 드라이버가 버전을 자동으로 관리하는 공간입니다.The root signature is a space that the D3D12 driver automatically versions.

한 번에 여러 설명자 테이블을 루트 서명(및 파이프라인)에 바인딩하는 기능을 통해 애플리케이션은 원하는 주기에 따라 설명자 참조 세트를 그룹화하고 전환할 수 있습니다.The ability to bind multiple descriptor tables to the root signature (and thus to the pipeline) at a time allows applications to group and switch sets of descriptor references at different frequencies if desired. 예를 들어 애플리케이션이 거의 변경되지 않거나, 기본 설명자 힙 메모리의 영역이 텍스처 선택을 위해 셰이더의 동적 인덱싱을 사용하여 필요에 따라 채워질 수 있는 소수(1개 뿐일 수 있음)의 대규모 정적 설명자 테이블을 사용할 수 있습니다.For example, an application could use a small number (perhaps just one) of large static descriptor tables that rarely change, or in which regions in the underlying descriptor heap memory are being populated as needed, with the use of dynamic indexing from the shader to select textures. 동시에, 애플리케이션은 각 그리기 호출이 참조하는 세트가 설명자 테이블 버전 관리 기술을 사용하는 CPU에서 전환될 경우 다른 리소스 클래스를 유지 관리할 수 있습니다.At the same time, the application could maintain another class of resources where the set referenced by each draw call is switched from the CPU using the descriptor table versioning technique.

범위를 벗어난 인덱싱Out of Bounds Indexing

셰이더 결과의 설명자 테이블이 인덱싱이 범위를 벗어날 경우 주로 정의되지 않은 메모리 액세스가 발생하며, 하드웨어 상태 설명자인 경우처럼 프로세스 내 임의 메모리를 읽고 하드웨어가 수행하는 결과를 포함할 수 있게 됩니다.Out of bounds indexing of any descriptor table from the shader results in a largely undefined memory access, including the possibility of reading arbitrary in-process memory as if it is a hardware state descriptor and living with the consequence of what the hardware does with that. 이로 인해 디바이스가 초기화될 수 있지만 Windows는 중단되지 않습니다.This could produce a device reset, but will not crash Windows.

셰이더 파생물 및 분기 인덱싱Shader Derivatives and Divergent Indexing

2x2 스탬프에서 실행되는 픽셀 셰이더 호출(파생물 계산을 지원하기 위해)이 설명자 테이블에서 샘플링할 다른 텍스처 인덱스를 선택하며, 선택한 샘플러 구성과 지정된 픽셀의 텍스처가 텍스처 좌표 파생물에서 LOD를 계산할 것을 요구하는 경우 LOD 계산 및 텍스처 샘플링 프로세스는 2x2 스탬프의 각 텍스처 조회와는 별도로 하드웨어에서 수행되므로 성능에 영향을 미칩니다.If pixel shader invocations that are executing in a 2x2 stamp (to support derivative calculations) choose different texture indices to sample from out of a descriptor table, and if the selected sampler configuration and texture for any given pixel requires an LOD calculation from texture coordinate derivatives, then the LOD calculation and texture sampling process is done by the hardware independently for each texture lookup in the 2x2 stamp, which will impact performance.

설명자 테이블Descriptor Tables