从 GPU 查询信息

Direct3D 运行时可能需要图形处理单元中的信息 (GPU) ,而不是输出呈现目标或输出顶点缓冲区。 由于 GPU 与 CPU 并行执行,因此用户模式显示驱动程序应提供有效地向 GPU 提供异步通信的函数。

查询对象是运行时和驱动程序用于异步通知的资源。 若要创建查询对象,运行时首先调用驱动程序的 CalcPrivateQuerySize 函数,以便驱动程序可以提供驱动程序所需的内存区域的大小。 然后,运行时调用驱动程序的 servicecontext.createquery (D3D10) 函数来创建查询对象。 在CalcPrivateQuerySizeservicecontext.createquery (D3D10) 调用中,运行时从pCreateQuery参数所指向的D3D10DDIARG_CREATEQUERY结构的查询成员的D3D10DDI_QUERY枚举提供查询类型值。

每个查询对象实例都存在于三种状态之一: 生成发出终止。 运行时调用驱动程序的 QueryBegin 函数,以将查询对象转换为生成状态。

注意 除 D3D10DDI_QUERY_EVENT 和 D3D10DDI_QUERY_TIMESTAMP 以外,所有查询类型都支持 QueryBegin 。 D3D10DDI_QUERY_EVENT 和 D3D10DDI_QUERY_TIMESTAMP 的构建概念不存在。

运行时调用驱动程序的 QueryEnd 函数,以将查询对象转换为已发送状态。 转换到终止状态的时间晚于异步发生。 运行时调用驱动程序的 QueryGetData 函数来检测查询是否已转换为终止状态。 如果查询处于终止状态,则 QueryGetData 可以向后传递返回的数据,该数据适用于 pData 参数指向的内存区域中的查询。

同一类型的所有查询对象都是 FIFO (即先进先出) 。 例如,"类型" 的所有查询对象 D3D10DDI_QUERY_EVENT 按照其发出的顺序在 FIFO 顺序中完成。 但是,不同类型的查询对象可以完成或以重叠顺序表示。 例如,类型 D3D10DDI_QUERY_EVENT 的查询可以在 D3D10DDI_QUERY_OCCLUSION 类型的查询之前完成,即使运行时在运行时发出 D3D10DDI_QUERY_OCCLUSION 查询后发出了 D3D10DDI_QUERY_EVENT 查询。

当运行时不再需要 query 对象时,运行时将释放以前为对象分配的内存区域,并调用驱动程序的 DestroyQuery (D3D10) 函数,以通知驱动程序驱动程序不能再访问此内存区域。