類名: CommandQueue
GPU會不斷的執行命令隊列中的指令,根據d3dx12.h能夠看到一個GPU維護多種類型的命令隊列ui
類名:CommandAllocatorPool
記錄命令列表插入的GPU指令this
類名:CommandListManager
插入GPU指令到命令分配器中3d
能夠理解爲特殊的GPU指令,GPU執行到圍欄指令時,會更新圍欄的值,用於判斷GPU執行到了哪一步code
命令分配器池子。用於管理生成並複用命令分配器。隊列
命令隊列。根據類型維護一個命令分配器池子、獨立賦值的圍欄string
維護命令隊列。it
直接生成了3個命令隊列。命令隊列內部有本身的分配器池子、圍欄。
這個會在程序啓動時初始化。io
CommandContext& CommandContext::Begin( const std::wstring ID ) { CommandContext* NewContext = g_ContextManager.AllocateContext(D3D12_COMMAND_LIST_TYPE_DIRECT); NewContext->SetID(ID); if (ID.length() > 0) EngineProfiling::BeginBlock(ID, NewContext); return *NewContext; }
AllocateContext中初始化或重置一個命令列表 CommandListManager::CreateNewCommandListclass
uint64_t CommandContext::Finish( bool WaitForCompletion ) { ... CommandQueue& Queue = g_CommandManager.GetQueue(m_Type); // 返回本次命令隊列的圍欄值 uint64_t FenceValue = Queue.ExecuteCommandList(m_CommandList); // 這裏面會把命令分配器與圍欄值關聯起來,存到等待隊列中 // 等下次再想分配一個命令分配器時,會根據已經執行完的圍欄值,來判斷等待隊列中的分配器是否能夠複用 Queue.DiscardAllocator(FenceValue, m_CurrentAllocator); m_CurrentAllocator = nullptr; ... if (WaitForCompletion) g_CommandManager.WaitForFence(FenceValue); g_ContextManager.FreeContext(this); return FenceValue; }