| Index: gpu/perftests/measurements.cc
 | 
| diff --git a/gpu/perftests/measurements.cc b/gpu/perftests/measurements.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..270e459d55d7cbffacb029b5dad9841498d5fd4d
 | 
| --- /dev/null
 | 
| +++ b/gpu/perftests/measurements.cc
 | 
| @@ -0,0 +1,99 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "gpu/perftests/measurements.h"
 | 
| +
 | 
| +#include "testing/perf/perf_test.h"
 | 
| +
 | 
| +namespace gpu {
 | 
| +
 | 
| +Measurement::Measurement() : name(), wall_time(), cpu_time(), gpu_time() {
 | 
| +}
 | 
| +Measurement::Measurement(const Measurement& m)
 | 
| +    : name(m.name),
 | 
| +      wall_time(m.wall_time),
 | 
| +      cpu_time(m.cpu_time),
 | 
| +      gpu_time(m.gpu_time) {
 | 
| +}
 | 
| +Measurement::Measurement(const std::string& name,
 | 
| +                         const base::TimeDelta wall_time,
 | 
| +                         const base::TimeDelta cpu_time,
 | 
| +                         const base::TimeDelta gpu_time)
 | 
| +    : name(name), wall_time(wall_time), cpu_time(cpu_time), gpu_time(gpu_time) {
 | 
| +}
 | 
| +
 | 
| +void Measurement::PrintResult() const {
 | 
| +  perf_test::PrintResult(name, "_wall", "", wall_time.InMillisecondsF(), "ms",
 | 
| +                         true);
 | 
| +  if (cpu_time.InMicroseconds() >= 0) {
 | 
| +    perf_test::PrintResult(name, "_cpu", "", cpu_time.InMillisecondsF(), "ms",
 | 
| +                           true);
 | 
| +  }
 | 
| +  if (gpu_time.InMicroseconds() >= 0) {
 | 
| +    perf_test::PrintResult(name, "_gpu", "", gpu_time.InMillisecondsF(), "ms",
 | 
| +                           true);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +Measurement& Measurement::Increment(const Measurement& m) {
 | 
| +  wall_time += m.wall_time;
 | 
| +  cpu_time += m.cpu_time;
 | 
| +  gpu_time += m.gpu_time;
 | 
| +  return *this;
 | 
| +}
 | 
| +
 | 
| +Measurement Measurement::Divide(int a) const {
 | 
| +  return Measurement(name, wall_time / a, cpu_time / a, gpu_time / a);
 | 
| +}
 | 
| +
 | 
| +Measurement::~Measurement() {
 | 
| +}
 | 
| +
 | 
| +MeasurementTimers::MeasurementTimers(GPUTiming* gpu_timing)
 | 
| +    : wall_time_start_(), cpu_time_start_(), gpu_timer_() {
 | 
| +  DCHECK(gpu_timing);
 | 
| +  wall_time_start_ = base::TimeTicks::NowFromSystemTraceTime();
 | 
| +  if (base::TimeTicks::IsThreadNowSupported()) {
 | 
| +    cpu_time_start_ = base::TimeTicks::ThreadNow();
 | 
| +  } else {
 | 
| +    static bool logged_once = false;
 | 
| +    LOG_IF(WARNING, !logged_once) << "ThreadNow not supported.";
 | 
| +    logged_once = true;
 | 
| +  }
 | 
| +
 | 
| +  if (gpu_timing->IsAvailable()) {
 | 
| +    gpu_timer_.reset(new GPUTimer(gpu_timing));
 | 
| +    gpu_timer_->Start();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void MeasurementTimers::Record() {
 | 
| +  wall_time_ = base::TimeTicks::NowFromSystemTraceTime() - wall_time_start_;
 | 
| +  if (base::TimeTicks::IsThreadNowSupported()) {
 | 
| +    cpu_time_ = base::TimeTicks::ThreadNow() - cpu_time_start_;
 | 
| +  }
 | 
| +  if (gpu_timer_.get()) {
 | 
| +    gpu_timer_->End();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +Measurement MeasurementTimers::GetAsMeasurement(const std::string& name) {
 | 
| +  DCHECK_NE(base::TimeDelta(),
 | 
| +            wall_time_);  // At least wall_time_ has been set.
 | 
| +
 | 
| +  if (!base::TimeTicks::IsThreadNowSupported()) {
 | 
| +    cpu_time_ = base::TimeDelta::FromMicroseconds(-1);
 | 
| +  }
 | 
| +  int64 gpu_time = -1;
 | 
| +  if (gpu_timer_.get() != nullptr && gpu_timer_->IsAvailable()) {
 | 
| +    gpu_time = gpu_timer_->GetDeltaElapsed();
 | 
| +  }
 | 
| +  return Measurement(name, wall_time_, cpu_time_,
 | 
| +                     base::TimeDelta::FromMicroseconds(gpu_time));
 | 
| +}
 | 
| +
 | 
| +MeasurementTimers::~MeasurementTimers() {
 | 
| +}
 | 
| +
 | 
| +}  // namespace gpu
 | 
| 
 |