15 enable_tracing && desc->HasExtension(
"GL_EXT_disjoint_timer_query");
20 if (!enabled_ || active_frame_.has_value() ||
21 std::this_thread::get_id() != raster_thread_) {
30 gl.GenQueriesEXT(1, &query);
35 active_frame_ = query;
36 gl.BeginQueryEXT(GL_TIME_ELAPSED_EXT, query);
40 raster_thread_ = std::this_thread::get_id();
44 pending_traces_.clear();
45 active_frame_ = std::nullopt;
52 while (!pending_traces_.empty()) {
53 auto query = pending_traces_.front();
59 GLuint available = GL_FALSE;
60 gl.GetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
62 if (available != GL_TRUE) {
68 uint64_t duration = 0;
69 gl.GetQueryObjectui64vEXT(query, GL_QUERY_RESULT_EXT, &duration);
70 auto gpu_ms = duration / 1000000.0;
73 reinterpret_cast<int64_t
>(
this),
74 "FrameTimeMS", gpu_ms);
75 gl.DeleteQueriesEXT(1, &query);
76 pending_traces_.pop_front();
81 if (!enabled_ || std::this_thread::get_id() != raster_thread_ ||
82 !active_frame_.has_value()) {
86 auto query = active_frame_.value();
87 gl.EndQueryEXT(GL_TIME_ELAPSED_EXT);
89 pending_traces_.push_back(query);
90 active_frame_ = std::nullopt;
void MarkFrameEnd(const ProcTableGLES &gl)
Record the end of a frame workload.
void MarkFrameStart(const ProcTableGLES &gl)
Record the start of a frame workload, if one hasn't already been started.
GPUTracerGLES(const ProcTableGLES &gl, bool enable_tracing)
void RecordRasterThread()
Record the thread id of the raster thread.
void Reset()
Reset query tracking. Must be called when reusing reusing GLES context in a new window (e....
const DescriptionGLES * GetDescription() const
#define FML_TRACE_COUNTER(category_group, name, counter_id, arg1,...)