| Index: gpu/perftests/texture_upload_perftest.cc
 | 
| diff --git a/gpu/perftests/texture_upload_perftest.cc b/gpu/perftests/texture_upload_perftest.cc
 | 
| index 7166c2a5922984e1d746856296e66fc0a9179528..f691c9e76d91f1b744f2609309ba91266e15f8b2 100644
 | 
| --- a/gpu/perftests/texture_upload_perftest.cc
 | 
| +++ b/gpu/perftests/texture_upload_perftest.cc
 | 
| @@ -8,10 +8,8 @@
 | 
|  #include "base/containers/small_map.h"
 | 
|  #include "base/memory/ref_counted.h"
 | 
|  #include "base/memory/scoped_ptr.h"
 | 
| -#include "base/time/time.h"
 | 
| -#include "base/timer/elapsed_timer.h"
 | 
| +#include "gpu/perftests/measurements.h"
 | 
|  #include "testing/gtest/include/gtest/gtest.h"
 | 
| -#include "testing/perf/perf_test.h"
 | 
|  #include "ui/gfx/geometry/size.h"
 | 
|  #include "ui/gl/gl_bindings.h"
 | 
|  #include "ui/gl/gl_context.h"
 | 
| @@ -103,9 +101,18 @@ class TextureUploadPerfTest : public testing::Test {
 | 
|                                                    surface_.get(),
 | 
|                                                    gfx::PreferIntegratedGpu);
 | 
|  
 | 
| +    ui::ScopedMakeCurrent smc(gl_context_.get(), surface_.get());
 | 
| +    if (gpu_timing_.Initialize(gl_context_.get())) {
 | 
| +      LOG(INFO) << "Gpu timing initialized with timer type: "
 | 
| +                << gpu_timing_.GetTimerTypeName();
 | 
| +      gpu_timing_.CheckAndResetTimerErrors();
 | 
| +      gpu_timing_.InvalidateTimerOffset();
 | 
| +    } else {
 | 
| +      LOG(WARNING) << "Can't initialize gpu timing";
 | 
| +    }
 | 
| +
 | 
|      // Prepare a simple program and a vertex buffer that will be
 | 
|      // used to draw a quad on the offscreen surface.
 | 
| -    ui::ScopedMakeCurrent smc(gl_context_.get(), surface_.get());
 | 
|      vertex_shader_ = LoadShader(GL_VERTEX_SHADER, kVertexShader);
 | 
|      fragment_shader_ = LoadShader(GL_FRAGMENT_SHADER, kFragmentShader);
 | 
|      program_object_ = glCreateProgram();
 | 
| @@ -153,26 +160,18 @@ class TextureUploadPerfTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| -  struct Measurement {
 | 
| -    Measurement() : name(), wall_time(){};
 | 
| -    Measurement(const std::string& name, const base::TimeDelta wall_time)
 | 
| -        : name(name), wall_time(wall_time){};
 | 
| -    std::string name;
 | 
| -    base::TimeDelta wall_time;
 | 
| -  };
 | 
|    // Upload and draw on the offscren surface.
 | 
|    // Return a list of pair. Each pair describe a gl operation and the wall
 | 
|    // time elapsed in milliseconds.
 | 
|    std::vector<Measurement> UploadAndDraw(const std::vector<uint8>& pixels,
 | 
|                                           const GLenum format,
 | 
|                                           const GLenum type) {
 | 
| -    std::vector<Measurement> measurements;
 | 
|      ui::ScopedMakeCurrent smc(gl_context_.get(), surface_.get());
 | 
|  
 | 
| -    base::ElapsedTimer total_timer;
 | 
| +    MeasurementTimers total_timers(&gpu_timing_);
 | 
|      GLuint texture_id = 0;
 | 
|  
 | 
| -    base::ElapsedTimer tex_timer;
 | 
| +    MeasurementTimers tex_timers(&gpu_timing_);
 | 
|      glActiveTexture(GL_TEXTURE0);
 | 
|      glGenTextures(1, &texture_id);
 | 
|      glBindTexture(GL_TEXTURE_2D, texture_id);
 | 
| @@ -184,9 +183,9 @@ class TextureUploadPerfTest : public testing::Test {
 | 
|      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | 
|      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 | 
|      CheckNoGlError();
 | 
| -    measurements.push_back(Measurement("teximage2d", tex_timer.Elapsed()));
 | 
| +    tex_timers.Record();
 | 
|  
 | 
| -    base::ElapsedTimer draw_timer;
 | 
| +    MeasurementTimers draw_timers(&gpu_timing_);
 | 
|      glUseProgram(program_object_);
 | 
|      glUniform1i(sampler_location_, 0);
 | 
|  
 | 
| @@ -195,13 +194,13 @@ class TextureUploadPerfTest : public testing::Test {
 | 
|      glEnableVertexAttribArray(0);
 | 
|  
 | 
|      glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 | 
| -    measurements.push_back(Measurement("drawarrays", draw_timer.Elapsed()));
 | 
| +    draw_timers.Record();
 | 
|  
 | 
| -    base::ElapsedTimer finish_timer;
 | 
| +    MeasurementTimers finish_timers(&gpu_timing_);
 | 
|      glFinish();
 | 
|      CheckNoGlError();
 | 
| -    measurements.push_back(Measurement("finish", finish_timer.Elapsed()));
 | 
| -    measurements.push_back(Measurement("total", total_timer.Elapsed()));
 | 
| +    finish_timers.Record();
 | 
| +    total_timers.Record();
 | 
|  
 | 
|      glDeleteTextures(1, &texture_id);
 | 
|  
 | 
| @@ -214,12 +213,19 @@ class TextureUploadPerfTest : public testing::Test {
 | 
|      // the appropriate format conversion.
 | 
|      EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
 | 
|      EXPECT_EQ(pixels, pixels_rendered);
 | 
| +
 | 
| +    std::vector<Measurement> measurements;
 | 
| +    measurements.push_back(total_timers.GetAsMeasurement("total"));
 | 
| +    measurements.push_back(tex_timers.GetAsMeasurement("teximage2d"));
 | 
| +    measurements.push_back(draw_timers.GetAsMeasurement("drawarrays"));
 | 
| +    measurements.push_back(finish_timers.GetAsMeasurement("finish"));
 | 
|      return measurements;
 | 
|    }
 | 
|  
 | 
|    const gfx::Size size_;  // for the offscreen surface and the texture
 | 
|    scoped_refptr<gfx::GLContext> gl_context_;
 | 
|    scoped_refptr<gfx::GLSurface> surface_;
 | 
| +  GPUTiming gpu_timing_;
 | 
|  
 | 
|    GLuint vertex_shader_ = 0;
 | 
|    GLuint fragment_shader_ = 0;
 | 
| @@ -241,16 +247,14 @@ TEST_F(TextureUploadPerfTest, glTexImage2d) {
 | 
|        for (const Measurement& m : run) {
 | 
|          auto& agg = aggregates[m.name];
 | 
|          agg.name = m.name;
 | 
| -        agg.wall_time += m.wall_time;
 | 
| +        agg.Increment(m);
 | 
|        }
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    for (const auto& entry : aggregates) {
 | 
| -    const auto& m = entry.second;
 | 
| -    perf_test::PrintResult(
 | 
| -        m.name, "", "", (m.wall_time / kUploadPerfTestRuns).InMillisecondsF(),
 | 
| -        "ms", true);
 | 
| +    const auto m = entry.second.Divide(kUploadPerfTestRuns);
 | 
| +    m.PrintResult();
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |