다음을 통해 공유


설명자 개요

설명자는 API 호출에 의해 생성되고 리소스를 식별합니다.

설명자 데이터

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

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

srv, cbv, uav 및 sampler

설명자는 API 호출에 의해 생성되며, 설명자가 포함할 리소스 및 mip-maps와 같은 정보를 포함합니다.

드라이버는 설명자에 대한 참조를 추적하거나 보유하지 않으며, 올바른 설명자 형식이 사용되고 있으며 정보가 최신인지 확인하는 것은 앱의 맡입니다. 한 가지 작은 예외가 있습니다. 드라이버는 렌더링 대상 바인딩을 검사하여 스왑 체인이 올바르게 작동하는지 확인합니다.

개체 설명자를 해제하거나 릴리즈할 필요가 없습니다. 드라이버는 설명자를 생성할 때 자원 할당을 연결하지 않습니다. 그러나 설명자는 애플리케이션이 수명을 소유하는 다른 할당에 대한 참조를 인코딩할 수 있습니다. 예를 들어 SRV에 대한 설명자는 SRV가 참조하는 D3D 리소스의 가상 주소(예: 텍스처)를 포함해야 합니다. 종속된 기본 D3D 리소스가 제거되었거나 수정 중일 때(예: 비거주자로 선언됨) SRV 설명자를 사용하지 않도록 하는 것은 애플리케이션의 책임입니다.

설명자를 사용하는 기본 방법은 설명자를 위한 메모리 역할을 하는 설명자 힙에 배치하는 것입니다.

디스크립터 핸들

설명자 핸들(서술자의 주소)은 설명자의 고유한 주소입니다. 포인터와 비슷하지만 구현이 하드웨어에 특정하므로 불투명합니다. 핸들은 설명자 힙에서 고유하므로 예를 들어 핸들 배열은 여러 힙의 설명자를 참조할 수 있습니다.

CPU 핸들은 원본과 대상을 모두 식별해야 하는 복사 작업과 같은 즉각적인 사용을 위한 것입니다. 사용 직후(예: ID3D12GraphicsCommandList::OMSetRenderTargets호출) 다시 사용하거나 기본 힙을 삭제할 수 있습니다.

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

힙의 시작 부분에 대한 설명자 핸들을 만들려면 설명자 힙 자체를 만든 후 다음 메서드 중 하나를 호출합니다.

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

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

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

핸들을 좀 더 쉽게 관리할 수 있도록 초기화 멤버와 함께 일부 도우미 구조가 추가되었습니다.

Null 설명자

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

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

대부분의 경우 기본값을 반환하는 SRV와 같은 언바운드 리소스에 액세스하기 위한 정의된 동작이 있습니다. 셰이더 액세스 유형이 설명자 형식과 호환되는 한 NULL 설명자에 액세스할 때 해당 규칙이 준수됩니다. 예를 들어 셰이더에서 Texture2D SRV가 예상되고 Texture1D로 정의된 NULL SRV에 액세스하는 경우 동작이 정의되지 않으며 디바이스가 다시 설정될 수 있습니다.

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

그러나 루트 설명자는 null로 설정하면 안 됩니다.

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

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

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

기본 설명자

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

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

설명자