]> git.cworth.org Git - apitrace/blob - gui/loaderthread.cpp
f311fe0d3e33f52e19bfcc1c471d8666a809d953
[apitrace] / gui / loaderthread.cpp
1 #include "loaderthread.h"
2
3 #include "trace_parser.hpp"
4
5 #include <QFile>
6 #include <QHash>
7 #include <QUrl>
8
9 #include <QDebug>
10
11 #define FRAMES_TO_CACHE 100
12
13 static ApiTraceCall *
14 apiCallFromTraceCall(const Trace::Call *call,
15                      const QHash<QString, QUrl> &helpHash,
16                      ApiTraceFrame *frame)
17 {
18     ApiTraceCall *apiCall = new ApiTraceCall(frame, call);
19
20     apiCall->setHelpUrl(helpHash.value(apiCall->name()));
21
22     return apiCall;
23 }
24
25 LoaderThread::LoaderThread(ApiTrace *parent)
26     : QThread(parent),
27       m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
28       m_trace(parent)
29 {
30 }
31
32 void LoaderThread::run()
33 {
34     QList<ApiTraceFrame*> frames;
35     ApiTraceFrame *currentFrame = 0;
36     int frameCount = 0;
37
38     QHash<QString, QUrl> helpHash;
39
40
41     QFile file(":/resources/glreference.tsv");
42     if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
43         QString line;
44         while (!file.atEnd()) {
45             line = file.readLine();
46             QString function = line.section('\t', 0, 0).trimmed();
47             QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
48             //qDebug()<<"function = "<<function<<", url = "<<url.toString();
49             helpHash.insert(function, url);
50         }
51     } else {
52         qWarning() << "Couldn't open reference file "
53                    << file.fileName();
54     }
55     file.close();
56
57     Trace::Parser p;
58     QVector<ApiTraceCall*> calls;
59     quint64 binaryDataSize = 0;
60     if (p.open(m_fileName.toLatin1().constData())) {
61         Trace::Call *call = p.parse_call();
62         while (call) {
63             //std::cout << *call;
64             if (!currentFrame) {
65                 currentFrame = new ApiTraceFrame(m_trace);
66                 currentFrame->number = frameCount;
67                 ++frameCount;
68             }
69             ApiTraceCall *apiCall =
70                 apiCallFromTraceCall(call, helpHash, currentFrame);
71             calls.append(apiCall);
72             if (apiCall->hasBinaryData()) {
73                 QByteArray data =
74                     apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
75                 binaryDataSize += data.size();
76             }
77             if (ApiTrace::isCallAFrameMarker(apiCall,
78                                              m_frameMarker)) {
79                 calls.squeeze();
80                 currentFrame->setCalls(calls, binaryDataSize);
81                 calls.clear();
82                 frames.append(currentFrame);
83                 currentFrame = 0;
84                 binaryDataSize = 0;
85                 if (frames.count() >= FRAMES_TO_CACHE) {
86                     emit parsedFrames(frames);
87                     frames.clear();
88                 }
89             }
90             delete call;
91             call = p.parse_call();
92         }
93     }
94     //last frames won't have markers
95     //  it's just a bunch of Delete calls for every object
96     //  after the last SwapBuffers
97     if (currentFrame) {
98         frames.append(currentFrame);
99         currentFrame = 0;
100     }
101     if (frames.count()) {
102         emit parsedFrames(frames);
103     }
104 }
105
106 void LoaderThread::loadFile(const QString &fileName)
107 {
108     m_fileName = fileName;
109     start();
110 }
111
112 ApiTrace::FrameMarker LoaderThread::frameMarker() const
113 {
114     return m_frameMarker;
115 }
116
117 void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
118 {
119     Q_ASSERT(!isRunning());
120     m_frameMarker = marker;
121 }
122
123 #include "loaderthread.moc"