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_frameBookmarks.size();
31 int Loader::numberOfCallsInFrame(int frameIdx) const
33 if (frameIdx > m_frameBookmarks.size()) {
36 FrameBookmarks::const_iterator itr =
37 m_frameBookmarks.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 ParseBookmark startBookmark;
57 int lastPercentReport = 0;
59 m_parser.getBookmark(startBookmark);
61 while ((call = m_parser.scan_call())) {
64 if (isCallAFrameMarker(call)) {
65 FrameBookmark frameBookmark(startBookmark);
66 frameBookmark.numberOfCalls = numOfCalls;
68 m_frameBookmarks[numOfFrames] = frameBookmark;
71 if (m_parser.percentRead() - lastPercentReport >= 5) {
72 std::cerr << "\tPercent scanned = "
73 << m_parser.percentRead()
75 lastPercentReport = m_parser.percentRead();
78 m_parser.getBookmark(startBookmark);
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 FrameBookmark &frameBookmark = m_frameBookmarks[idx];
120 std::vector<Trace::Call*> calls(numOfCalls);
121 m_parser.setBookmark(frameBookmark.start);
125 while ((call = m_parser.parse_call())) {
127 calls[parsedCalls] = call;
130 if (isCallAFrameMarker(call)) {
135 assert(parsedCalls == numOfCalls);
138 return std::vector<Trace::Call*>();