创建描述符池
译者注:示例代码点击此处
收集到集合中的描述符是从描述符池中分配的。当我们创建一个池时,必须定义哪些描述符,以及它们中有多少可以从创建的池中分配。
怎么做...
- 获取应在其上创建描述符池的逻辑设备句柄。将其存储在名为logical_device的VkDevice类型变量中。
- 使用VkDescriptorPoolSize类型的元素创建名为descriptor_types的向量变量。为descriptor_types添加元素,该变量定义每个指定的描述符类型以及将从池中分配的给定类型的描述符数。
- 创建名为descriptor_pool_create_info的VkDescriptorPoolCreateInfo类型变量。对此变量的成员使用以下值:
·sType为VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO
·pNext为nullptr
·flags如果可以释放从该池分配的单个集或0值并仅允许一次性释放所有集(通过池重置操作)为VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT值
·maxSets为可以从池中分配的最大集合数
·poolSizeCount为descriptor_types向量元素个数
·pPoolSizes为descriptor_types第一个元素的指针
·创建名为descriptor_pool的VkDescriptorPool类型变量,其中将存储创建的池的句柄。 - 调用vkCreateDescriptorPool( logical_device, &descriptor_pool_create_info, nullptr, &descriptor_pool )并提供logical_device变量,指向descriptor_pool_create_info变量的指针,nullptr值和指向descriptor_pool变量的指针。
- 通过检查调用是否返回VK_SUCCESS值,确保已成功创建池。
这个怎么运作...
描述符池管理用于分配描述符集的资源(与命令池如何管理命令缓冲区的内存方式类似)。在描述符池创建期间,我们指定可以从给定池分配的最大集合量以及可以在所有集合中分配的给定类型的最大描述符数量。此信息通过VkDescriptorPoolCreateInfo类型的变量提供,如下所示:
VkDescriptorPoolCreateInfo descriptor_pool_create_info = {
VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
nullptr,
free_individual_sets ?
VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT : 0,
max_sets_count,
static_cast<uint32_t>(descriptor_types.size()),
descriptor_types.data()
};
在前面的示例中,描述符的类型及其总数通过descriptor_types向量变量提供。它可能包含多个元素,并且创建的池将足够大,以准许分配所有指定描述符。
池本身是这样创建的:
VkResult result = vkCreateDescriptorPool( logical_device, &descriptor_pool_create_info, nullptr, &descriptor_pool );
if( VK_SUCCESS != result ) {
std::cout << "Could not create a descriptor pool." << std::endl;
return false;
}
return true;
当我们创建了一个池时,可以从中分配描述符集。但我们必须记住,不能同时在多个线程中执行此操作。
提示:我们无法在多个线程中同时分配给定池中的描述符集。