着色器可见描述符堆

着色器可见描述符堆是描述符堆,可通过描述符表引用这些描述符堆。

概述

着色器可通过描述符表引用的描述符堆有多种风格:一种堆类型(D3D12_SRV_UAV_CBV_DESCRIPTOR_HEAP)可以保存着色器资源视图、无序访问视图和常量缓冲区视图(全部混合)。 堆中的任何给定位置都可以是列出的描述符类型之一。 另一种堆类型(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER)仅存储采样器,这反映了大多数硬件的采样器独立于 SRV、UAV、CBV 进行管理。

当创建堆时,可能会请求这些类型的描述符堆可见或不可见(后者(非着色器可见)可用于在 CPU 上暂存描述符。 当请求为着色器可见时,上述每个堆类型可能具有任何单个描述符堆分配的硬件大小限制。

应用程序可以创建任意数量的描述符堆,并且不限制非着色器可见描述符堆的大小。 如果应用程序创建的着色器可见描述符堆小于硬件大小限制,驱动程序可以选择将描述符堆从较大的基础描述符堆中子分配,以便多个 API 描述符堆适合一个硬件描述符堆。 发生这种情况的原因是,对于某些硬件,在执行期间在硬件描述符堆之间切换需要 GPU 等待空闲(以确保完成对以前描述符堆的 GPU 引用)。 如果应用程序创建的所有描述符堆都适合适用的硬件堆的最大容量,则在呈现期间切换 API 描述符堆时不会发生此类等待。 但是,应用程序必须允许切换当前描述符堆可能会导致等待空闲。

为了避免受到描述符堆交换机上空闲的这种可能等待的影响,应用程序可以利用呈现中断,这会导致 GPU 由于执行描述符堆切换的时间而处于空闲状态,因为无论如何都会等待空闲。

API 参考中介绍了用于在命令列表/捆绑记录期间将描述符堆标识为着色器的机制和语义。

示例

下图显示了两个描述符堆,这些描述符堆引用了两个单独的 2D 纹理,这些纹理存储在大型默认堆的两个槽中。 图形管道(包括着色器)可以访问着色器可见的描述符堆,因此 2D 纹理可用于管道。

可见和非可见描述符堆

注意

描述符堆通常限制 GPU 硬件的 GPU 本地内存量(称为写入组合内存)。 对于所有进程,此限制通常约为 96MB。 例如,包含 32 字节描述符的 100 万成员描述符堆将占用 32MB。 如果需要,驱动程序将回退到系统内存上,尽管最好不要创建大量大型描述符堆。

 

描述符堆