Vulkan分配命令缓冲区

命令缓冲区用于存储(记录)稍后提交给队列的命令,硬件会执行和处理队列中的这些命令并生成结果。创建好命令池后,就可以使用命令池分配命令缓冲区了。

具体处理过程

(1)获取已创建逻辑设备的句柄,将该句柄存储到一个VkDevice类型的变量中,将该变量命名为logical_device。
(2)获取命令池的句柄,将该句柄赋予一个VkCommandPool类型的变量,将该变量命名为command_pool。
(3)创建一个VkCommandBufferAllocateInfo类型的变量,将其命名为command_buffer_allocate_info,然后将下列值赋予该变量中的各个成员。
● 将VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO赋予sType成员。
● 将nullptr赋予pNext成员。
● 将command_pool变量的值赋予commandPool成员。
● 将level成员的值设置为VK_COMMAND_BUFFER_LEVEL_PRIMARY或VK_COMMAND_BUFFER_LEVEL_SECONDARY。
● 将commandBufferCount成员的值设置为我们想要分配的命令缓冲区数量。
(4)创建一个std::vector<VkCommandBuffer>类型的变量,将其命名为command_buffers。调整该vector容器变量的尺寸,使其含有的元素数量不小于我们想要创建命令缓冲区的数量。
(5)调用vkAllocateCommandBuffers(logical_device,&command_buffer_allocate_info,&command_buffers[0])函数。将第一个参数设置为逻辑设备的句柄;将第二个参数设置为指向command_buffer_allocate_info变量的指针;将第三个参数设置为指向vector容器command_buffers变量中第一个元素的指针。
(6)如果该函数调用操作成功了,该操作的返回值就会等于VK_SUCCESS,而且所有创建好的命令缓冲区的句柄都会存储在vector容器command_buffers变量中。

具体运行情况

命令缓冲区是通过命令池分配的,这使我们能够控制整个命令缓冲区分组的一些属性。首先,我们可以仅向在创建命令池过程中选定的家族队列提交命令缓冲区。其次,由于无法通过并发方式使用命令池,所以应该为应用程序中的每个线程创建独立的命令池,以便将同步化工作量降至最低,并提高应用程序的性能。

单个命令缓冲区拥有其自身的属性,这些属性中的一部分是在启动记录操作时设定的,但在分配命令缓冲区的过程中我们需要选择一个非常重要的参数——分配主要命令缓冲区,还是分配次要命令缓冲区。
● 主要命令缓冲区可以被直接提交给队列,还可以执行(调用)次要命令缓冲区。
● 次要命令缓冲区只能通过主要命令缓冲区被执行,而且不允许提交次要命令缓冲区。
这些参数是通过VkCommandBufferAllocateInfo类型的参数设定的。

Vulkan分配命令缓冲区

要分配命令缓冲区,可使用下列代码。

Vulkan分配命令缓冲区
分配好命令缓冲区后,就可以在我们编写的应用程序中使用它们了。要做到这一点,需要将操作记录到一个或多个命令缓冲区中,然后将它们提交给队列。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战