【Vulkan入门】11-CreateCommandBuffer

发布于:2024-12-18 ⋅ 阅读:(192) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到