| 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;
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |