다음을 통해 공유


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)입니다. 입력 매개 변수입니다.

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

ppvResource

형식: [out, optional] void**

리소스에 대한 포인터를 받는 메모리 블록에 대한 포인터입니다. ppvResource NULL일 수 있으므로 기능 테스트를 사용할 수 있습니다. ppvResource 경우 개체가 만들어지지 않으며 pResourceDesc 및 기타 매개 변수가 유효한 경우 S_FALSE 반환됩니다.

반환 값

형식: HRESULT

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

발언

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

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

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

단순 모델

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

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

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

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

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

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

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

  • 지우기 작업입니다. 예를 들어 ClearRenderTargetView 또는 clearDepthStencilView.
  • DiscardResource 작업입니다.
  • 복사 작업; 예를 들어 CopyBufferRegion, CopyTextureRegion또는 copyResource.

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

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

고급 모델

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

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

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

별칭 장벽에 대한 참고 사항

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

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

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

요구 사항

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

참고 항목

CreateCommittedResource

CreateReservedResource

ID3D12Device

공유 힙