从 GPU 查询信息

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

查询对象是运行时和驱动程序用于异步通知的资源。 若要创建查询对象,运行时首先调用驱动程序的 CalcPrivateQuerySize 函数,以便驱动程序可以提供驱动程序对查询对象所需的内存区域大小。 然后,运行时调用驱动程序的 CreateQuery (D3D10) 函数来创建查询对象。 在 CalcPrivateQuerySizeCreateQuery (D3D10) 调用中,运行时从 pCreateQuery 参数指向的 D3D10DDIARG_CREATEQUERY 结构的 Query 成员中的 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查询。

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