diff --git a/public/tracy/TracyOpenGL.hpp b/public/tracy/TracyOpenGL.hpp index 4b7c1991e9..189a810a37 100644 --- a/public/tracy/TracyOpenGL.hpp +++ b/public/tracy/TracyOpenGL.hpp @@ -102,6 +102,7 @@ class GpuCtx : m_context( GetGpuCtxCounter().fetch_add( 1, std::memory_order_relaxed ) ) , m_head( 0 ) , m_tail( 0 ) + , m_supportsQueryBufferObject( false ) { ZoneScopedC( Color::Red4 ); @@ -113,6 +114,14 @@ class GpuCtx "OpenGL context does not support GL_ARB_timer_query." ); } + // check for GL_QUERY_RESULT_NO_WAIT support + m_supportsQueryBufferObject = CheckFeature( "GL_ARB_query_buffer_object" ); + if( !m_supportsQueryBufferObject ) + { + Profiler::LogString( MessageSourceType::Tracy, MessageSeverity::Info, 0, 0, + "OpenGL context does not support GL_ARB_query_buffer_object." ); + } + GLint bits; glGetQueryiv( GL_TIMESTAMP, GL_QUERY_COUNTER_BITS, &bits ); if( bits == 0 ) @@ -197,12 +206,8 @@ class GpuCtx while( m_tail != m_head ) { - GLint available; - glGetQueryObjectiv( m_query[m_tail], GL_QUERY_RESULT_AVAILABLE, &available ); - if( !available ) return; - uint64_t time; - glGetQueryObjectui64v( m_query[m_tail], GL_QUERY_RESULT, &time ); + if( !GetTimestamp(time, m_tail) ) return; TracyLfqPrepare( QueueType::GpuTime ); MemWrite( &item->gpuTime.gpuTime, (int64_t)time ); @@ -239,6 +244,28 @@ class GpuCtx return exts && strstr( exts, feature ) != nullptr; } + tracy_force_inline bool GetTimestamp( uint64_t& timestamp, unsigned int queryId ) + { + if( m_supportsQueryBufferObject ) + { + constexpr uint64_t sentinel = ~uint64_t(0); + uint64_t time = sentinel; + glGetQueryObjectui64v( m_query[queryId], GL_QUERY_RESULT_NO_WAIT, &time ); + if ( time == sentinel ) return false; + timestamp = time; + } + else + { + GLint available; + glGetQueryObjectiv( m_query[queryId], GL_QUERY_RESULT_AVAILABLE, &available ); + if( available == GL_FALSE ) return false; + uint64_t time; + glGetQueryObjectui64v( m_query[queryId], GL_QUERY_RESULT, &time ); + timestamp = time; + } + return true; + } + #ifdef TRACY_OPENGL_AUTO_CALIBRATION // Monotonic host ns for the inter-calibration interval (cpuDelta), kept // separate from Profiler::GetTime() as in the D3D12/Vulkan backends. @@ -298,6 +325,8 @@ class GpuCtx #ifdef TRACY_OPENGL_AUTO_CALIBRATION int64_t m_prevCalibration; // host-ns timestamp of the last emitted calibration #endif + + bool m_supportsQueryBufferObject; }; class GpuCtxScope