]> git.cworth.org Git - apitrace/blobdiff - gui/traceloader.cpp
Cleanup README formatting.
[apitrace] / gui / traceloader.cpp
index 7cb07f00aa1331e814c6d7025deffe76498a36fc..6110c5972d6416752bc82a1c0472812625907549 100644 (file)
@@ -20,8 +20,7 @@ apiCallFromTraceCall(const trace::Call *call,
 }
 
 TraceLoader::TraceLoader(QObject *parent)
-    : QObject(parent),
-      m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
+    : QObject(parent)
 {
 }
 
@@ -61,6 +60,7 @@ void TraceLoader::loadTrace(const QString &filename)
         //Load the entire file into memory
         parseTrace();
     }
+    emit guessedApi(static_cast<int>(m_parser.api));
     emit finishedParsing();
 }
 
@@ -69,34 +69,6 @@ void TraceLoader::loadFrame(ApiTraceFrame *currentFrame)
     fetchFrameContents(currentFrame);
 }
 
-void TraceLoader::setFrameMarker(ApiTrace::FrameMarker marker)
-{
-    m_frameMarker = marker;
-}
-
-bool TraceLoader::isCallAFrameMarker(const trace::Call *call) const
-{
-    std::string name = call->name();
-
-    switch (m_frameMarker) {
-    case ApiTrace::FrameMarker_SwapBuffers:
-        return  name.find("SwapBuffers") != std::string::npos ||
-                name == "CGLFlushDrawable" ||
-                name == "glFrameTerminatorGREMEDY";
-        break;
-    case ApiTrace::FrameMarker_Flush:
-        return name == "glFlush";
-        break;
-    case ApiTrace::FrameMarker_Finish:
-        return name == "glFinish";
-        break;
-    case ApiTrace::FrameMarker_Clear:
-        return name == "glClear";
-        break;
-    }
-    return false;
-}
-
 int TraceLoader::numberOfFrames() const
 {
     return m_frameBookmarks.size();
@@ -104,7 +76,7 @@ int TraceLoader::numberOfFrames() const
 
 int TraceLoader::numberOfCallsInFrame(int frameIdx) const
 {
-    if (frameIdx > m_frameBookmarks.size()) {
+    if (frameIdx >= m_frameBookmarks.size()) {
         return 0;
     }
     FrameBookmarks::const_iterator itr =
@@ -147,7 +119,7 @@ void TraceLoader::scanTrace()
     while ((call = m_parser.scan_call())) {
         ++numOfCalls;
 
-        if (isCallAFrameMarker(call)) {
+        if (call->flags & trace::CALL_FLAG_END_FRAME) {
             FrameBookmark frameBookmark(startBookmark);
             frameBookmark.numberOfCalls = numOfCalls;
 
@@ -217,8 +189,7 @@ void TraceLoader::parseTrace()
                     apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
             binaryDataSize += data.size();
         }
-        if (ApiTrace::isCallAFrameMarker(apiCall,
-                                         m_frameMarker)) {
+        if (call->flags & trace::CALL_FLAG_END_FRAME) {
             calls.squeeze();
             currentFrame->setCalls(calls, binaryDataSize);
             calls.clear();
@@ -386,7 +357,7 @@ int TraceLoader::callInFrame(int callIdx) const
 {
     unsigned numCalls = 0;
 
-    for (int frameIdx = 0; frameIdx <= m_frameBookmarks.size(); ++frameIdx) {
+    for (int frameIdx = 0; frameIdx < m_frameBookmarks.size(); ++frameIdx) {
         const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
         unsigned firstCall = numCalls;
         unsigned endCall = numCalls + frameBookmark.numberOfCalls;
@@ -439,8 +410,9 @@ TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
                 ApiTraceCall *apiCall =
                     apiCallFromTraceCall(call, m_helpHash,
                                          currentFrame, this);
-                calls[parsedCalls] = apiCall;
-                Q_ASSERT(calls[parsedCalls]);
+                Q_ASSERT(apiCall);
+                Q_ASSERT(parsedCalls < calls.size());
+                calls[parsedCalls++] = apiCall;
                 if (apiCall->hasBinaryData()) {
                     QByteArray data =
                         apiCall->arguments()[
@@ -448,20 +420,21 @@ TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
                     binaryDataSize += data.size();
                 }
 
-                ++parsedCalls;
-
                 delete call;
 
-                if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) {
+                if (apiCall->flags() & trace::CALL_FLAG_END_FRAME) {
                     break;
                 }
 
             }
-            assert(parsedCalls == numOfCalls);
-            Q_ASSERT(parsedCalls == calls.size());
+            // There can be fewer parsed calls when call in different
+            // threads cross the frame boundary
+            Q_ASSERT(parsedCalls <= numOfCalls);
+            Q_ASSERT(parsedCalls <= calls.size());
+            calls.resize(parsedCalls);
             calls.squeeze();
 
-            Q_ASSERT(parsedCalls == currentFrame->numChildrenToLoad());
+            Q_ASSERT(parsedCalls <= currentFrame->numChildrenToLoad());
             emit frameContentsLoaded(currentFrame,
                                      calls, binaryDataSize);
             return calls;
@@ -498,8 +471,9 @@ void TraceLoader::findCallIndex(int index)
             call = *itr;
         }
     }
-    Q_ASSERT(call);
-    emit foundCallIndex(call);
+    if (call) {
+        emit foundCallIndex(call);
+    }
 }
 
 void TraceLoader::search(const ApiTrace::SearchRequest &request)