]> git.cworth.org Git - apitrace/blob - common/trace_profiler.hpp
8463c61f4ff5d06230b7b3217cf3bb723389276b
[apitrace] / common / trace_profiler.hpp
1 /**************************************************************************
2  *
3  * Copyright 2012 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26 #ifndef TRACE_PROFILER_H
27 #define TRACE_PROFILER_H
28
29 #include <string>
30 #include <vector>
31 #include <stdint.h>
32
33 namespace trace
34 {
35
36 struct Profile {
37     struct Call {
38         unsigned no;
39
40         int64_t gpuStart;
41         int64_t gpuDuration;
42
43         int64_t cpuStart;
44         int64_t cpuDuration;
45
46         int64_t pixels;
47
48         std::string name;
49     };
50
51     struct Frame {
52         unsigned no;
53
54         int64_t gpuStart;
55         int64_t gpuDuration;
56
57         int64_t cpuStart;
58         int64_t cpuDuration;
59
60         /* Indices to profile->calls array */
61         struct {
62             unsigned begin;
63             unsigned end;
64         } calls;
65     };
66
67     struct Program {
68         Program() : gpuTotal(0), cpuTotal(0), pixelTotal(0) {}
69
70         uint64_t gpuTotal;
71         uint64_t cpuTotal;
72         uint64_t pixelTotal;
73
74         /* Indices to profile->calls array */
75         std::vector<unsigned> calls;
76     };
77
78     std::vector<Call> calls;
79     std::vector<Frame> frames;
80     std::vector<Program> programs;
81 };
82
83 class Profiler
84 {
85 public:
86     Profiler();
87     ~Profiler();
88
89     void setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_);
90
91     void addCall(unsigned no,
92                  const char* name,
93                  unsigned program,
94                  int64_t pixels,
95                  int64_t gpuStart, int64_t gpuDuration,
96                  int64_t cpuStart, int64_t cpuDuration);
97
98     void addFrameEnd();
99
100     bool hasBaseTimes();
101
102     void setBaseCpuTime(int64_t cpuStart);
103     void setBaseGpuTime(int64_t gpuStart);
104
105     int64_t getBaseCpuTime();
106     int64_t getBaseGpuTime();
107
108     static void parseLine(const char* line, Profile* profile);
109
110 private:
111     int64_t baseGpuTime;
112     int64_t baseCpuTime;
113     int64_t minCpuTime;
114
115     bool cpuTimes;
116     bool gpuTimes;
117     bool pixelsDrawn;
118 };
119 }
120
121 #endif // TRACE_PROFILER_H