1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#include "Timer.h"
8
9Timer::Timer(SkGLContext* gl)
10        : fCpu(-1.0)
11        , fWall(-1.0)
12        , fTruncatedCpu(-1.0)
13        , fTruncatedWall(-1.0)
14        , fGpu(-1.0)
15#if SK_SUPPORT_GPU
16        , fGpuTimer(gl)
17#endif
18        {}
19
20void Timer::start() {
21    fSysTimer.startWall();
22    fTruncatedSysTimer.startWall();
23#if SK_SUPPORT_GPU
24    fGpuTimer.start();
25#endif
26    fSysTimer.startCpu();
27    fTruncatedSysTimer.startCpu();
28}
29
30void Timer::end() {
31    fCpu = fSysTimer.endCpu();
32#if SK_SUPPORT_GPU
33    //It is important to stop the cpu clocks first,
34    //as the following will cpu wait for the gpu to finish.
35    fGpu = fGpuTimer.end();
36#endif
37    fWall = fSysTimer.endWall();
38}
39
40void Timer::truncatedEnd() {
41    fTruncatedCpu = fTruncatedSysTimer.endCpu();
42    fTruncatedWall = fTruncatedSysTimer.endWall();
43}
44
45WallTimer::WallTimer() : fWall(-1.0) {}
46
47void WallTimer::start() {
48    fSysTimer.startWall();
49}
50
51void WallTimer::end() {
52    fWall = fSysTimer.endWall();
53}
54
55SkString HumanizeMs(double ms) {
56    if (ms > 60e+3)  return SkStringPrintf("%.3gm", ms/60e+3);
57    if (ms >  1e+3)  return SkStringPrintf("%.3gs",  ms/1e+3);
58    if (ms <  1e-3)  return SkStringPrintf("%.3gns", ms*1e+6);
59#ifdef SK_BUILD_FOR_WIN
60    if (ms < 1)      return SkStringPrintf("%.3gus", ms*1e+3);
61#else
62    if (ms < 1)      return SkStringPrintf("%.3gµs", ms*1e+3);
63#endif
64    return SkStringPrintf("%.3gms", ms);
65}
66