]> git.cworth.org Git - apitrace/blobdiff - gui/traceloader.cpp
Add an option to indent the glsl code in the shader viewer.
[apitrace] / gui / traceloader.cpp
index ec392fb58467f5608d21e1ab5cd5f31d37b50f5a..cf9b37bb4f9485d292f854469e9daf3aa6733886 100644 (file)
@@ -28,6 +28,8 @@ TraceLoader::TraceLoader(QObject *parent)
 TraceLoader::~TraceLoader()
 {
     m_parser.close();
+    qDeleteAll(m_signatures);
+    qDeleteAll(m_enumSignatures);
 }
 
 void TraceLoader::loadTrace(const QString &filename)
@@ -36,21 +38,29 @@ void TraceLoader::loadTrace(const QString &filename)
         loadHelpFile();
     }
 
+    if (!m_frameBookmarks.isEmpty()) {
+        qDeleteAll(m_signatures);
+        qDeleteAll(m_enumSignatures);
+        m_signatures.clear();
+        m_enumSignatures.clear();
+        m_frameBookmarks.clear();
+        m_createdFrames.clear();
+        m_parser.close();
+    }
+
     if (!m_parser.open(filename.toLatin1())) {
         qDebug() << "error: failed to open " << filename;
         return;
     }
-    qDebug()<<"load trace with "<<filename;
+
     emit startedParsing();
 
-    qDebug() <<"\t support offsets = "<<m_parser.supportsOffsets();
     if (m_parser.supportsOffsets()) {
         scanTrace();
     } else {
         //Load the entire file into memory
         parseTrace();
     }
-
     emit finishedParsing();
 }
 
@@ -144,6 +154,7 @@ void TraceLoader::scanTrace()
             currentFrame = new ApiTraceFrame();
             currentFrame->number = numOfFrames;
             currentFrame->setNumChildren(numOfCalls);
+            currentFrame->setLastCallIndex(call->no);
             frames.append(currentFrame);
 
             m_createdFrames.append(currentFrame);
@@ -290,7 +301,7 @@ void TraceLoader::searchNext(int startFrame,
                         fetchFrameContents(frame);
                 for (int i = 0; i < calls.count(); ++i) {
                     if (calls[i]->index() == call->no) {
-                        emit searchResult(ApiTrace::SearchFound, calls[i]);
+                        emit searchResult(ApiTrace::SearchResult_Found, calls[i]);
                         break;
                     }
                 }
@@ -301,7 +312,7 @@ void TraceLoader::searchNext(int startFrame,
             delete call;
         }
     }
-    emit searchResult(ApiTrace::SearchNotFound, 0);
+    emit searchResult(ApiTrace::SearchResult_NotFound, 0);
 }
 
 void TraceLoader::searchPrev(int startFrame,
@@ -345,7 +356,7 @@ void TraceLoader::searchPrev(int startFrame,
             }
         }
     }
-    emit searchResult(ApiTrace::SearchNotFound, 0);
+    emit searchResult(ApiTrace::SearchResult_NotFound, 0);
 }
 
 bool TraceLoader::searchCallsBackwards(const QList<Trace::Call*> &calls,
@@ -361,7 +372,7 @@ bool TraceLoader::searchCallsBackwards(const QList<Trace::Call*> &calls,
                     fetchFrameContents(frame);
             for (int i = 0; i < apiCalls.count(); ++i) {
                 if (apiCalls[i]->index() == call->no) {
-                    emit searchResult(ApiTrace::SearchFound, apiCalls[i]);
+                    emit searchResult(ApiTrace::SearchResult_Found, apiCalls[i]);
                     break;
                 }
             }
@@ -406,6 +417,11 @@ QVector<ApiTraceCall*>
 TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
 {
     Q_ASSERT(currentFrame);
+
+    if (currentFrame->isLoaded()) {
+        return currentFrame->calls();
+    }
+
     if (m_parser.supportsOffsets()) {
         unsigned frameIdx = currentFrame->number;
         int numOfCalls = numberOfCallsInFrame(frameIdx);
@@ -456,14 +472,34 @@ TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
 
 void TraceLoader::findFrameStart(ApiTraceFrame *frame)
 {
-    loadFrame(frame);
+    if (!frame->isLoaded()) {
+        loadFrame(frame);
+    }
     emit foundFrameStart(frame);
 }
 
 void TraceLoader::findFrameEnd(ApiTraceFrame *frame)
 {
-    loadFrame(frame);
+    if (!frame->isLoaded()) {
+        loadFrame(frame);
+    }
     emit foundFrameEnd(frame);
 }
 
+void TraceLoader::findCallIndex(int index)
+{
+    int frameIdx = callInFrame(index);
+    ApiTraceFrame *frame = m_createdFrames[frameIdx];
+    QVector<ApiTraceCall*> calls = fetchFrameContents(frame);
+    QVector<ApiTraceCall*>::const_iterator itr;
+    ApiTraceCall *call = 0;
+    for (itr = calls.constBegin(); itr != calls.constEnd(); ++itr) {
+        if ((*itr)->index() == index) {
+            call = *itr;
+        }
+    }
+    Q_ASSERT(call);
+    emit foundCallIndex(call);
+}
+
 #include "traceloader.moc"