CommandQueue
- 여러개의 CommandList들을 GPU에 제출하는 역할을 한다.
- 말 그대로 Queue형태로 동작하는 COM객체이다.
- ExcuteCommandList()를 통해 GPU에게 명령을 제출한다.
- 일감을 차곡차곡 기록했다가 한 번에 요청하는 개념
- 명령을 예약하는 방식이라 바로 실행되지는 않는다.
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Type =D3D12_COMMAND_LIST_TYPE_DIRECT;
queueDesc.Flags =D3D12_COMMAND_QUEUE_FLAG_NONE;
D3D12_COMMAND_QUEUE_DESC 구조체를 생성하여 CommandQueue의 세부사항을 작성한다.
위 코드에서는 GPU가 직접 실행할 수 있는 명령 버퍼라고 타입을 지정하고 있으며,
플래그는 기본 명령 큐로 설정하고 있다.
device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&_cmdQueue));
위 코드는 앞서 생성한 D3D12_COMMAND_QUEUE_DESC를 인자로
사용하여 CommandQueue 컴객체를 생성하고 있다.
CommandList와 CommandAllocator
- CommandList
- 주로 렌더링 명령(command)들을 담고있는 리스트이다.
- CommandAllocator를 통해서 어디에 있는 명령어 메모리를 가져다 쓸 지 저장한다.
- CommandList는 생성시 Open상태로 되며 Close상태로 바꿀 경우 더이상 명령을 추가할 수 없다.
- CommandAllocator
- 메모리 할당자의 의미를 가진다.
- GPU 명령을 저장하기 위한 메모리를 할당.
- CommandList에 담긴 그래픽 명령들의 메모리를 할당해주는 COM객체이다.
device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&_resCmdAlloc));
device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, _resCmdAlloc.Get(), nullptr, IID_PPV_ARGS(&_resCmdList));
_resCmdList->Close();
_resCmdAlloc->Reset();
_resCmdList->Reset(_resCmdAlloc.Get(), nullptr);
ID3D12CommandList* cmdListArr[] = { _resCmdList.Get() };
_cmdQueue->ExecuteCommandLists(_countof(cmdListArr), cmdListArr)
위 코드를 보면 CommandAllocator를 생성하고 그것을
CommandList를 생성할 때 인자로 사용한다는 것을 알 수 있다.
또한 Close된 List는 사용할 수 없기에 사용하기 전에
꼭 Reset을 하여 Open상태로 만들어 주어야 한다.
마지막으로 ExecuteCommandLists를 사용하여 GPU에게 명령을 요청한다.