1 #include "trace_loader.hpp"
3 #include "trace_snappyfile.hpp"
8 : m_frameMarker(FrameMarker_SwapBuffers),
18 Loader::FrameMarker Loader::frameMarker() const
23 void Loader::setFrameMarker(Loader::FrameMarker marker)
25 m_frameMarker = marker;
28 int Loader::numberOfFrames() const
30 return m_frameOffsets.size();
33 int Loader::numberOfCallsInFrame(int frameIdx) const
35 if (frameIdx > m_frameOffsets.size()) {
38 FrameOffsets::const_iterator itr =
39 m_frameOffsets.find(frameIdx);
40 return itr->second.numberOfCalls;
43 bool Loader::open(const char *filename)
45 if (!m_parser.open(filename)) {
46 std::cerr << "error: failed to open " << filename << "\n";
49 if (!m_parser.supportsOffsets()) {
50 std::cerr << "error: " <<filename<< " doesn't support seeking "
56 File::Offset startOffset;
61 startOffset = m_parser.currentOffset();
62 callNum = m_parser.currentCallNumber();
64 while ((call = m_parser.parse_call())) {
68 if (isCallAFrameMarker(call)) {
69 File::Offset endOffset = m_parser.currentOffset();
70 FrameOffset frameOffset(startOffset);
71 frameOffset.numberOfCalls = numOfCalls;
72 frameOffset.callNumber = callNum;
74 m_frameOffsets[numOfFrames] = frameOffset;
77 startOffset = endOffset;
78 callNum = m_parser.currentCallNumber();
81 //call->dump(std::cout, color);
92 bool Loader::isCallAFrameMarker(const Trace::Call *call) const
94 std::string name = call->name();
96 switch (m_frameMarker) {
97 case FrameMarker_SwapBuffers:
98 return name.find("SwapBuffers") != std::string::npos ||
99 name == "CGLFlushDrawable" ||
100 name == "glFrameTerminatorGREMEDY";
102 case FrameMarker_Flush:
103 return name == "glFlush";
105 case FrameMarker_Finish:
106 return name == "glFinish";
108 case FrameMarker_Clear:
109 return name == "glClear";
115 std::vector<Trace::Call *> Loader::frame(int idx)
117 int numOfCalls = numberOfCallsInFrame(idx);
119 const FrameOffset &frameOffset = m_frameOffsets[idx];
120 std::vector<Trace::Call*> calls(numOfCalls);
121 m_parser.setCurrentOffset(frameOffset.start);
122 m_parser.setCurrentCallNumber(frameOffset.callNumber);
126 while ((call = m_parser.parse_call())) {
128 calls[parsedCalls] = call;
131 if (isCallAFrameMarker(call)) {
136 assert(parsedCalls == numOfCalls);
139 return std::vector<Trace::Call*>();