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