blob: f3e8e3b0ec69483f3d298bf3772eb668cd421988 [file] [log] [blame]
mtklein9e64b782014-06-20 10:43:07 -07001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "BenchTimer.h"
9#if defined(SK_BUILD_FOR_WIN32)
10 #include "BenchSysTimer_windows.h"
11#elif defined(SK_BUILD_FOR_MAC)
12 #include "BenchSysTimer_mach.h"
13#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID)
14 #include "BenchSysTimer_posix.h"
15#else
16 #include "BenchSysTimer_c.h"
17#endif
18
19#if SK_SUPPORT_GPU
20#include "BenchGpuTimer_gl.h"
21#endif
22
23BenchTimer::BenchTimer(SkGLContextHelper* gl)
24 : fCpu(-1.0)
25 , fWall(-1.0)
26 , fTruncatedCpu(-1.0)
27 , fTruncatedWall(-1.0)
28 , fGpu(-1.0)
29{
30 fSysTimer = new BenchSysTimer();
31 fTruncatedSysTimer = new BenchSysTimer();
32#if SK_SUPPORT_GPU
33 if (gl) {
34 fGpuTimer = new BenchGpuTimer(gl);
35 } else {
36 fGpuTimer = NULL;
37 }
38#endif
39}
40
41BenchTimer::~BenchTimer() {
42 delete fSysTimer;
43 delete fTruncatedSysTimer;
44#if SK_SUPPORT_GPU
45 delete fGpuTimer;
46#endif
47}
48
49void BenchTimer::start(double durationScale) {
50 fDurationScale = durationScale;
51
52 fSysTimer->startWall();
53 fTruncatedSysTimer->startWall();
54#if SK_SUPPORT_GPU
55 if (fGpuTimer) {
56 fGpuTimer->startGpu();
57 }
58#endif
59 fSysTimer->startCpu();
60 fTruncatedSysTimer->startCpu();
61}
62
63void BenchTimer::end() {
64 fCpu = fSysTimer->endCpu() * fDurationScale;
65#if SK_SUPPORT_GPU
66 //It is important to stop the cpu clocks first,
67 //as the following will cpu wait for the gpu to finish.
68 if (fGpuTimer) {
69 fGpu = fGpuTimer->endGpu() * fDurationScale;
70 }
71#endif
72 fWall = fSysTimer->endWall() * fDurationScale;
73}
74
75void BenchTimer::truncatedEnd() {
76 fTruncatedCpu = fTruncatedSysTimer->endCpu() * fDurationScale;
77 fTruncatedWall = fTruncatedSysTimer->endWall() * fDurationScale;
78}
79
80WallTimer::WallTimer() : fWall(-1.0), fSysTimer(new BenchSysTimer) {}
81
82WallTimer::~WallTimer() {
83 delete fSysTimer;
84}
85
86void WallTimer::start(double durationScale) {
87 fDurationScale = durationScale;
88 fSysTimer->startWall();
89}
90
91void WallTimer::end() {
92 fWall = fSysTimer->endWall() * fDurationScale;
93}
94