장치 초기화 - CommandQueue

이승덱·2021년 7월 27일
0

Graphics&DirectX

목록 보기
3/37

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)); // commandQueue를 생성
위 코드는 앞서 생성한 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에게 명령을 요청한다.
profile
공부 기록용 블로그입니다

0개의 댓글