Vulkan 描述符集池中最大集数的目的是什么?

问题描述

VkDescriptorPoolCreateInfo 结构中,我们指定了 maxSets 字段,用于配置可以从给定池中分配的描述符集的最大数量。但这个最大设置到底在做什么(如果有的话)?

例如,我们可以创建一个简单的应用程序,其中包含(比如)三个组合图像采样器和三个统一缓冲区,目的是为三重缓冲策略创建三个描述符集(采样器和 UBO)。

>

但应用程序理论上可以从这个池中分配 0 到 6 个集合,具体取决于分配的描述符集的布局和我们配置的 maxSets。即池不知道将请求什么布局,只知道每种资源类型的可用数量

那么 maxSets 是对硬件的提示吗?还是有其他原因?我已经查看了文档,但在规范中找不到除此行以外的任何内容

maxSets 是可以从池中分配的最大描述符集数。

或者是 Vulkan 使用它来仔细检查应用程序是否分配了比配置的池大小更多的集合?为了继续这个例子,我们可以将 maxSets 配置为四(如果不符合逻辑则有效)但是如果我们尝试从池中分配第四个描述符集,分配无论如何都会失败,因为池已用完,那么为什么要配置一个属性是应用程序的责任吗?

解决方法

对池进行限制的要点是能够预先分配执行某事或失败所需的资源,至少对用户将从中分配的分配数量有一个固定的限制。目标是,在某个时候,当您从池中请求资源时,系统将不再需要运行时分配资源。

单个描述符占用某种形式的资源,无论是 CPU、GPU 还是两者。但是将它们捆绑到描述符集也会占用资源,具体取决于实现。因此,如果一个实现可以预先分配一定数量的资源,这将有利于最大限度地减少运行时分配。

现在,通过提供多个描述符布局并说您只为每个特定布局分配一定数量的集合来定义描述符池可能更有意义。但这将是一个非常受限的描述符池模型。

因此,当前的接口在如此严格的模型和仅查看描述符而非集合的模型之间做出了折衷。