预测
谓词是一项功能,使 GPU 而不是 CPU 能够确定不绘制、复制或调度对象。
概述
预测的典型用途是封闭;如果绘制了一个边界框并对其进行了封闭,则在绘制对象本身时显然没有任何意义。 在这种情况下,可以“谓词”绘制对象,从而从 GPU 的实际呈现中删除对象。
起初,这看起来可能超过标准深度测试的冗余,以及早期深度通过。 但谓词可以消除绘图命令状态本身的开销,以及光栅化。 虽然早期深度传递会删除不必要的像素,但它仍然可以执行顶点、外壳、域和几何着色器,并调用固定函数输入汇编程序、细化器和光栅器。 通过绘制简单的边界框或类似的边界卷(比实际模型更容易处理和光栅化),可以避免不必要的光栅化和处理。
与 Direct3D 11 不同,预测与查询分离,并在 Direct3D 12 中进行扩展,以使应用程序能够根据应用开发人员可能决定的任何推理(而不仅仅是封闭)来预测对象。
SetPredication
可以根据缓冲区内 64 位的值(请参阅 D3D12_PREDICATION_OP)设置谓词。
当 GPU 执行 SetPredication 命令时,它会提取缓冲区中的值快照。 缓冲区中数据的未来更改不会追溯性地影响预测状态。
如果输入参数缓冲区为 NULL,则禁用预测。
Direct3D 12 API 中不存在谓词提示;直接、计算和复制命令列表允许进行谓词。 源缓冲区可以位于任何堆类型(默认、上传、读取、自定义)。
核心运行时将验证以下内容:
- AlignedBufferOffset 是 8 个字节的倍数
- 资源是一个缓冲区
- 操作是枚举的有效成员
- 无法从捆绑包中调用 SetPredication
- 命令列表类型支持预测
- 偏移量不超过缓冲区大小
如果源缓冲区不在D3D12_RESOURCE_STATE_PREDICATION(这与D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT相同,并且只是别名)状态,调试层将发出错误。
可以预测的操作集是:
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle 本身不可预测。 相反,上面列表中包含在捆绑包一侧的各个操作都可预测。
ID3D12GraphicsCommandList 方法 ResolveQueryDataBeginQuery 和 EndQuery 不可预测。
相关主题