Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

Visual Studio

[Graphics] DX12의 CreateCommittedResource() 와 같은 동작을 Vulkan에서 하려면? 본문

Graphics

[Graphics] DX12의 CreateCommittedResource() 와 같은 동작을 Vulkan에서 하려면?

emacser 2024. 12. 23. 17:27

많은 DX12 예제에서 버퍼 등의 리소스를 생성할 때 ID3D12Device::CreateCommittedResource() 함수를 사용한다.

 

https://learn.microsoft.com/ko-kr/windows/win32/api/d3d12/nf-d3d12-id3d12device-createcommittedresource

 

ID3D12Device::CreateCommittedResource(d3d12.h) - Win32 apps

힙이 전체 리소스를 포함할 만큼 크고 리소스가 힙에 매핑되도록 리소스와 암시적 힙을 모두 만듭니다.

learn.microsoft.com

MS 문서를 보면, ID3D12Device::CreateCommittedResource() 함수는 생성될 리소스를 포함하는 크기의 암시적 힙(Implicit Heap)과 리소스를 생성한다고 되어있다. 

 

Vulkan을 배웠을 때는 이렇게 메모리와 리소스 할당을 같이 해주는 함수의 도움 없이 직접 아래의 과정을 거쳤어야 했기 때문에, 이런것들이 모여서 DX12와 Vulkan의 난이도 차이를 만드는 구나... 라는 생각을 했었다. (물론 Vulkan의 높은 난이도의 주범은 파편화와 스케줄링이라고 알고 있다.)

(Buffer Resource 생성시)
1. vkCreateBuffer() 함수 호출로 버퍼 객체를 생성한다.
2. vkGetMemoryRequirements() 함수로 Buffer Resource를 담기 위해 갖춰야 할 메모리의 정보를 가져온다.
3. vkAllocateMemory로 Requirements로부터 가져온 정보(Size, Memory Type 등)를 바탕으로 메모리를 할당한다.
4. vkBindMemory로 버퍼 리소스를 메모리에 바인딩한다.

 

 

물론 DX12에서는 메모리 할당과 리소스 생성을 별개로 해줄 수 없는 것은 아니다.

힙을 미리 만들고 해당 힙에 리소스를 배치시키고 싶을 때는 ID3D12Device::CreatePlacedResource() 함수를 사용할 수 있다.

이 경우 CreateHeap() 함수로 먼저 Heap을 만들고 생성한 힙 객체의 포인터를 ID3D12Device::CreatePlacedResource() 함수에 넘겨주면 된다.