Index: gpu/command_buffer/service/gpu_tracer.cc |
diff --git a/gpu/command_buffer/service/gpu_tracer.cc b/gpu/command_buffer/service/gpu_tracer.cc |
index 364159ba4ccd02842b84ab5ad503d80a4d45fda8..84656c3ca5d5001865cc4a1379ab06ca8daeced2 100644 |
--- a/gpu/command_buffer/service/gpu_tracer.cc |
+++ b/gpu/command_buffer/service/gpu_tracer.cc |
@@ -11,6 +11,8 @@ |
#include "base/strings/string_util.h" |
#include "base/time/time.h" |
#include "gpu/command_buffer/common/gles2_cmd_utils.h" |
+#include "gpu/command_buffer/service/context_group.h" |
+#include "ui/gl/gl_version_info.h" |
namespace gpu { |
namespace gles2 { |
@@ -137,12 +139,10 @@ void GPUTrace::Start(bool trace_service) { |
case kTracerTypeDisjointTimer: |
// For the disjoint timer, GPU idle time does not seem to increment the |
- // internal counter. We must calculate the offset before any query. The |
- // good news is any device that supports disjoint timer will also support |
- // glGetInteger64v, so we can query it directly unlike the ARBTimer case. |
- // The "offset_" variable will always be 0 during normal use cases, only |
- // under the unit tests will it be set to specific test values. |
- if (offset_ == 0) { |
+ // internal counter. We must calculate the offset before any query. |
+ // glGetInteger64v is supported under ES3 which we check for before using |
+ // the kTracerTypeDisjointTimer. |
+ { |
GLint64 gl_now = 0; |
glGetInteger64v(GL_TIMESTAMP, &gl_now); |
offset_ = cpu_time_->GetCurrentTime() - |
@@ -180,7 +180,7 @@ bool GPUTrace::IsAvailable() { |
return false; |
GLint done = 0; |
- glGetQueryObjectiv(queries_[1], GL_QUERY_RESULT_AVAILABLE, &done); |
+ glGetQueryObjectivARB(queries_[1], GL_QUERY_RESULT_AVAILABLE, &done); |
return !!done; |
} |
@@ -385,7 +385,12 @@ scoped_refptr<CPUTime> GPUTracer::CreateCPUTime() { |
} |
GpuTracerType GPUTracer::DetermineTracerType() { |
- if (gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) { |
+ ContextGroup* context_group = decoder_->GetContextGroup(); |
+ const gpu::gles2::FeatureInfo* feature_info = context_group->feature_info(); |
+ const gfx::GLVersionInfo& version_info = feature_info->gl_version_info(); |
+ |
+ if (version_info.is_es3 && |
+ gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) { |
return kTracerTypeDisjointTimer; |
} else if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) { |
return kTracerTypeARBTimer; |
@@ -446,35 +451,16 @@ void GPUTracer::CalculateTimerOffset() { |
if (*gpu_trace_dev_category == '\0') { |
// If GPU device category is off, invalidate timing sync. |
gpu_timing_synced_ = false; |
- return; |
- } else if (tracer_type_ == kTracerTypeDisjointTimer) { |
- // Disjoint timers offsets should be calculated before every query. |
+ } else if (!gpu_timing_synced_ && tracer_type_ == kTracerTypeARBTimer) { |
+ TRACE_EVENT0("gpu", "GPUTracer::CalculateTimerOffset"); |
+ |
+ // ARB Timer is written for OpenGL 3.2 which contains glGetInteger64v(). |
+ GLint64 gl_now = 0; |
+ glGetInteger64v(GL_TIMESTAMP, &gl_now); |
+ timer_offset_ = cpu_time_->GetCurrentTime() - |
+ gl_now / base::Time::kNanosecondsPerMicrosecond; |
gpu_timing_synced_ = true; |
- timer_offset_ = 0; |
} |
- |
- if (gpu_timing_synced_) |
- return; |
- |
- TRACE_EVENT0("gpu", "GPUTracer::CalculateTimerOffset"); |
- |
- // NOTE(vmiura): It would be better to use glGetInteger64v, however |
- // it's not available everywhere. |
- GLuint64 gl_now = 0; |
- GLuint query; |
- |
- glGenQueriesARB(1, &query); |
- |
- glFinish(); |
- glQueryCounter(query, GL_TIMESTAMP); |
- glFinish(); |
- |
- glGetQueryObjectui64v(query, GL_QUERY_RESULT, &gl_now); |
- glDeleteQueriesARB(1, &query); |
- |
- gl_now /= base::Time::kNanosecondsPerMicrosecond; |
- timer_offset_ = cpu_time_->GetCurrentTime() - gl_now; |
- gpu_timing_synced_ = true; |
} |
} |