Vulkan 指令池和指令缓存API

本文将会介绍指令池指令缓存管理时所使用的API函数。我们将学习理解指令缓存池的创建过程,并使用它来完成指令缓存的分配。我们还将学习重置和销毁过程的相关API函数。

创建指令池

指令池的创建可以使用API函数vkCreateCommandPool()。它需要传入一个结构体VkCommandPoolCreateInfo,以便设置指令缓存从指令池中分配时的一些默认属性。它还设置了自己所属的队列族。这个参数对于兼容指令池的创建来说是非常有用的,这类指令池可以用来优化传统队列所用的指令缓存对象。这个结构体的语法如下:
Vulkan 指令池和指令缓存API

结构体VkCommandPoolCreateInfo的参数类型如表所示:
Vulkan 指令池和指令缓存API

枚举量参数VK_COMMAND_POOL_CREATE_TRANSIENT_BIT设置了指令缓存从指令池中分配的频率较高,生命周期较短。也就是说,缓存可能会在很短的时间周期内就被释放或者再次重置。这个标志设置了指令缓存的特性,因此可以用来控制内存池中的内存分配方式。

如果我们设置了枚举量VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,它表示指令缓存从指令池当中分配完成之后,只能通过两种方式来重置,即显式调用vkResetCommandBuffer,或者隐式完成(通过vkBeginCommandBuffer)。如果我们没有设置这个标识的话,也就无法调用上面的两个API函数并作用于指令池中分配得到的可执行指令缓存。换句话说,这个标识设置指令缓存可以通过vkResetCommandPool函数来进行重置操作。

Vulkan中的指令池是通过对象VkCommandPool来表示的。我们需要通过API函数vkCreateCommandPool()创建它。下面给出了这个函数的主要语法:
Vulkan 指令池和指令缓存API

这个函数的参数域如表所示:
Vulkan 指令池和指令缓存API

如果用户需要了解更多有关VkAllocationCallbacks*allocator以及宿主机内存分配的问题,请参考Vulkan内存管理

1.重新设置指令池
指令池(对象VkCommandPool)可以通过函数vkResetCommandPool()来进行创建。以下给出这个函数的语法:

Vulkan 指令池和指令缓存API
这个函数的参数如表所示:
Vulkan 指令池和指令缓存API

2.销毁指令池
一个指令池可以通过API函数vkDestroyCommandPool()执行销毁:以下是函数的语法定义:
Vulkan 指令池和指令缓存API

函数的参数域如表所示:
Vulkan 指令池和指令缓存API

指令缓存的分配

指令池VkCommandPool)当中分配指令缓存的方法是使用函数vkAllocate-Command-Buffers()。这个函数需要输入一个VkCommandBufferAllocateInfo结构体对象,从而设置分配过程中所需的各种辅助参数。如果这个API的执行成功完成的话,它会返回一个VkCommandBuffer对象。以下给出这个函数的语法定义:
Vulkan 指令池和指令缓存API

函数的参数域如表所示:
Vulkan 指令池和指令缓存API

结构体VkCommandBufferAllocateInfo的成员变量如表所示:
Vulkan 指令池和指令缓存API

1.重新设置指令缓存
分配完成的指令缓存还可以通过函数vkResetCommandBuffer()进行重置。这个API函数需要一个VkCommandBuffer对象作为第一个输入参数,从而设置要重置的对象。第二个参数是一个按位的掩码值,类型为VkCommandBufferResetFlag,它用来控制重置时的具体行为。这个结构体只有一个枚举量,即VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT。如果我们设置了这个参数,那么指令缓存所对应的内存也会被返回到它的父指令池当中。
这个API函数的具体语法定义如下:
Vulkan 指令池和指令缓存API

2.释放指令缓存
我们可以通过API函数vkFreeCommandBuffer()来实现一个或者多个指令缓存的释放。以下给出这个函数的语法定义:
Vulkan 指令池和指令缓存API

函数vkFreeCommandBuffers()的输入参数以及对应的文字解释如表所示:
Vulkan 指令池和指令缓存API

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!