Skip to main content
특정 힙에 배치된 리소스를 만듭니다. 배치된 리소스는 사용 가능한 리소스 객체 중 가장 가벼우며, 만들고 파괴하는 것이 가장 빠릅니다. 애플리케이션은 힙 영역에서 여러 Direct3D 배치된 리소스 및 예약된 리소스를 겹쳐서 비디오 메모리를 재사용할 수 있습니다. 단순한 메모리 재사용 모델(설명에 설명됨)은 언제든지 어떤 겹치는 리소스가 유효한지 명확히 하기 위해 존재합니다. 그래픽 도구 지원을 극대화하기 위해, 단순 모델에서는 데이터 상속이 지원되지 않으며, 세분화된 타일 및 하위 리소스 무효화도 지원되지 않습니다. 전체 겹치는 리소스 무효화만 발생합니다.

구문

매개 변수

pHeap
형식: ID3D12Heap *
리소스가 배치되는 힙을 나타내는 ID3D12Heap 인터페이스에 대한 포인터입니다. HeapOffset
형식: UINT64
리소스의 오프셋(바이트 단위)입니다. _HeapOffset_은 리소스의 정렬 크기의 배수여야 하며, _HeapOffset_에 리소스 크기를 더한 값은 힙 크기보다 작거나 같아야 합니다. 텍스처 리소스의 크기를 이해하려면 GetResourceAllocationInfo를 사용해야 합니다. pDesc
형식: const D3D12_RESOURCE_DESC *
리소스를 설명하는 D3D12_RESOURCE_DESC 구조체에 대한 포인터입니다. InitialState
형식: D3D12_RESOURCE_STATES
D3D12_RESOURCE_STATES 열거형 상수의 비트 OR 조합으로 표현되는 리소스의 초기 상태입니다. D3D12_HEAP_TYPE_UPLOAD 힙과 함께 리소스를 만들 때 _InitialState_는 D3D12_RESOURCE_STATE_GENERIC_READ여야 합니다. D3D12_HEAP_TYPE_READBACK 힙과 함께 리소스를 만들 때 _InitialState_는 D3D12_RESOURCE_STATE_COPY_DEST여야 합니다. pOptimizedClearValue
형식: const D3D12_CLEAR_VALUE *
지우기 색상의 기본값을 설명하는 D3D12_CLEAR_VALUE를 지정합니다. _pOptimizedClearValue_는 지우기 작업이 가장 최적화되는 값을 지정합니다. 생성된 리소스가 D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET 또는 D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL 플래그가 있는 텍스처인 경우, 애플리케이션은 지우기 작업이 가장 자주 호출될 값을 선택해야 합니다. 지우기 작업은 다른 값으로 호출할 수 있지만, 이러한 작업은 리소스 생성에 전달된 값과 일치하는 경우만큼 효율적이지 않습니다. D3D12_RESOURCE_DIMENSION_BUFFER와 함께 사용될 때 _pOptimizedClearValue_는 NULL이어야 합니다. riid
형식: const IID &
리소스 인터페이스의 전역 고유 식별자(GUID)입니다. 이것은 입력 매개 변수입니다. 리소스에 대한 인터페이스의 REFIID 또는 GUID__uuidof 매크로를 사용하여 얻을 수 있습니다. 예를 들어, __uuidof(ID3D12Resource)는 리소스에 대한 인터페이스의 GUID를 가져옵니다. riid는 가장 일반적으로 ID3D12Resource의 GUID이지만, 모든 인터페이스의 GUID일 수 있습니다. 리소스 객체가 이 GUID에 대한 인터페이스를 지원하지 않으면 생성이 E_NOINTERFACE로 실패합니다. ppvResource
형식: void **
리소스에 대한 포인터를 받는 메모리 블록에 대한 포인터입니다. _ppvResource_는 기능 테스트를 활성화하려면 NULL일 수 있습니다. _ppvResource_가 NULL인 경우 객체가 생성되지 않으며, pResourceDesc 및 기타 매개 변수가 유효하면 S_FALSE가 반환됩니다.

반환 값

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

설명

CreatePlacedResource는 예약된 리소스를 힙 내의 오프셋에 완전히 매핑하는 것과 유사하지만, 힙과 연결된 가상 주소 공간도 재사용될 수 있습니다. 배치된 리소스는 커밋된 리소스보다 만들고 파괴하는 것이 더 가볍습니다. 이는 이러한 작업 중에 힙이 생성되거나 파괴되지 않기 때문입니다. 또한, 배치된 리소스는 리소스 생성 및 파괴보다 훨씬 가벼운 메모리 재사용 기법을 가능하게 합니다. 즉, 별칭 지정과 별칭 지정 배리어를 통한 재사용입니다. 여러 배치된 리소스가 동일한 힙에서 동시에 서로 겹칠 수 있지만, 한 번에 하나의 겹치는 리소스만 사용할 수 있습니다. 배치된 리소스 사용 시맨틱에는 단순 모델과 고급 모델의 두 가지가 있습니다. 앱에 고급 모델이 필요하다는 것을 확인할 때까지는 단순 모델을 선택하는 것이 좋습니다(다양한 GPU 생태계에서 그래픽 도구 지원을 극대화합니다).

단순 모델

이 모델에서는 배치된 리소스를 활성 또는 비활성이라는 두 가지 상태 중 하나에 있는 것으로 간주할 수 있습니다. GPU가 비활성 리소스에서 읽거나 쓰는 것은 유효하지 않습니다. 배치된 리소스는 비활성 상태로 생성됩니다. 명령 목록에서 별칭 지정 배리어로 리소스를 활성화하려면, 애플리케이션은 D3D12_RESOURCE_ALIASING_BARRIER::pResourceAfter에서 리소스를 전달해야 합니다. 활성화 중에 pResourceBefore는 NULL로 남길 수 있습니다. 활성화된 리소스와 물리적 메모리를 공유하는 모든 리소스는 이제 비활성 상태가 되며, 여기에는 겹치는 배치된 리소스 및 예약된 리소스가 포함됩니다. 효율성을 최대화하려면 별칭 지정 배리어를 그룹화하여 함께 제출해야 합니다. 활성화 후 렌더 타깃 또는 뎁스 스텐실 플래그가 있는 리소스는 추가로 초기화되어야 합니다. 아래 필수 리소스 초기화에 대한 참고 사항을 참조하세요.

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

특정 리소스 유형은 여전히 초기화가 필요합니다. 렌더 타깃 또는 뎁스 스텐실 플래그가 있는 리소스는 지우기 작업 또는 전체 하위 리소스 복사 모음으로 초기화되어야 합니다. 두 개의 별칭 지정된 리소스 간의 전환을 나타내기 위해 별칭 지정 배리어를 사용한 경우 초기화는 별칭 지정 배리어 이후에 이루어져야 합니다. 이 초기화는 단순 모델에서 리소스가 활성화되었을 때도 여전히 필요합니다. 렌더 타깃 또는 뎁스 스텐실 플래그가 있는 배치된 리소스 및 예약된 리소스는 다른 작업이 지원되기 전에 다음 작업 중 하나로 초기화되어야 합니다. 애플리케이션은 수정된 텍셀 수를 최소화하는 가장 명시적인 작업을 선호해야 합니다. 다음 예를 고려하세요.
  • 픽셀 가시성을 해결하기 위해 뎁스 버퍼를 사용하는 경우 일반적으로 각 뎁스 텍셀이 1.0 또는 0으로 시작해야 합니다. 따라서 Clear 작업은 별칭 지정된 뎁스 버퍼 초기화에 가장 효율적인 옵션이어야 합니다.
  • 애플리케이션은 톤 매핑의 대상으로 별칭 지정된 렌더 타깃을 사용할 수 있습니다. 애플리케이션이 톤 매핑 중에 모든 픽셀을 렌더링하므로 DiscardResource가 초기화에 가장 효율적인 옵션이어야 합니다.

고급 모델

이 모델에서는 활성/비활성 상태 추상화를 무시할 수 있습니다. 대신 이러한 하위 수준 규칙을 준수해야 합니다.
  • 두 액세스가 동일한 ExecuteCommandLists 호출 내에 있는 한, 동일한 물리적 메모리에 대한 두 개의 서로 다른 GPU 리소스 액세스 사이에 별칭 지정 배리어가 있어야 합니다.
  • 특정 유형의 별칭 지정된 리소스에 대한 첫 번째 렌더링 작업은 단순 모델과 마찬가지로 여전히 초기화여야 합니다.
초기화 작업은 전체 하위 리소스 또는 64KB 세분성으로 이루어져야 합니다. 전체 하위 리소스 초기화는 모든 리소스 유형에서 지원됩니다. 64KB 오프셋에서 정렬된 64KB 초기화 세분성은 64KB_UNDEFINED_SWIZZLE 또는 64KB_STANDARD_SWIZZLE 텍스처 레이아웃(D3D12_TEXTURE_LAYOUT 참조)이 있는 버퍼 및 텍스처에서 지원됩니다.

별칭 지정 배리어에 대한 참고 사항

별칭 지정 배리어는 _pResourceAfter_와 pResourceBefore 모두에 대해 NULL을 설정할 수 있습니다. ExecuteCommandLists의 메모리 일관성 정의와 별칭 지정 배리어는 동일하므로, 두 액세스가 서로 다른 두 ExecuteCommandLists 호출에 있을 때 동일한 물리적 메모리에 대한 두 별칭 지정된 액세스에는 별칭 지정 배리어가 필요하지 않습니다. D3D12 고급 사용 모델의 경우, ExecuteCommandLists의 동기화 정의는 별칭 지정 배리어와 동일합니다. 따라서 애플리케이션은 물리적 메모리를 재사용하는 사이에 별칭 지정 배리어를 삽입하거나, 물리적 메모리의 두 별칭 지정된 사용이 ExecuteCommandLists에 대한 두 개의 개별 호출에서 발생하도록 보장할 수 있습니다. 비활성화 양은 리소스 속성에 따라 다릅니다. 정의되지 않은 메모리 레이아웃이 있는 텍스처는 전체 텍스처가 원자적으로 비활성화되어야 하므로 최악의 경우입니다. 레이아웃이 정의된 두 개의 겹치는 리소스의 경우, 비활성화는 리소스의 겹치는 정렬된 영역만 초래할 수 있습니다. 데이터 상속조차 잘 정의될 수 있습니다. 자세한 내용은 메모리 별칭 지정 및 데이터 상속을 참조하세요.

요구 사항

헤더: d3d12_xs.h 또는 d3d12_x.h
라이브러리: d3d12_xs.lib 또는 d3d12_x.lib
지원 플랫폼: XBOX Series 콘솔 및 XBOX One 제품군

함께 보기

CreateCommittedResource CreateReservedResource ID3D12Device 공유 힙
마지막 수정일 2026년 8월 24일