1 #include "trace_loader.hpp"
3 #include "trace_snappyfile.hpp"
8 : m_frameMarker(FrameMarker_SwapBuffers)
17 Loader::FrameMarker Loader::frameMarker() const
22 void Loader::setFrameMarker(Loader::FrameMarker marker)
24 m_frameMarker = marker;
27 int Loader::numberOfFrames() const
29 return m_frameOffsets.size();
32 int Loader::numberOfCallsInFrame(int frameIdx) const
34 if (frameIdx > m_frameOffsets.size()) {
37 FrameOffsets::const_iterator itr =
38 m_frameOffsets.find(frameIdx);
39 return itr->second.numberOfCalls;
42 bool Loader::open(const char *filename)
44 if (!m_parser.open(filename)) {
45 std::cerr << "error: failed to open " << filename << "\n";
48 if (!m_parser.supportsOffsets()) {
49 std::cerr << "error: " <<filename<< " doesn't support seeking "
55 File::Offset startOffset;
59 int lastPercentReport = 0;
61 startOffset = m_parser.currentOffset();
62 callNum = m_parser.currentCallNumber();
64 while ((call = m_parser.scan_call())) {
67 if (isCallAFrameMarker(call)) {
68 File::Offset endOffset = m_parser.currentOffset();
69 FrameOffset frameOffset(startOffset);
70 frameOffset.numberOfCalls = numOfCalls;
71 frameOffset.callNumber = callNum;
73 m_frameOffsets[numOfFrames] = frameOffset;
76 if (m_parser.percentRead() - lastPercentReport >= 5) {
77 std::cerr << "\tPercent scanned = "
78 << m_parser.percentRead()
80 lastPercentReport = m_parser.percentRead();
82 startOffset = endOffset;
83 callNum = m_parser.currentCallNumber();
86 //call->dump(std::cout, color);
97 bool Loader::isCallAFrameMarker(const Trace::Call *call) const
99 std::string name = call->name();
101 switch (m_frameMarker) {
102 case FrameMarker_SwapBuffers:
103 return name.find("SwapBuffers") != std::string::npos ||
104 name == "CGLFlushDrawable" ||
105 name == "glFrameTerminatorGREMEDY";
107 case FrameMarker_Flush:
108 return name == "glFlush";
110 case FrameMarker_Finish:
111 return name == "glFinish";
113 case FrameMarker_Clear:
114 return name == "glClear";
120 std::vector<Trace::Call *> Loader::frame(int idx)
122 int numOfCalls = numberOfCallsInFrame(idx);
124 const FrameOffset &frameOffset = m_frameOffsets[idx];
125 std::vector<Trace::Call*> calls(numOfCalls);
126 m_parser.setCurrentOffset(frameOffset.start);
127 m_parser.setCurrentCallNumber(frameOffset.callNumber);
131 while ((call = m_parser.parse_call())) {
133 calls[parsedCalls] = call;
136 if (isCallAFrameMarker(call)) {
141 assert(parsedCalls == numOfCalls);
144 return std::vector<Trace::Call*>();