查询

在 Direct3D 12 中,查询会分组为称为查询堆的查询数组。 查询堆具有一个类型,该类型用于定义可与该堆配合使用的有效查询类型。

从 Direct3D 11 到 Direct3D 12 的查询差异

Direct3D 12 不再使用以下查询类型,而是将其功能合并到其他进程:

  • 事件查询 - 事件功能现由栅栏处理。
  • 不连续的时间戳查询 - GPU 时钟可在 Direct3D 12 中设置为稳定状态(请参见计时一节)。 如果 GPU 在时间戳之间完全空闲(称为不连续查询),那么 GPU 时钟比较就没有意义。 通过稳定的电源,可以可靠地比较从不同命令列表发出的两个时间戳查询。 同一命令列表中的两个时间戳始终可以可靠地进行比较。
  • 流输出统计信息查询 - 在 Direct3D 12 中,对于所有输出流,没有单个流输出 (SO) 溢出查询。 应用需要发出多个单流查询,然后关联结果。
  • 流输出统计信息预测和封闭预测查询 - 查询(写入内存)和预测(读取内存)不再耦合,因此不需要这些查询类型。

新的二进制封闭查询类型已添加到 Direct3D 12。 这允许仅关注对象是否完全遮挡 (而不是遮挡多少像素的谓词策略,) 来向设备指示这一点,该设备可能能够更有效地执行查询。

查询堆

查询可以是多种类型 (D3D12_QUERY_HEAP_TYPE) ,在提交到 GPU 之前分组到查询堆中。

新的查询类型D3D12_QUERY_TYPE_BINARY_OCCLUSION可用,其作用类似于D3D12_QUERY_TYPE_OCCLUSION,只不过它返回二进制 0/1 结果:0 表示没有样本通过深度和模具测试,1 表示至少有一个样本通过了深度和模具测试。 这确保封闭查询不会干扰任何与深度/模具测试相关的 GPU 性能优化。

创建查询堆

与创建查询堆相关的 API 是枚举 D3D12_QUERY_HEAP_TYPE、结构 D3D12_QUERY_HEAP_DESCCreateQueryHeap 方法。

核心运行时将验证查询堆类型是否为 D3D12_HEAP_TYPE 枚举的有效成员,以及计数是否大于 0。

查询堆中的每个独立查询元素都可以分别启动和停止。

使用查询堆的 API 是枚举 D3D12_QUERY_TYPE,以及 BeginQueryEndQuery 方法。

D3D12_QUERY_TYPE_TIMESTAMP是唯一仅支持 EndQuery 的 查询。 其他所有查询类型都需要 BeginQuery 和 EndQuery

调试层将验证以下内容:

  • 开始时间戳查询是非法的 , 只能结束它
  • 在不结束查询(对于给定元素而言)的情况下开始两次查询是非法的。 对于需要开始和结束的查询,在给定元素) 的相应开始 (之前结束查询是非法的。
  • 传递到 BeginQuery 的查询类型必须与传递到 EndQuery 的查询类型相匹配

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

  • 无法在时间戳查询上调用 BeginQuery

  • 对于支持 BeginQueryEndQuery(除时间戳之外的所有)的查询类型,给定元素的查询不得跨越命令列表边界

  • ElementIndex 必须在范围内

  • 查询类型是 D3D12_QUERY_TYPE 枚举的有效成员。

  • 查询类型必须与查询堆兼容。 下表显示每个查询类型所需的查询堆类型:

    查询类型 查询堆类型
    D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS

     

  • 命令列表类型支持查询类型。 下表显示哪些命令列表类型支持哪些查询。

    查询类型 支持的命令列表类型
    D3D12_QUERY_TYPE_OCCLUSION 直接
    D3D12_QUERY_TYPE_BINARY_OCCLUSION 直接
    D3D12_QUERY_TYPE_TIMESTAMP 直接、计算和选择性复制
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS 直接
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 直接
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 直接
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 直接
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 直接

     

从查询中提取数据

从查询中提取数据的方法是使用 ResolveQueryData 方法ResolveQueryData 适用于所有内存类型 (无论是系统内存还是设备本地内存) ,但要求目标资源位于 D3D12_RESOURCE_STATE_COPY_DEST中。