1/*
2 * Copyright 2012 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
8#ifndef TimerData_DEFINED
9#define TimerData_DEFINED
10
11#include "SkString.h"
12#include "SkTemplates.h"
13
14#ifdef SK_BUILD_FOR_WIN
15    #pragma warning(push)
16    #pragma warning(disable : 4530)
17#endif
18
19#include "SkJSONCPP.h"
20
21#ifdef SK_BUILD_FOR_WIN
22    #pragma warning(pop)
23#endif
24
25class Timer;
26
27class TimerData {
28public:
29    /**
30     * Constructs a TimerData to hold at most maxNumTimings sets of elapsed timer values.
31     **/
32    explicit TimerData(int maxNumTimings);
33
34    /**
35     * Collect times from the Timer for an iteration. It will fail if called more often than
36     * indicated in the constructor.
37     *
38     * @param Timer Must not be null.
39     */
40    bool appendTimes(Timer*);
41
42    enum Result {
43        kMin_Result,
44        kAvg_Result,
45        kPerIter_Result
46    };
47
48    enum TimerFlags {
49        kWall_Flag              = 0x1,
50        kTruncatedWall_Flag     = 0x2,
51        kCpu_Flag               = 0x4,
52        kTruncatedCpu_Flag      = 0x8,
53        kGpu_Flag               = 0x10
54    };
55
56    /**
57     * Gets the timer data results as a string.
58     * @param doubleFormat printf-style format for doubles (e.g. "%02d")
59     * @param result the type of result desired
60     * @param the name of the config being timed (prepended to results string)
61     * @param timerFlags bitfield of TimerFlags values indicating which timers should be reported.
62     * @param itersPerTiming the number of test/bench iterations that correspond to each
63     *        appendTimes() call, 1 when appendTimes is called for each iteration.
64     */
65    SkString getResult(const char* doubleFormat,
66                       Result result,
67                       const char* configName,
68                       uint32_t timerFlags,
69                       int itersPerTiming = 1);
70    Json::Value getJSON(uint32_t timerFlags,
71                        Result result,
72                        int itersPerTiming = 1);
73
74private:
75    int fMaxNumTimings;
76    int fCurrTiming;
77
78    SkAutoTArray<double> fWallTimes;
79    SkAutoTArray<double> fTruncatedWallTimes;
80    SkAutoTArray<double> fCpuTimes;
81    SkAutoTArray<double> fTruncatedCpuTimes;
82    SkAutoTArray<double> fGpuTimes;
83};
84
85#endif // TimerData_DEFINED
86