]> git.cworth.org Git - apitrace/blob - trace_loader.cpp
Remove some currently unused member variables.
[apitrace] / trace_loader.cpp
1 #include "trace_loader.hpp"
2
3 #include "trace_snappyfile.hpp"
4
5 using namespace Trace;
6
7 Loader::Loader()
8     : m_frameMarker(FrameMarker_SwapBuffers)
9 {
10 }
11
12 Loader::~Loader()
13 {
14     close();
15 }
16
17 Loader::FrameMarker Loader::frameMarker() const
18 {
19     return m_frameMarker;
20 }
21
22 void Loader::setFrameMarker(Loader::FrameMarker marker)
23 {
24     m_frameMarker = marker;
25 }
26
27 int Loader::numberOfFrames() const
28 {
29     return m_frameOffsets.size();
30 }
31
32 int Loader::numberOfCallsInFrame(int frameIdx) const
33 {
34     if (frameIdx > m_frameOffsets.size()) {
35         return 0;
36     }
37     FrameOffsets::const_iterator itr =
38         m_frameOffsets.find(frameIdx);
39     return itr->second.numberOfCalls;
40 }
41
42 bool Loader::open(const char *filename)
43 {
44     if (!m_parser.open(filename)) {
45         std::cerr << "error: failed to open " << filename << "\n";
46         return false;
47     }
48     if (!m_parser.supportsOffsets()) {
49         std::cerr << "error: " <<filename<< " doesn't support seeking "
50                   << "\n";
51         return false;
52     }
53
54     Trace::Call *call;
55     File::Offset startOffset;
56     int numOfFrames = 0;
57     int numOfCalls = 0;
58     unsigned callNum = 0;
59
60     startOffset = m_parser.currentOffset();
61     callNum = m_parser.currentCallNumber();
62
63     while ((call = m_parser.scan_call())) {
64         ++numOfCalls;
65
66         if (isCallAFrameMarker(call)) {
67             File::Offset endOffset = m_parser.currentOffset();
68             FrameOffset frameOffset(startOffset);
69             frameOffset.numberOfCalls = numOfCalls;
70             frameOffset.callNumber = callNum;
71
72             m_frameOffsets[numOfFrames] = frameOffset;
73             ++numOfFrames;
74
75             startOffset = endOffset;
76             callNum = m_parser.currentCallNumber();
77             numOfCalls = 0;
78         }
79         //call->dump(std::cout, color);
80         delete call;
81     }
82     return true;
83 }
84
85 void Loader::close()
86 {
87     m_parser.close();
88 }
89
90 bool Loader::isCallAFrameMarker(const Trace::Call *call) const
91 {
92     std::string name = call->name();
93
94     switch (m_frameMarker) {
95     case FrameMarker_SwapBuffers:
96         return  name.find("SwapBuffers") != std::string::npos ||
97                 name == "CGLFlushDrawable" ||
98                 name == "glFrameTerminatorGREMEDY";
99         break;
100     case FrameMarker_Flush:
101         return name == "glFlush";
102         break;
103     case FrameMarker_Finish:
104         return name == "glFinish";
105         break;
106     case FrameMarker_Clear:
107         return name == "glClear";
108         break;
109     }
110     return false;
111 }
112
113 std::vector<Trace::Call *> Loader::frame(int idx)
114 {
115     int numOfCalls = numberOfCallsInFrame(idx);
116     if (numOfCalls) {
117         const FrameOffset &frameOffset = m_frameOffsets[idx];
118         std::vector<Trace::Call*> calls(numOfCalls);
119         m_parser.setCurrentOffset(frameOffset.start);
120         m_parser.setCurrentCallNumber(frameOffset.callNumber);
121
122         Trace::Call *call;
123         int parsedCalls = 0;
124         while ((call = m_parser.parse_call())) {
125
126             calls[parsedCalls] = call;
127             ++parsedCalls;
128
129             if (isCallAFrameMarker(call)) {
130                 break;
131             }
132
133         }
134         assert(parsedCalls == numOfCalls);
135         return calls;
136     }
137     return std::vector<Trace::Call*>();
138 }