glQueryCounter和GL_TIMESTAMP真正衡量的是什么?

Mar*_*kus 8 opengl

我的主要问题是,有人可以确认glQueryCounter捕获GL_TIMESTAMP所有先前的命令在GPU上执行了吗?那么两个时间戳的差异大致相当于捕获GL_ELAPSED_TIME


我正在寻找的是一种测量两个以上时间戳之间的时间的方法,同时确保在执行所有先前调度的命令时捕获时间戳.我知道它GL_TIME_ELAPSED适用于两个时间点,但我需要一些可以嵌套并在单个帧中使用多个时间戳的东西,这就是我想要使用的原因GL_TIMESTAMP.时间戳可能是frameStart,drawCertainThingsStart,drawCertainThingsEnd,frameEnd.然而,规范GL_TIMESTAMP让我感到困惑,我不确定它是否符合我的要求.

不相交的计时器查询规范:https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt


一些信息似乎是矛盾的.例如: glQueryCounter:"在所有先前的命令到达GL服务器但尚未执行之后,将GL时间记录到查询对象中"

另一方面,不相交的计时器查询规范说"在GL客户端和服务器状态以及帧缓冲器上的所有先前命令完全实现之后记录时间.",这听起来像是在执行先前调度的命令之后记录时间戳.它还特别提到同步备选GetInteger64v返回时间戳而不必执行命令,强调glQueryCounter应该在执行前面的命令后返回时间戳,这与khron页面所说的相反.


该规范还配备了一个例子:部分"(2)本例使用QueryCounter"假想显示了如何glQueryCounterGL_TIMESTAMP用于测量在GPU上的经过时间.但是,似乎这个例子不完整.两个变量,_timeStart_并且_timeEnd_,永远不会使用.相反,该示例GL_TIMESTAMP直接将值读入_timeElapsed_变量,这似乎是错误的.从我的理解,我们需要读GL_TIMESTAMP_timeStart__timeEnd_,然后计算_timeElapsed_ = _timeEnd_ - _timeStart_.

Nic*_*las 5

不幸的是,OpenGL函数文档页面上存在大量错误.这是其中之一.它甚至自我 -contradictory,自描述的文本矛盾的介绍文字.

OpenGL 规范对以下行为非常清楚glQueryCounter:

在GL客户端和服务器状态上的所有先前命令和帧缓冲器已完全实现之后记录时间.


该规范还附带一个例子

错误的规格.ARB_timer_query规范适用于桌面OpenGL; EXT_disjoint_timer_query适用于OpenGL ES.不要混淆两者.

EXT_disjoint_timer_query规范的示例似乎从ARB_timer_query中错误地复制了.

  • @nebel:这实际上是一个必须在不同地方拥有相同信息的多个副本的问题。Vulkan 函数文档是根据与 Vulkan 规范相同的 AsciiDoctor 源构建的(Vulkan 规范巧妙地设计为部分作为参考文档),因此一个地方的更改就是所有地方的更改。每当您拥有必须传达相同信息的单独文档和规范时,您都将不可避免地遇到错误。 (2认同)