]> git.cworth.org Git - apitrace/blobdiff - gui/loaderthread.cpp
Change apiarray to use a qvector instead of a qlist
[apitrace] / gui / loaderthread.cpp
index c8cbe579f3096c2faf123c8918a2f7296aa5be32..f311fe0d3e33f52e19bfcc1c471d8666a809d953 100644 (file)
 
 #include "trace_parser.hpp"
 
-LoaderThread::LoaderThread(QObject *parent)
-    : QThread(parent)
+#include <QFile>
+#include <QHash>
+#include <QUrl>
+
+#include <QDebug>
+
+#define FRAMES_TO_CACHE 100
+
+static ApiTraceCall *
+apiCallFromTraceCall(const Trace::Call *call,
+                     const QHash<QString, QUrl> &helpHash,
+                     ApiTraceFrame *frame)
+{
+    ApiTraceCall *apiCall = new ApiTraceCall(frame, call);
+
+    apiCall->setHelpUrl(helpHash.value(apiCall->name()));
+
+    return apiCall;
+}
+
+LoaderThread::LoaderThread(ApiTrace *parent)
+    : QThread(parent),
+      m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
+      m_trace(parent)
 {
 }
 
 void LoaderThread::run()
 {
-    QList<Trace::Call*> traceCalls;
+    QList<ApiTraceFrame*> frames;
+    ApiTraceFrame *currentFrame = 0;
+    int frameCount = 0;
+
+    QHash<QString, QUrl> helpHash;
+
+
+    QFile file(":/resources/glreference.tsv");
+    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+        QString line;
+        while (!file.atEnd()) {
+            line = file.readLine();
+            QString function = line.section('\t', 0, 0).trimmed();
+            QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
+            //qDebug()<<"function = "<<function<<", url = "<<url.toString();
+            helpHash.insert(function, url);
+        }
+    } else {
+        qWarning() << "Couldn't open reference file "
+                   << file.fileName();
+    }
+    file.close();
+
     Trace::Parser p;
+    QVector<ApiTraceCall*> calls;
+    quint64 binaryDataSize = 0;
     if (p.open(m_fileName.toLatin1().constData())) {
-        Trace::Call *call;
-        call = p.parse_call();
+        Trace::Call *call = p.parse_call();
         while (call) {
             //std::cout << *call;
-            traceCalls.append(call);
-            if (traceCalls.count() >= 1000) {
-                emit parsedCalls(traceCalls);
-                traceCalls.clear();
+            if (!currentFrame) {
+                currentFrame = new ApiTraceFrame(m_trace);
+                currentFrame->number = frameCount;
+                ++frameCount;
+            }
+            ApiTraceCall *apiCall =
+                apiCallFromTraceCall(call, helpHash, currentFrame);
+            calls.append(apiCall);
+            if (apiCall->hasBinaryData()) {
+                QByteArray data =
+                    apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
+                binaryDataSize += data.size();
             }
+            if (ApiTrace::isCallAFrameMarker(apiCall,
+                                             m_frameMarker)) {
+                calls.squeeze();
+                currentFrame->setCalls(calls, binaryDataSize);
+                calls.clear();
+                frames.append(currentFrame);
+                currentFrame = 0;
+                binaryDataSize = 0;
+                if (frames.count() >= FRAMES_TO_CACHE) {
+                    emit parsedFrames(frames);
+                    frames.clear();
+                }
+            }
+            delete call;
             call = p.parse_call();
         }
     }
-    if (traceCalls.count()) {
-        emit parsedCalls(traceCalls);
-        traceCalls.clear();
+    //last frames won't have markers
+    //  it's just a bunch of Delete calls for every object
+    //  after the last SwapBuffers
+    if (currentFrame) {
+        frames.append(currentFrame);
+        currentFrame = 0;
+    }
+    if (frames.count()) {
+        emit parsedFrames(frames);
     }
 }
 
@@ -36,4 +109,15 @@ void LoaderThread::loadFile(const QString &fileName)
     start();
 }
 
+ApiTrace::FrameMarker LoaderThread::frameMarker() const
+{
+    return m_frameMarker;
+}
+
+void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
+{
+    Q_ASSERT(!isRunning());
+    m_frameMarker = marker;
+}
+
 #include "loaderthread.moc"