다음을 통해 공유


설명자 개요

설명자는 API 호출로 생성되고 리소스를 파악합니다.

설명자 데이터

설명자는 GPU 관련 불투명 형식으로 GPU에 대한 개체를 완전히 설명하는 비교적 작은 데이터 블록입니다. RTV(렌더링 대상 뷰), DSV(깊이 스텐실 뷰), SRV(셰이더 리소스 뷰), UAV(순서가 지정되지 않은 액세스 뷰), CBV(상수 버퍼 뷰) 및 샘플러 등 다양한 유형의 설명자가 있습니다.

설명자는 GPU 하드웨어에 따라 크기가 다릅니다. ID3D12Device::GetDescriptorHandleIncrementSize를 호출하여 SRV, UAV 또는 CBV의 크기를 쿼리할 수 있습니다. 설명자는 이 설명서에 나눌 수 없는 단위로 표시됩니다. 다음은 예제입니다.

srv, cbv, uav, and sampler

설명자는 API 호출에 의해 생성되고, 설명자에 포함하려는 리소스 및 MIP 맵과 같은 정보를 포함합니다.

드라이버는 설명자에 대한 참조를 추적하거나 포함하지 않으며, 올바른 설명자 형식이 사용되는지와 해당 정보가 최신 버전인지 확인하는 일은 앱의 책임입니다. 예외적으로 드라이버가 렌더링 대상 바인딩을 검사하여 스왑 체인이 제대로 작동하는지 확인하는 경우도 있습니다.

개체 설명자는 사용 가능하게 해제할 필요가 없습니다. 드라이버는 설명자 생성에 할당을 연결하지 않습니다. 그렇지만 설명자가 애플리케이션이 수명을 소유하는 기타 할당에 대한 참조를 인코딩할 수도 있습니다. 예를 들어, SRV의 설명자는 SRV가 참조하는 D3D 리소스(예: 텍스처)의 가상 주소를 포함해야 합니다. 애플리케이션은 의존하는 기본 D3D 리소스가 소멸되거나 수정되는 동안(예를 들어 비상주로 선언) SRV 설명자를 사용하지 않도록 해야 합니다.

설명자를 사용하는 기본 방법은 설명자를 위해 메모리를 백업하는 설명자 힙에 설명자를 배치하는 것입니다.

설명자 핸들

설명자 핸들은 설명자의 고유한 주소입니다. 포인터와 유사하지만 해당 구현이 하드웨어별로 다르므로 명확하지 않다고 할 수 있습니다. 핸들은 설명자 힙에서 고유하므로, 예를 들어 핸들 배열이 여러 힙의 설명자를 참조할 수 있습니다.

CPU 핸들은 원본 및 대상을 둘 다 식별해야 하는 경우의 복사 작업처럼 즉각적으로 사용할 수 있습니다. 사용 직후(예: ID3D12GraphicsCommandList::OMSetRenderTargets 호출) 다시 사용하거나 기본 힙을 삭제할 수 있습니다.

GPU 핸들은 즉시 사용할 수 없습니다. 즉, GPU 실행 시간에 사용하기 위해 명령 목록에서 위치를 식별합니다. 참조하는 명령 목록이 완전히 실행될 때까지 보존해야 합니다.

힙 시작을 위해 설명자 힙을 만들려면 설명자 힙 자체를 만든 후에 다음 메서드 중 하나를 호출합니다.

이러한 메서드는 다음 구조를 반환합니다.

설명자의 크기는 하드웨어에 따라 다르므로, 힙의 각 설명자 간의 증분을 확인하려면 다음을 사용합니다.

증분 수로 시작 위치를 오프셋하고, 핸들을 복사하고, API 호출에 핸들을 전달해도 안전합니다. 그렇지만 유효한 CPU 포인터인 것처럼 핸들을 역참조하거나 핸들 내의 비트 수를 분석하는 것은 안전하지 않습니다.

핸들을 좀 더 쉽게 관리하기 위해 초기화 멤버를 비롯한 일부 도우미 구조가 추가되었습니다.

Null 설명자

API 호출을 사용하여 설명자를 만들 때 애플리케이션은 설명자 정의의 리소스 포인터에 대해 NULL을 전달하여 셰이더에서 액세스할 때 바인딩된 항목이 없는 것과 같은 결과를 가져옵니다.

설명자의 나머지 부분은 최대한 많이 채워야 합니다. 예를 들어, SRV(셰이더 리소스 뷰)의 경우, 설명자를 사용하여 뷰 형식(Texture1D, Texture2D 등)을 구분할 수 있습니다. 뷰 설명자의 숫자 매개 변수(예: MIP 맵의 수)는 모두 리소스에 유효한 값으로 설정해야 합니다.

대부분의 경우 바인딩되지 않은 리소스(예: 기본값을 반환하는 SRV)에 액세스하기 위한 동작이 정의되어 있습니다. 셰이더 액세스 형식이 설명자 형식과 호환되는 경우, NULL 설명자에 액세스할 때 이러한 동작이 적용됩니다. 예를 들어, 셰이더에 Texture2D SRV가 필요하고 Texture1D로 정의된 NULL SRV에 액세스하는 경우 동작은 정의되지 않으며 디바이스가 초기화될 수 있습니다.

요약하자면, null 설명자를 만들기 위해 CreateShaderResourceView와 같은 메서드로 뷰를 생성할 때 pResource 매개 변수에 대해 null을 전달합니다. 뷰 설명자 매개 변수 pDesc의 경우, 리소스가 null이 아닐 때 작동하는 구성을 설정합니다(그렇지 않은 경우 일부 하드웨어에서 충돌이 발생할 수 있음).

하지만 루트 설명자는 null로 설정하지 않아야 합니다.

계층 1 하드웨어(하드웨어 계층 참조)에서는 하드웨어에서 액세스하지 않더라도 실제 설명자 또는 null 설명자로 바인딩된 모든 설명자를 초기화해야 합니다. 그렇지 않으면 동작이 정의되지 않습니다.

계층 2 하드웨어에서는 바인딩된 CBV 및 UAV 설명자에 적용되지만 SRV 설명자에는 적용되지 않습니다.

계층 3 하드웨어에서는 초기화되지 않은 설명자에 액세스하지 않는 한 이에 대한 제한이 없습니다.

기본 설명자

특정 뷰에 대한 기본 설명자를 만들려면 유효한 pResource 매개 변수를 create view 메서드(예: CreateShaderResourceView)에 전달하지만 pDesc 매개 변수에 대해 NULL전달합니다. 예를 들어, 리소스가 14개의 MIP를 포함하는 경우 뷰도 14개의 MIP를 포함하게 됩니다. 이러한 기본적인 경우가 뷰에 대한 리소스의 가장 명확한 매핑을 나타냅니다. 이렇게 하려면 리소스가 정규화된 형식 이름(예: DXGI_FORMAT_R8G8B8A8_TYPELESS 아닌 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB)으로 할당되어야 합니다.

제공된 pResource 매개 변수는 NULL이어야 하고 위치는 D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV 통해 전달되어야 하므로 기본 설명자를 광선 추적 가속 구조 보기와 함께 사용할 수 없습니다.

설명자