Vulkan启动命令缓冲区记录操作

当想要使用硬件执行操作时,需要记录它们并将它们提交给队列。命令会被记录到命令缓冲区中。当想要记录命令时,需要对选定的命令缓冲区启动记录操作,实际上就是将该命令缓冲区设置为记录状态。

具体处理过程

(1)获取已记录命令的命令缓冲区的句柄,将该句柄存储在一个VkCommandBuffer类型的变量中,将该变量命名为command_buffer。确保是在使用VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT标志值的情况下,通过命令池分配了命令缓冲区,否则命令缓冲区就会处于初始状态(被重置)。
(2)创建一个VkCommandBufferUsageFlags类型的位域变量,将其命名为usage,并根据符合的条件设置下列位。
● 如果该命令缓冲区仅被提交一次,就会被重置或被重新记录,则应设置VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT位(将该位设置为1)。
● 如果该命令缓冲区为次要命令缓冲区,并且被视为全部处于渲染通道内部,则应设置VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT位。
● 如果需要将该命令缓冲区多次提交给队列,而且在前一次提交这个命令缓冲区的操作完成之前,该命令缓冲区仍会在设备上被执行,则应设置VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT位。
(3)创建一个VkCommandBufferInheritanceInfo*类型的变量,将其命名为secondary_command_buffer_info。如果该命令缓冲区为主要命令缓冲区,就将nullptr赋予该变量。如果该命令缓冲区为次要命令缓冲区,就将一个通过下列值初始化各个成员的VkCommandBufferInheritanceInfo类型变量的地址赋予secondary_command_buffer_info变量。
● 将VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO赋予sType成员。
● 将nullptr赋予pNext成员。
● 如果该命令缓冲区会在可兼容渲染通道中被执行,则应将renderPass成员的值设置为该渲染通道的句柄;如果该命令缓冲区不会在渲染通道中被执行,则该值会被忽略(请参阅第6章)。
● 如果该命令缓冲区会在子渲染通道中被执行,则应将subpass成员的值设置为该子渲染通道的索引。如果该命令缓冲区不会在渲染通道中被执行,则该值会被忽略。
● 如果该命令缓冲区会在帧缓冲区中执行渲染操作,则应将framebuffer成员的值设置为该帧缓冲区的可选句柄。如果无法获取帧缓冲区的信息,或者该命令缓冲区不会在渲染通道中被执行,则应将framebuffer成员的值设置为VK_NULL_HANDLE。
● 如果该命令缓冲区为次要命令缓冲区且会被执行,而且执行它的主要命令缓冲区中激活了遮面查询功能,则应将occlusionQueryEnable成员的值设置为VK_TRUE;否则,应将occlusionQueryEnable成员的值设置为VK_FALSE,以表明该命令缓冲区无法在启用遮挡查询功能的情况下被执行。
● 将一组可用于激活遮挡查询功能的标志值赋予queryFlags成员。
● 将能够通过活动查询操作获得的一组统计数据赋予pipelineStatistics成员。
(4)创建一个VkCommandBufferBeginInfo类型的变量,将其命名为command_buffer_begin_info。使用下列值初始化该变量中的各个成员。
● 将VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO赋予sType成员。
● 将nullptr赋予pNext成员。
● 将usage变量的值赋予flags成员。
● 将secondary_command_buffer_info变量的值赋予pInheritanceInfo成员。
(5)调用vkBeginCommandBuffer(command_buffer,&command_buffer_begin_info)函数。将第一个参数设置为该命令缓冲区的句柄,将第二个参数设置为指向command_buffer_begin_info变量的指针。
(6)通过查明该函数调用操作的返回值等于VK_SUCCESS,确认该函数调用操作成功完成。

具体运行情况

记录命令缓冲区是我们在Vulkan中能够执行的最重要的操作,这是告诉硬件应该做什么和怎样做的唯一方式。当启动记录命令缓冲区的操作时,命令缓冲区的状态是不确定的。通常,命令缓冲区不会继承任何状态(OpenGL与此相反,当前状态会保持下去)。因此当记录操作时,还需要设置与这些操作关联的状态。绘制命令的状态就是一个典型例子,该命令使用的是顶点属性和索引。在记录绘制操作前,需要将合适的顶点数据缓冲区与顶点索引缓冲区绑定在一起。
主要命令缓冲区可以调用(执行)记录在次要命令缓冲区中的命令,被执行的次要命令缓冲区不会继承执行它们的主要命令缓冲区的状态。更为重要的是,执行次要命令缓冲区的操作被记录后,主要命令缓冲区的状态也是不确定的(当我们记录主要命令缓冲区,并执行其中的次要缓冲区时,如果想要继续记录主要命令缓冲区,就需要再次设置主要命令缓冲区的状态)。状态继承规则中仅有一个例外:当主要命令缓冲区位于渲染通道中,而且主要命令缓冲区中的次要命令缓冲区被执行时,该主要命令缓冲区所在的渲染通道和子渲染通道的状态会被保留下来。
在启动记录操作前,需要创建一个VkCommandBufferBeginInfo类型的变量,该变量用于提供记录参数。

Vulkan启动命令缓冲区记录操作
TIP为了不影响性能,应避免记录带有VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT标志的命令缓冲区。
启动记录操作:

Vulkan启动命令缓冲区记录操作
这样我们就可以将选用的操作记录到命令缓冲区中了,但是怎样才能知道哪些命令可以被记录到命令缓冲区中呢?实现这类命令的函数的名称都带有vkCmd前缀,而且这些函数的第一个参数都是命令缓冲区(由VkCommandBuffer类型的变量代表)。但是应注意,并非所有命令都能够记录到主要命令缓冲区和次要命令缓冲区中。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战