デバイス初期化-CommandQueue


CommandQueue

  • は、複数のコマンドリストをGPUに送信する.
  • は、その名の通りキュー形式で実行されるCOMオブジェクトである.
  • ExcuteCommandList()でGPUにコマンドを発行します.
  • 1回のレコード
  • 日、次いで1回のリクエストの概念
  • コマンドを予約する方式なので、すぐには実行されません.
  • 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でコマンドメモリを格納します.
  • コマンドリストは作成時に開いていますが、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에게 명령을 요청한다.