@[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#VkCommandPoolCreateInfo
VkCommandPoolCreateInfo 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");
}
}