预测
预测是一项功能,它使 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 (并且只是别名) 状态,则调试层将发出错误。
可以预测的操作集是:
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle 本身不可预测。 相反,上面列表中包含在捆绑包一侧的各个操作都可预测。
ID3D12GraphicsCommandList 方法 ResolveQueryDataBeginQuery 和 EndQuery 不可预测。
相关主题
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈