@[TOC]目录
先叨叨
先叠个甲,我个人都觉得本篇有点灌水的嫌疑。
到上篇为止,已经创建好了Pipeline。接下来就是要给Pipeline发指令进行渲染了。
从一开始就不断强调,发给Vulkan的指令要通过Queue发送给Device。命令不是一条一条推到Queue中的,而是要将命令先装到CommandBuffer中,本篇主要介绍如何创建CommandBuffer。
关键代码
Git信息
- repository: https://gitee.com/J8_series/easy-car-ui
- tag: 10-CreatePipeline
- url: https://gitee.com/J8_series/easy-car-ui/tree/10-CreatePipeline
VulkanEnv::CreateCommandPool()
CommandBuffer不是直接创建的,而是从CommandPool中分配的,因此需要先创建CommandPool。
void VulkanEnv::CreateCommandPool()
{//https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkCommandPoolCreateInfoVkCommandPoolCreateInfo createInfo{};createInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;createInfo.pNext = nullptr;createInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;createInfo.queueFamilyIndex = m_graphicsQueueFamilyIndex;if (VK_SUCCESS != vkCreateCommandPool(m_device, &createInfo, nullptr, &m_commandPool)){throw std::runtime_error("To create command pool is failed");}
}
VulkanEnv::CreateCommandBuffer()
有了CommandPool之后,便可以从中分配CommandBuffer了()
void VulkanEnv::CreateCommandBuffer()
{VkCommandBufferAllocateInfo allocInfo{};allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;allocInfo.commandPool = m_commandPool;allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;allocInfo.commandBufferCount = 1;if (VK_SUCCESS != vkAllocateCommandBuffers(m_device, &allocInfo, &m_commandBuffer)){throw std::runtime_error("To allocate command buffers is failed");}
}