]> git.cworth.org Git - apitrace/blob - trace_loader.cpp
Some initial thoughts on the on-demand loading api.
[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       file(0)
10 {
11 }
12
13 Loader::~Loader()
14 {
15     close();
16 }
17
18 Loader::FrameMarker Loader::frameMarker() const
19 {
20     return m_frameMarker;
21 }
22
23 void Loader::setFrameMarker(Loader::FrameMarker marker)
24 {
25     m_frameMarker = marker;
26 }
27
28 int Loader::numberOfFrames() const
29 {
30     return m_frameOffsets.size();
31 }
32
33 int Loader::numberOfCallsInFrame(int frameIdx)
34 {
35     if (frameIdx > m_frameOffsets.size()) {
36         return 0;
37     }
38
39     return m_frameOffsets[frameIdx].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
49     Trace::Call *call;
50     File::Offset startOffset;
51     int numOfFrames = 0;
52     int numOfCalls = 0;
53
54     startOffset = m_parser.currentOffset();
55
56     while ((call = m_parser.parse_call())) {
57
58         ++numOfCalls;
59
60         if (isCallAFrameMarker(call)) {
61             File::Offset endOffset = m_parser.currentOffset();
62             FrameOffset frameOffset(startOffset, endOffset);
63
64             frameOffset.numberOfCalls = numOfCalls;
65             m_frameOffsets[numOfFrames] = frameOffset;
66             ++numOfFrames;
67
68             startOffset = endOffset;
69             numOfCalls = 0;
70         }
71         //call->dump(std::cout, color);
72         delete call;
73     }
74     return true;
75 }
76
77 void Loader::close()
78 {
79     m_parser.close();
80 }
81
82 bool Loader::isCallAFrameMarker(const Trace::Call *call) const
83 {
84     std::string name = call->name();
85
86     switch (m_frameMarker) {
87     case FrameMarker_SwapBuffers:
88         return  name.find("SwapBuffers") != std::string::npos ||
89                 name == "CGLFlushDrawable" ||
90                 name == "glFrameTerminatorGREMEDY";
91         break;
92     case FrameMarker_Flush:
93         return name == "glFlush";
94         break;
95     case FrameMarker_Finish:
96         return name == "glFinish";
97         break;
98     case FrameMarker_Clear:
99         return name == "glClear";
100         break;
101     }
102     return false;
103 }
104
105 std::vector<Trace::Call *> Trace::Loader::frame(int idx)
106 {
107     int numOfCalls = numberOfCallsInFrame(idx);
108     if (numOfCalls) {
109         std::vector<Trace::Call*> calls(numOfCalls);
110         m_parser.setCurrentOffset(m_frameOffsets[idx].start);
111
112         Trace::Call *call;
113         int parsedCalls = 0;
114         while ((call = m_parser.parse_call())) {
115
116             if (isCallAFrameMarker(call)) {
117                 break;
118             }
119
120             calls[parsedCalls] = call;
121             ++parsedCalls;
122         }
123         return calls;
124     }
125     return std::vector<Trace::Call*>();
126 }