// count 和 concurrentNumCommands是SwapChain中image的数量
CommandQueueManager::CommandQueueManager(const Context& context, VkDevice device,
uint32_t count, uint32_t concurrentNumCommands,
uint32_t queueFamilyIndex, VkQueue queue,
VkCommandPoolCreateFlags flags,
const std::string& name)
: commandsInFlight_(concurrentNumCommands),
queueFamilyIndex_(queueFamilyIndex),
queue_(queue),
device_(device) {
fences_.reserve(commandsInFlight_); // fences也是有几个image就有几个fence
isSubmitted_.reserve(commandsInFlight_); // std::vector<bool>
bufferToDispose_.resize(commandsInFlight_); // std::vector<std::shared_ptr<Buffer>>>
deallocators_.resize(commandsInFlight_); // std::vector<std::vector<std::function<void()>>>
const VkCommandPoolCreateInfo commandPoolInfo = {
.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
.flags = flags,
.queueFamilyIndex = queueFamilyIndex_,
};
VK_CHECK(vkCreateCommandPool(device, &commandPoolInfo, nullptr, &commandPool_));
context.setVkObjectname(commandPool_, VK_OBJECT_TYPE_COMMAND_POOL,
"Command pool: " + name);
const VkCommandBufferAllocateInfo commandBufferInfo = {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.commandPool = commandPool_,
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
.commandBufferCount = 1,
};
for (size_t i = 0; i < count; ++i) {
VkCommandBuffer cmdBuffer;
VK_CHECK(vkAllocateCommandBuffers(device, &commandBufferInfo, &cmdBuffer));
context.setVkObjectname(cmdBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER,
"Command buffer: " + name + " " + std::to_string(i));
commandBuffers_.push_back(cmdBuffer);
}
for (size_t i = 0; i < commandsInFlight_; ++i) {
VkFence fence;
const VkFenceCreateInfo fenceInfo = {
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
.flags = VK_FENCE_CREATE_SIGNALED_BIT,
};
VK_CHECK(vkCreateFence(device, &fenceInfo, nullptr, &fence));
fences_.push_back(std::move(fence));
isSubmitted_.push_back(false);
}
}
创建CommandMgr
最新推荐文章于 2025-06-07 16:32:51 发布