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)
35 if (frameIdx > m_frameOffsets.size()) {
39 return m_frameOffsets[frameIdx].numberOfCalls;
42 bool Loader::open(const char *filename)
44 if (!m_parser.open(filename)) {
45 std::cerr << "error: failed to open " << filename << "\n";
50 File::Offset startOffset;
54 startOffset = m_parser.currentOffset();
56 while ((call = m_parser.parse_call())) {
60 if (isCallAFrameMarker(call)) {
61 File::Offset endOffset = m_parser.currentOffset();
62 FrameOffset frameOffset(startOffset, endOffset);
64 frameOffset.numberOfCalls = numOfCalls;
65 m_frameOffsets[numOfFrames] = frameOffset;
68 startOffset = endOffset;
71 //call->dump(std::cout, color);
82 bool Loader::isCallAFrameMarker(const Trace::Call *call) const
84 std::string name = call->name();
86 switch (m_frameMarker) {
87 case FrameMarker_SwapBuffers:
88 return name.find("SwapBuffers") != std::string::npos ||
89 name == "CGLFlushDrawable" ||
90 name == "glFrameTerminatorGREMEDY";
92 case FrameMarker_Flush:
93 return name == "glFlush";
95 case FrameMarker_Finish:
96 return name == "glFinish";
98 case FrameMarker_Clear:
99 return name == "glClear";
105 std::vector<Trace::Call *> Trace::Loader::frame(int idx)
107 int numOfCalls = numberOfCallsInFrame(idx);
109 std::vector<Trace::Call*> calls(numOfCalls);
110 m_parser.setCurrentOffset(m_frameOffsets[idx].start);
114 while ((call = m_parser.parse_call())) {
116 if (isCallAFrameMarker(call)) {
120 calls[parsedCalls] = call;
125 return std::vector<Trace::Call*>();