释放描述符集
译者注:示例代码点击此处
如果我们想返回由描述符集分配的内存并将其返回给池,我们可以释放给定的描述符集。
怎么做...
- 使用逻辑设备的句柄初始化名为logical_device的VkDevice类型的变量。
- 获取使用VK_DESCRIPTOR_POOL_CREATE_FREE_DECRIPTOR_SET_BIT标志创建的描述符池。将其句柄存储在名为descriptor_pool的VkDescriptorPool类型变量。
- 创建名为descriptor_sets的std::vector<VkDescriptorSet>类型向量。添加应该释放到向量的所有描述符集。
- 调用 vkFreeDescriptorSets( logical_device, descriptor_pool, static_cast<uint32_t>(descriptor_sets.size()), descriptor_sets.data() )。提供logical_device和descriptor_pool变量、descriptor_sets向量中的元素数量、以及指向descriptor_sets向量的第一个元素指针。
- 通过检查是否返回VK_SUCCESS值来确保调用成功。
- 清楚descriptor_sets向量,因为我们不能再使用释放的描述符集的句柄。
这个怎么运作...
释放描述符集会释放它所有的内存并将其返回池中。应该可以从池中分配另一组相同类型,但由于池的内存碎片可能无法实现(在这种情况下,我们可能需要创建另一个池或重置池)。
我们可以一次释放多个描述符集,但它们都必须来自同一个池,是这样完成的:
VkResult result = vkFreeDescriptorSets( logical_device, descriptor_pool, static_cast<uint32_t>(descriptor_sets.size()), descriptor_sets.data() );
if( VK_SUCCESS != result ) {
std::cout << "Error occurred during freeing descriptor sets." << std::endl;
return false;
}
descriptor_sets.clear();
return true;
我们不能同时从多个线程释放同一池分配的描述符集。