复制描述符

设备接口上的 ID3D12Device::CopyDescriptorsID3D12Device::CopyDescriptorsSimple 方法使用 CPU 立即复制描述符。 只要 CPU 或 GPU 上的多个线程不执行任何可能存在冲突的写入,就可以将它们称为自由线程。

立即复制描述符(CPU 时间线)

指定为一组描述符范围的源描述符(复制源)的数目必须等于指定为一组单独的描述符范围的目标描述符(复制到的)的数目。 源和目标范围不必对齐。 例如,稀疏的一组描述符可以复制到相邻的目的地,反之亦然,或者以某种组合形式复制。

在复制操作中可能会涉及到作为源和目标的多个描述符堆。 使用描述符句柄作为参数意味着复制方法不关心任何给定描述符所在的堆 - 它们都只是内存。

要从中复制以及复制到其中的描述符堆类型必须匹配,因此方法将单个描述符堆类型作为输入。 驱动程序需要知道给定复制操作中所有描述符的堆类型,以便知道复制操作涉及的数据大小。 如果给定描述符堆类型保证了实现细节,驱动程序可能还需要进行自定义复制工作。 请注意,描述符句柄本身没有标识它们所指向的类型;因此,复制操作需要一个附加参数。

如果只是将单个描述符范围从一个位置复制到另一个位置,则可使用 CopyDescriptors 的替代 API - CopyDescriptorsSimple

对于这些基于设备的(CPU 时间轴)描述符复制方法,源描述符必须来自非着色器可见描述符堆。 目标描述符可以位于 CPU 可见的任何描述符堆中(着色器可见或不可见)。

描述符