Что на самом деле измеряют glQueryCounter и GL_TIMESTAMP? - PullRequest
0 голосов
/ 30 августа 2018

Мой главный вопрос: может ли кто-нибудь подтвердить, что 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 должен возвращать метку времени после выполнения предыдущих команд, в отличие от того, что говорится на странице khronos.


Спецификация также поставляется с примером: Раздел «(2) В этом примере используется QueryCounter», предположительно показывает, как glQueryCounter и GL_TIMESTAMP используются для измерения прошедшего времени на GPU. Тем не менее, кажется, что этот пример неполон. Две переменные, _timeStart_ и _timeEnd_, никогда не используются. Вместо этого в примере значение GL_TIMESTAMP считывается непосредственно в переменную _timeElapsed_, что кажется неправильным. Насколько я понимаю, нам нужно прочитать GL_TIMESTAMP в _timeStart_ и _timeEnd_, а затем вычислить _timeElapsed_ = _timeEnd_ - _timeStart_.

1 Ответ

0 голосов
/ 30 августа 2018

Страницы документации по функциям OpenGL содержат, к сожалению, большое количество ошибок. Это одна из них. Это даже self -противоречиво, так как текст описания противоречит вводному тексту.

Спецификация OpenGL очень четко описывает поведение glQueryCounter:

Время записывается после того, как все предыдущие команды о состоянии клиента и сервера GL и кадрового буфера были полностью реализованы.


Спецификация также поставляется с примером

Неправильная спецификация. Спецификация ARB_timer_query предназначена для настольных компьютеров OpenGL; EXT_disjoint_timer_query для OpenGL ES. Не путайте их.

Примеры спецификации EXT_disjoint_timer_query, похоже, неправильно скопированы из ARB_timer_query.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...