Vulkan创建命令池

命令池是一种对象,命令缓冲区通过这种对象获取内存。内存本身是通过隐式和动态方式分配的,没有内存命令缓冲区就无法记录命令。这就是在分配命令缓冲区前需要先为命令缓冲区创建内存池的原因。

具体处理过程

(1)创建一个VkDevice类型的变量,将其命名为logical_device,将一个已创建逻辑设备的句柄赋予该变量。
(2)获取由该逻辑设备提供的队列家族其中之一的索引,将该索引存储在一个类型为uint32_t的变量中,将该变量命名为queue_family。
(3)创建一个类型为VkCommandPoolCreateInfo的变量,将其命名为command_pool_create_info,将下列值赋予该变量中的各个成员。
● 将sType成员的值设置为VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO。
● 将pNext成员的值设置为nullptr。
● 将指明VkCommandPoolCreateFlags类型选定参数的位域值赋予flags成员。
● 将queue_family变量的值赋予queueFamilyIndex成员。
(4)创建一个VkCommandPool类型的变量,将其命名为command_pool,该变量用于存储命令池的句柄。
(5)调用vkCreateCommandPool(logical_device,&command_pool_create_info,nullptr,&command_pool)函数。将第一个参数设置为logical_device变量;将第二个参数设置为指向command_pool_create_info变量的指针;将第三个参数设置为nullptr;将第四个参数设置为指向command_pool变量的指针。
(6)确认该函数调用操作返回的值为VK_SUCCESS。

具体运行情况

命令池主要作为命令缓冲区的内存资源,但这不是创建它的唯一原因。命令池会通知驱动程序通过它分配的命令缓冲区的具体用途、是否必须由开发者重置和释放命令缓冲区,以及是否能够重置或释放单个命名缓冲区。通过VkCommandPoolCreateInfo类型变量(本例将该变量命名为command_pool_create_info)中的flags成员(由parameters变量代表)可以设置这些参数。

Vulkan创建命令池
当我们使用VK_COMMAND_POOL_CREATE_TRANSIENT_BIT设置flags成员时,就意味着通过指定命令池分配的命令缓冲区只会存在非常短的时间,这些命令缓冲区被提交的次数会极少,而且这些命令缓冲区会立刻被重置或释放。当我们使用VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT设置flags成员时,就意味着我们可以重置单个命令缓冲区。如果不使用这个标志值,就只能以群组方式重置命令缓冲区,即重置操作会应用于通过指定命令池分配的所有命令缓冲区。记录命令缓冲区的操作会自动重置命令缓冲区,因此在不使用VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT标志值的情况下,就只能记录命令缓冲区一次。如果想要再次记录这个命令缓冲区,就需要重置已在其中完成该命令缓冲区分配的整个命令池。

命令池还能够控制用于提交命令缓冲区的队列。这是通过队列家族索引实现的,我们必须在创建命令池的过程中提交该索引(只能提交在创建逻辑设备过程中使用的队列家族的索引)。通过指定命令池分配的命令缓冲区,只能提交给来自指定家族的队列。

使用下列代码可以创建命令池

Vulkan创建命令池
TIP 多个线程无法同时访问一个命令池(同一个命令池中的命令缓冲区无法同时由多个线程记录)。这就是记录命令缓冲区的每个应用程序线程,都需要使用独立命令池的原因。

创建好命令池后,就可以分配命令缓冲区了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战