Chromium Code Reviews| 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..534ab2f00efb191f67fa9bf94cd9ac4447119f3a 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; |
| } |
| @@ -229,7 +229,7 @@ bool GPUTracer::BeginDecoding() { |
| return false; |
| if (outputter_ == NULL) { |
| - tracer_type_ = DetermineTracerType(); |
| + tracer_type_ = DetermineTracerType(decoder_); |
| const char* tracer_type_name = "Unknown"; |
| switch (tracer_type_) { |
| case kTracerTypeDisjointTimer: |
| @@ -384,8 +384,13 @@ scoped_refptr<CPUTime> GPUTracer::CreateCPUTime() { |
| return new CPUTime(); |
| } |
| -GpuTracerType GPUTracer::DetermineTracerType() { |
| - if (gfx::g_driver_gl.ext.b_GL_EXT_disjoint_timer_query) { |
| +GpuTracerType GPUTracer::DetermineTracerType(gles2::GLES2Decoder* decoder) { |
| + 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; |
| @@ -447,34 +452,18 @@ void GPUTracer::CalculateTimerOffset() { |
| // 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_) { |
| + return; |
|
no sievers
2015/01/22 19:51:20
nit:
else if (!gpu_timing_synced_ && tracer_type
David Yen
2015/01/22 21:43:02
Done.
|
| + } else if (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; |
| } |
| } |