]> git.cworth.org Git - apitrace/blobdiff - trace_loader.cpp
First working on demand loading!
[apitrace] / trace_loader.cpp
index 254d2cb0af61fdfe1b68692fb99e54fcdd50741b..f91e09b00ef5ffe8a9575314c4848690ee7158a3 100644 (file)
@@ -5,8 +5,7 @@
 using namespace Trace;
 
 Loader::Loader()
-    : m_frameMarker(FrameMarker_SwapBuffers),
-      file(0)
+    : m_frameMarker(FrameMarker_SwapBuffers)
 {
 }
 
@@ -30,13 +29,14 @@ int Loader::numberOfFrames() const
     return m_frameOffsets.size();
 }
 
-int Loader::numberOfCallsInFrame(int frameIdx)
+int Loader::numberOfCallsInFrame(int frameIdx) const
 {
     if (frameIdx > m_frameOffsets.size()) {
         return 0;
     }
-
-    return m_frameOffsets[frameIdx].numberOfCalls;
+    FrameOffsets::const_iterator itr =
+        m_frameOffsets.find(frameIdx);
+    return itr->second.numberOfCalls;
 }
 
 bool Loader::open(const char *filename)
@@ -55,22 +55,32 @@ bool Loader::open(const char *filename)
     File::Offset startOffset;
     int numOfFrames = 0;
     int numOfCalls = 0;
+    unsigned callNum = 0;
+    int lastPercentReport = 0;
 
     startOffset = m_parser.currentOffset();
+    callNum = m_parser.currentCallNumber();
 
-    while ((call = m_parser.parse_call())) {
-
+    while ((call = m_parser.scan_call())) {
         ++numOfCalls;
 
         if (isCallAFrameMarker(call)) {
             File::Offset endOffset = m_parser.currentOffset();
-            FrameOffset frameOffset(startOffset, endOffset);
-
+            FrameOffset frameOffset(startOffset);
             frameOffset.numberOfCalls = numOfCalls;
+            frameOffset.callNumber = callNum;
+
             m_frameOffsets[numOfFrames] = frameOffset;
             ++numOfFrames;
 
+            if (m_parser.percentRead() - lastPercentReport >= 5) {
+                std::cerr << "\tPercent scanned = "
+                          << m_parser.percentRead()
+                          << "..."<<std::endl;
+                lastPercentReport = m_parser.percentRead();
+            }
             startOffset = endOffset;
+            callNum = m_parser.currentCallNumber();
             numOfCalls = 0;
         }
         //call->dump(std::cout, color);
@@ -111,8 +121,10 @@ std::vector<Trace::Call *> Loader::frame(int idx)
 {
     int numOfCalls = numberOfCallsInFrame(idx);
     if (numOfCalls) {
+        const FrameOffset &frameOffset = m_frameOffsets[idx];
         std::vector<Trace::Call*> calls(numOfCalls);
-        m_parser.setCurrentOffset(m_frameOffsets[idx].start);
+        m_parser.setCurrentOffset(frameOffset.start);
+        m_parser.setCurrentCallNumber(frameOffset.callNumber);
 
         Trace::Call *call;
         int parsedCalls = 0;