1 #include "trace_loader.hpp"
7 : m_frameMarker(FrameMarker_SwapBuffers)
16 Loader::FrameMarker Loader::frameMarker() const
21 void Loader::setFrameMarker(Loader::FrameMarker marker)
23 m_frameMarker = marker;
26 int Loader::numberOfFrames() const
28 return m_frameOffsets.size();
31 int Loader::numberOfCallsInFrame(int frameIdx) const
33 if (frameIdx > m_frameOffsets.size()) {
36 FrameOffsets::const_iterator itr =
37 m_frameOffsets.find(frameIdx);
38 return itr->second.numberOfCalls;
41 bool Loader::open(const char *filename)
43 if (!m_parser.open(filename)) {
44 std::cerr << "error: failed to open " << filename << "\n";
47 if (!m_parser.supportsOffsets()) {
48 std::cerr << "error: " <<filename<< " doesn't support seeking "
54 File::Offset startOffset;
58 int lastPercentReport = 0;
60 startOffset = m_parser.currentOffset();
61 callNum = m_parser.currentCallNumber();
63 while ((call = m_parser.scan_call())) {
66 if (isCallAFrameMarker(call)) {
67 File::Offset endOffset = m_parser.currentOffset();
68 FrameOffset frameOffset(startOffset);
69 frameOffset.numberOfCalls = numOfCalls;
70 frameOffset.callNumber = callNum;
72 m_frameOffsets[numOfFrames] = frameOffset;
75 if (m_parser.percentRead() - lastPercentReport >= 5) {
76 std::cerr << "\tPercent scanned = "
77 << m_parser.percentRead()
79 lastPercentReport = m_parser.percentRead();
81 startOffset = endOffset;
82 callNum = m_parser.currentCallNumber();
85 //call->dump(std::cout, color);
96 bool Loader::isCallAFrameMarker(const Trace::Call *call) const
98 std::string name = call->name();
100 switch (m_frameMarker) {
101 case FrameMarker_SwapBuffers:
102 return name.find("SwapBuffers") != std::string::npos ||
103 name == "CGLFlushDrawable" ||
104 name == "glFrameTerminatorGREMEDY";
106 case FrameMarker_Flush:
107 return name == "glFlush";
109 case FrameMarker_Finish:
110 return name == "glFinish";
112 case FrameMarker_Clear:
113 return name == "glClear";
119 std::vector<Trace::Call *> Loader::frame(int idx)
121 int numOfCalls = numberOfCallsInFrame(idx);
123 const FrameOffset &frameOffset = m_frameOffsets[idx];
124 std::vector<Trace::Call*> calls(numOfCalls);
125 m_parser.setCurrentOffset(frameOffset.start);
126 m_parser.setCurrentCallNumber(frameOffset.callNumber);
130 while ((call = m_parser.parse_call())) {
132 calls[parsedCalls] = call;
135 if (isCallAFrameMarker(call)) {
140 assert(parsedCalls == numOfCalls);
143 return std::vector<Trace::Call*>();