]> git.cworth.org Git - apitrace/blob - common/trace_profiler.hpp
d8332420c63fc6ce622fd300315d275a85ba0db2
[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         unsigned program;
41
42         int64_t gpuStart;
43         int64_t gpuDuration;
44
45         int64_t cpuStart;
46         int64_t cpuDuration;
47
48         int64_t pixels;
49
50         std::string name;
51     };
52
53     struct Frame {
54         unsigned no;
55
56         int64_t gpuStart;
57         int64_t gpuDuration;
58
59         int64_t cpuStart;
60         int64_t cpuDuration;
61
62         /* Indices to profile->calls array */
63         struct {
64             unsigned begin;
65             unsigned end;
66         } calls;
67     };
68
69     struct Program {
70         Program() : gpuTotal(0), cpuTotal(0), pixelTotal(0) {}
71
72         uint64_t gpuTotal;
73         uint64_t cpuTotal;
74         uint64_t pixelTotal;
75
76         /* Indices to profile->calls array */
77         std::vector<unsigned> calls;
78     };
79
80     std::vector<Call> calls;
81     std::vector<Frame> frames;
82     std::vector<Program> programs;
83 };
84
85 class Profiler
86 {
87 public:
88     Profiler();
89     ~Profiler();
90
91     void setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_);
92
93     void addCall(unsigned no,
94                  const char* name,
95                  unsigned program,
96                  int64_t pixels,
97                  int64_t gpuStart, int64_t gpuDuration,
98                  int64_t cpuStart, int64_t cpuDuration);
99
100     void addFrameEnd();
101
102     bool hasBaseTimes();
103
104     void setBaseCpuTime(int64_t cpuStart);
105     void setBaseGpuTime(int64_t gpuStart);
106
107     int64_t getBaseCpuTime();
108     int64_t getBaseGpuTime();
109
110     static void parseLine(const char* line, Profile* profile);
111
112 private:
113     int64_t baseGpuTime;
114     int64_t baseCpuTime;
115     int64_t minCpuTime;
116
117     bool cpuTimes;
118     bool gpuTimes;
119     bool pixelsDrawn;
120 };
121 }
122
123 #endif // TRACE_PROFILER_H