预测

预测是一项功能,它使 GPU 而不是 CPU 能够确定不绘制、复制或调度对象。

概述

预测的典型用途是封闭;如果绘制了一个边界框并对其进行了封闭,则在绘制对象本身时显然没有任何意义。 在这种情况下,对象的绘制可以“谓词”,使 GPU 能够将其从实际呈现中删除。

起初,这似乎在标准深度测试加上早期深度通过之后显得令人发改。 但预测可以消除绘图命令状态本身的开销,以及光栅化。 虽然早期深度传递会删除不必要的像素,但它仍然可以执行顶点、外壳、域和几何着色器,并调用固定函数输入汇编程序、细化器和光栅器。 通过绘制简单的边界框或类似的边界体(比实际模型更易于处理和光栅化),可以避免不必要的光栅化和处理。

与 Direct3D 11 不同,预测与查询分离,并在 Direct3D 12 中进行扩展,以使应用程序能够根据应用开发人员可能决定的任何推理(而不仅仅是封闭)来预测对象。

SetPredication

可以根据缓冲区中 64 位的值设置 predication, (引用 D3D12_PREDICATION_OP) 。

当 GPU 执行 SetPredication 命令时,它会提取缓冲区中的值快照。 缓冲区中数据的未来更改不会追溯性地影响预测状态。

如果输入参数缓冲区为 NULL,则禁用预测。

Direct3D 12 API 中不存在预测提示;直接、计算和复制命令列表允许和预测。 源缓冲区可以是任何堆类型, (默认、上传、读回、自定义) 。

核心运行时将验证以下内容:

  • AlignedBufferOffset 是 8 个字节的倍数
  • 资源是一个缓冲区
  • 操作是枚举的有效成员
  • 无法从捆绑包中调用 SetPredication
  • 命令列表类型支持预测
  • 偏移量不超过缓冲区大小

如果源缓冲区不在 与 D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT 相同的D3D12_RESOURCE_STATE_PREDICATION (并且只是别名) 状态,则调试层将发出错误。

可以预测的操作集是:

ExecuteBundle 本身不可预测。 相反,上面列表中包含在捆绑包一侧的各个操作都可预测。

ID3D12GraphicsCommandList 方法 ResolveQueryDataBeginQueryEndQuery 不可预测

计数器和查询

性能度量

预测查询演练