Share via


ID3D12Device::CreatePlacedResource 메서드(d3d12.h)

특정 힙에 배치되는 리소스를 만듭니다. 배치된 리소스는 사용 가능한 가장 가벼운 리소스 개체이며 가장 빠르게 만들고 삭제할 수 있습니다.

애플리케이션은 힙 지역에 배치된 여러 Direct3D 및 예약된 리소스를 겹쳐 비디오 메모리를 다시 사용할 수 있습니다. 간단한 메모리 재사용 모델(설명에 설명됨)은 지정된 시간에 유효한 겹치는 리소스를 명확히 하기 위해 존재 합니다. 간단한 모델 데이터 상속을 사용하여 그래픽 도구 지원을 최대화하려면 지원되지 않습니다. 및 세분화된 타일 및 하위 리소스 무효화는 지원되지 않습니다. 전체 겹치는 리소스 무효화만 발생합니다.

구문

HRESULT CreatePlacedResource(
  ID3D12Heap                *pHeap,
  UINT64                    HeapOffset,
  const D3D12_RESOURCE_DESC *pDesc,
  D3D12_RESOURCE_STATES     InitialState,
  const D3D12_CLEAR_VALUE   *pOptimizedClearValue,
  REFIID                    riid,
  void                      **ppvResource
);

매개 변수

pHeap

형식: [in] ID3D12Heap*

리소스가 배치되는 힙을 나타내는 ID3D12Heap 인터페이스에 대한 포인터입니다.

HeapOffset

형식: UINT64

리소스에 대한 오프셋(바이트)입니다. HeapOffset은 리소스 맞춤의 배수여야 하며 HeapOffset과 리소스 크기는 힙 크기보다 작거나 같아야 합니다. GetResourceAllocationInfo 를 사용하여 텍스처 리소스의 크기를 이해해야 합니다.

pDesc

형식: [in] const D3D12_RESOURCE_DESC*

리소스를 설명하는 D3D12_RESOURCE_DESC 구조체에 대한 포인터입니다.

InitialState

형식: D3D12_RESOURCE_STATES

리소스의 초기 상태이며, D3D12_RESOURCE_STATES 열거형 상수의 비트 OR 조합입니다.

리소스가 D3D12_HEAP_TYPE_UPLOAD 힙과 함께 만들어지면 InitialStateD3D12_RESOURCE_STATE_GENERIC_READ 합니다. 리소스가 D3D12_HEAP_TYPE_READBACK 힙과 함께 만들어지면 InitialStateD3D12_RESOURCE_STATE_COPY_DEST 합니다.

pOptimizedClearValue

형식: [in, optional] const D3D12_CLEAR_VALUE*

명확한 색의 기본값을 설명하는 D3D12_CLEAR_VALUE 지정합니다.

pOptimizedClearValue 는 명확한 작업이 가장 적합한 값을 지정합니다. 생성된 리소스가 D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET 또는 D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL 플래그가 있는 텍스처인 경우 애플리케이션은 지우기 작업이 가장 일반적으로 호출되는 값을 선택해야 합니다.

지우기 작업은 다른 값으로 호출할 수 있지만 해당 작업은 값이 리소스 생성에 전달된 값과 일치하는 경우만큼 효율적이지 않습니다.

pOptimizedClearValueD3D12_RESOURCE_DIMENSION_BUFFER 함께 사용할 때 NULL이어야 합니다.

riid

형식: REFIID

리소스 인터페이스에 대한 GUID(Globally Unique Identifier)입니다. 입력 매개 변수입니다.

리소스에 대한 인터페이스의 REFIID 또는 GUID는 매크로를 사용하여 __uuidof 가져올 수 있습니다. 예를 들어 는 __uuidof(ID3D12Resource) 리소스에 대한 인터페이스의 GUID 를 가져옵니다. riid는 가장 일반적으로 ID3D12Resource의 GUID이지만 모든 인터페이스의 GUID일 수 있습니다. 리소스 개체가 이 GUID에 대한 인터페이스를 지원하지 않으면 E_NOINTERFACE 함께 생성이 실패합니다.

ppvResource

형식: [out, optional] void**

리소스에 대한 포인터를 수신하는 메모리 블록에 대한 포인터입니다. ppvResource 는 기능 테스트를 사용하도록 설정하기 위해 NULL일 수 있습니다. ppvResource가 NULL이면 개체가 생성되지 않으며 pResourceDesc 및 기타 매개 변수가 유효한 경우 S_FALSE 반환됩니다.

반환 값

형식: HRESULT

이 메서드는 리소스를 만들 메모리가 부족한 경우 E_OUTOFMEMORY 반환합니다. 가능한 다른 반환 값은 Direct3D 12 반환 코드를 참조하세요.

설명

CreatePlacedResource 는 예약된 리소스를 힙 내의 오프셋에 완전히 매핑하는 것과 비슷합니다. 그러나 힙과 연결된 가상 주소 공간도 다시 사용할 수 있습니다.

배치된 리소스는 커밋된 리소스보다 만들고 파괴하는 데 더 가볍습니다. 이는 이러한 작업 중에 힙이 생성되거나 제거되지 않으므로 발생합니다. 또한 배치된 리소스를 사용하면 리소스 생성 및 소멸보다 메모리를 다시 사용할 수 있습니다. 즉, 별칭 지정 및 별칭 장벽을 통해 재사용할 수 있습니다. 배치된 여러 리소스는 동일한 힙에서 동시에 겹칠 수 있지만 한 번에 하나의 겹치는 리소스만 사용할 수 있습니다.

배치된 리소스 사용 의미 체계에는 간단한 모델과 고급 모델이라는 두 가지가 있습니다. 앱에 고급 모델이 필요한 경우가 아니면 간단한 모델을 선택하는 것이 좋습니다(GPU의 다양한 에코시스템에서 그래픽 도구 지원을 최대화함).

단순 모델

이 모델에서는 배치된 리소스가 활성 또는 비활성 상태의 두 가지 상태 중 하나로 간주할 수 있습니다. GPU가 비활성 리소스에서 읽거나 쓰는 것은 유효하지 않습니다. 배치된 리소스는 비활성 상태로 만들어집니다.

명령 목록에 별칭 장벽이 있는 리소스를 활성화하려면 애플리케이션이 D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter의 리소스를 전달해야 합니다. pResourceBefore 는 활성화 중에 NULL로 남을 수 있습니다. 이제 활성화된 리소스와 실제 메모리를 공유하는 모든 리소스가 비활성 상태가 되며, 여기에는 겹치는 배치 및 예약된 리소스가 포함됩니다.

효율성을 극대화하려면 별칭 장벽을 그룹화하고 함께 제출해야 합니다.

활성화 후 렌더링 대상 또는 깊이 스텐실 플래그가 있는 리소스를 추가로 초기화해야 합니다. 아래 필수 리소스 초기화에 대한 참고 사항을 참조하세요.

필요한 리소스 초기화에 대한 참고 사항

특정 리소스 종류는 여전히 초기화가 필요합니다. 렌더링 대상 또는 깊이 스텐실 플래그가 있는 리소스는 명확한 작업 또는 전체 하위 리소스 복사본 컬렉션을 사용하여 초기화해야 합니다. 별칭 장벽을 사용하여 별칭이 지정된 두 리소스 간의 전환을 나타내는 경우 별칭 장벽 이후에 초기화가 발생해야 합니다. 이 초기화는 단순 모델에서 리소스가 활성화될 때마다 여전히 필요합니다.

렌더링 대상 또는 깊이 스텐실 플래그가 있는 배치 및 예약된 리소스는 다른 작업이 지원되기 전에 다음 작업 중 하나를 사용하여 초기화해야 합니다.

애플리케이션은 수정된 텍셀의 최소 양을 초래하는 가장 명시적인 작업을 선호해야 합니다. 다음 예제를 고려해 보세요.

  • 깊이 버퍼를 사용하여 픽셀 가시성을 해결하려면 일반적으로 각 깊이 텍셀이 1.0 또는 0에서 시작되어야 합니다. 따라서 지우기 작업은 별칭이 지정된 깊이 버퍼 초기화에 가장 효율적인 옵션이어야 합니다.
  • 애플리케이션은 별칭이 지정된 렌더링 대상을 톤 매핑의 대상으로 사용할 수 있습니다. 애플리케이션은 톤 매핑 중에 모든 픽셀에 대해 렌더링되므로 DiscardResource 는 초기화에 가장 효율적인 옵션이어야 합니다.

고급 모델

이 모델에서는 활성/비활성 상태 추상화를 무시할 수 있습니다. 대신 이러한 하위 수준 규칙을 적용해야 합니다.

  • 이러한 액세스가 동일한 ExecuteCommandLists 호출 내에 있는 한 별칭 장벽은 동일한 실제 메모리의 서로 다른 두 GPU 리소스 액세스 사이에 있어야 합니다.
  • 특정 유형의 별칭이 지정된 리소스에 대한 첫 번째 렌더링 작업은 단순 모델과 마찬가지로 초기화여야 합니다.

초기화 작업은 전체 하위 리소스 또는 64KB 세분성에서 발생해야 합니다. 모든 리소스 종류에 대해 전체 하위 리소스 초기화가 지원됩니다. 64KB 오프셋에 맞춰진 64KB 초기화 세분성은 64KB_UNDEFINED_SWIZZLE 또는 64KB_STANDARD_SWIZZLE 텍스처 레이아웃을 사용하는 버퍼 및 텍스처에 지원됩니다( D3D12_TEXTURE_LAYOUT 참조).

별칭 장벽에 대한 참고 사항

별칭 장벽은 pResourceAfterpResourceBefore 모두에 대해 NULL을 설정할 수 있습니다. ExecuteCommandLists 및 별칭 장벽의 메모리 일관성 정의는 동일합니다. 따라서 동일한 실제 메모리에 대한 두 개의 별칭 액세스는 액세스가 서로 다른 두 ExecuteCommandLists 호출에 있을 때 별칭 장벽이 필요하지 않습니다.

D3D12 고급 사용 모델의 경우 ExecuteCommandLists 의 동기화 정의는 별칭 장벽과 동일합니다. 따라서 애플리케이션은 실제 메모리를 재사용하는 사이에 별칭 장벽을 삽입하거나 ExecuteCommandLists에 대한 두 개의 별도 호출에서 실제 메모리의 두 별칭 사용이 발생하는지 확인할 수 있습니다.

비활성 양은 리소스 속성에 따라 달라집니다. 정의되지 않은 메모리 레이아웃이 있는 텍스처는 전체 텍스처를 원자성으로 비활성화해야 하므로 최악의 경우입니다. 정의된 레이아웃이 있는 두 개의 겹치는 리소스의 경우 비활성으로 인해 리소스의 겹치는 정렬된 영역만 발생할 수 있습니다. 데이터 상속은 잘 정의될 수도 있습니다. 자세한 내용은 메모리 별칭 및 데이터 상속을 참조하세요.

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 d3d12.h
라이브러리 D3D12.lib
DLL D3D12.dll

추가 정보

CreateCommittedResource

CreateReservedResource

ID3D12Device

공유 힙