Vulkan 实现指令缓存

我们将实现指令缓存的一个用户类,名为CommandBufferMgr。这个类包含了可以直接使用的静态函数(不需要引入类对象的工具函数)。类的实现代码位于源码文件wrapper.h/.cpp当中,这个文件本身已经包含了很多种工具类的方法。

这个类当中大多数的函数都提供了一个默认的实现。也就是说,每个函数都给予用户一定的灵活性,可以从函数外部改变结构体的参数,并作为函数参数传入。这些函数参数继承了默认的设置值,所以如果用户并不想自己定义任何的参数的话,函数本身已经帮助我们设置了它们的默认值。

以下给出了CommandBufferMgr这个类的头文件声明部份。它声明了四个静态函数,分别负责执行内存的分配指令缓存的记录,以及指令缓存向后台队列的提交

Vulkan 实现指令缓存

实现指令缓存的分配过程

我们的allocCommandBuffer()函数允许用户从给定的指令池(cmdPool)来分配指令缓存(cmdBuf)。分配的行为可以通过指针参数VkCommandBufferAllocateInfo来进行控制。如果这个函数的最后一个参数保持默认参数值(NULL),那么VkCommand-BufferAllocateInfo将在函数内部自动生成,并用作指令缓存的分配之用,如下面的代码所示:

Vulkan 实现指令缓存

Vulkan 实现指令缓存

记录指令缓存的分配过程

我们可以直接使用这里的自定义封装函数(beginCommandBuffer()endCommand-Buffer())来实现记录功能。我们可以参考下面的代码来了解整个实现过程:
Vulkan 实现指令缓存
下面的代码给出了指令缓存录制结束时所需的函数:

Vulkan 实现指令缓存

如何使用指令缓存记录函数执行

本文演示如何使用指令缓存的管理工具函数。这些函数可以很好地简化指令缓存创建和提交相关的代码结构。

在下面的代码里,我们使用指令缓存创建了渲染通道的实例。首先,我们创建了指令池(cmdPool)并且用函数allocCommandBuffer()来分配一个指令缓存(vecCmdDraw)。这个指令缓存的记录范围可以通过函数beginCommandBuffer()和endCommandBuffer()来共同定义。在这个范围内定义的函数,即一系列的指令(vkCmdBeginRenderPass,vkCmdBindPipeline,vkCmdDraw,等等),都会被记录下来。我们暂时不考虑渲染通道创建过程相关的指令的工作原理,现在我们只考虑记录指令这件事即可。

最后,我们使用函数submitCommandBuffer()将指令缓存提交到队列,我们将在酷客教程中Vulkan内存管理对这个函数进行详细的解释:
Vulkan 实现指令缓存

提交指令到队列

我们通过调用函数submitCommandBuffer()来提交已经记录完毕的指令缓存。它需要四个参数。第一个参数设置了要提交到哪个队列(queue),而第二个参数是需要被提交执行的指令缓存(cmdBuffer)。第三个参数设置了提交过程的行为控制属性结构体(inSubmitInfo)。最后一个参数用来触发指令缓存提交完成的同步信号(fence):
Vulkan 实现指令缓存

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!