DescriptorHeap이란?
🙇♀️DescriptorHeap
- [기안서] -> 표준 규격 양식?
- 외주를 맡길 때 이런 저런 정보들을 같이 넘겨줘야 하는데,
- 아무 형태로나 요청하면 못 알아먹는다
- 각종 리소스를 어떤 용도로 사용하는지 꼼꼼하게 적어서 넘겨주는 용도
🪐DescriptorHeap.h 분석
DescriptorHeap.h 전체 코드
#pragma once
class DescriptorHeap // View
{
public:
void Init(ComPtr<ID3D12Device> device, shared_ptr<class SwapChain> swapChain);
D3D12_CPU_DESCRIPTOR_HANDLE GetRTV(int32 idx) { return _rtvHandle[idx]; }
D3D12_CPU_DESCRIPTOR_HANDLE GetBackBufferView();
private:
ComPtr<ID3D12DescriptorHeap> _rtvHeap;
uint32 _rtvHeapSize = 0;
D3D12_CPU_DESCRIPTOR_HANDLE _rtvHandle[SWAP_CHAIN_BUFFER_COUNT];
shared_ptr<class SwapChain> _swapChain;
};
DirectX12에서는 DescriptorHeap이라고 부르고, DirectX11에서는 View라고 부른다.
그래서 View라고 말해도 찰떡같이 알아듣자.
이 친구는 설명서 그 자체다.
GPU에게 부탁을 할 때 설명서를 먼저 만들어주고 부탁을 해야한다.
rtv는 RenderTargetView의 약자이다.
🪐DescriptorHeap.cpp 분석
DescriptorHeap.cpp 전체 코드
#include "pch.h"
#include "DescriptorHeap.h"
#include "SwapChain.h"
void DescriptorHeap::Init(ComPtr<ID3D12Device> device, shared_ptr<SwapChain> swapChain)
{
_swapChain = swapChain;
// Descriptor (DX12) = View (DX11)
// [서술자 힙]으로 RTV 생성
// DX11의 RTV(RenderTargetView), DSV(DepthStencilView),
// CBV(ConstantBufferView), SRV(ShaderResourceView), UAV(UnorderedAccessView)를 전부!
_rtvHeapSize = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
D3D12_DESCRIPTOR_HEAP_DESC rtvDesc;
rtvDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
rtvDesc.NumDescriptors = SWAP_CHAIN_BUFFER_COUNT;
rtvDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
rtvDesc.NodeMask = 0;
// 같은 종류의 데이터끼리 배열로 관리
// RTV 목록 : [ ] [ ] [ ]
// DSV 목록 : [ ] [ ] [ ]
device->CreateDescriptorHeap(&rtvDesc, IID_PPV_ARGS(&_rtvHeap));
D3D12_CPU_DESCRIPTOR_HANDLE rtvHeapBegin = _rtvHeap->GetCPUDescriptorHandleForHeapStart();
for (int i = 0; i < SWAP_CHAIN_BUFFER_COUNT; ++i)
{
_rtvHandle[i] = CD3DX12_CPU_DESCRIPTOR_HANDLE(rtvHeapBegin, i * _rtvHeapSize);
device->CreateRenderTargetView(swapChain->GetRenderTarget(i).Get(), nullptr, _rtvHandle[i]);
}
}
D3D12_CPU_DESCRIPTOR_HANDLE DescriptorHeap::GetBackBufferView()
{
return GetRTV(_swapChain->GetCurrentBackBufferIndex());
}