Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions public/tracy/TracyOpenGL.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand All @@ -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 )
Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
Loading