]> git.cworth.org Git - apitrace/blob - gui/loaderthread.cpp
Accept zero valued bitmasks.
[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 {
17     ApiTraceCall *apiCall = new ApiTraceCall();
18     apiCall->name = QString::fromStdString(call->sig->name);
19     apiCall->index = call->no;
20
21     QString argumentsText;
22     for (int i = 0; i < call->sig->arg_names.size(); ++i) {
23         apiCall->argNames +=
24             QString::fromStdString(call->sig->arg_names[i]);
25     }
26     if (call->ret) {
27         VariantVisitor retVisitor;
28         call->ret->visit(retVisitor);
29         apiCall->returnValue = retVisitor.variant();
30     }
31     for (int i = 0; i < call->args.size(); ++i) {
32         VariantVisitor argVisitor;
33         call->args[i]->visit(argVisitor);
34         apiCall->argValues += argVisitor.variant();
35     }
36
37     apiCall->helpUrl = helpHash.value(apiCall->name);
38
39     //force generation of the internal state
40     apiCall->filterText();
41     return apiCall;
42 }
43
44 LoaderThread::LoaderThread(QObject *parent)
45     : QThread(parent),
46       m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
47 {
48 }
49
50 void LoaderThread::run()
51 {
52     QList<ApiTraceFrame*> frames;
53     ApiTraceFrame *currentFrame = 0;
54     int frameCount = 0;
55
56     QHash<QString, QUrl> helpHash;
57
58
59     QFile file(":/resources/glreference.tsv");
60     if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
61         QString line;
62         while (!file.atEnd()) {
63             line = file.readLine();
64             QString function = line.section('\t', 0, 0).trimmed();
65             QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
66             //qDebug()<<"function = "<<function<<", url = "<<url.toString();
67             helpHash.insert(function, url);
68         }
69     } else {
70         qWarning() << "Couldn't open reference file "
71                    << file.fileName();
72     }
73     file.close();
74
75     Trace::Parser p;
76     if (p.open(m_fileName.toLatin1().constData())) {
77         Trace::Call *call;
78         call = p.parse_call();
79         while (call) {
80             //std::cout << *call;
81             if (!currentFrame) {
82                 currentFrame = new ApiTraceFrame();
83                 currentFrame->number = frameCount;
84                 ++frameCount;
85             }
86             ApiTraceCall *apiCall =
87                 apiCallFromTraceCall(call, helpHash);
88             apiCall->parentFrame = currentFrame;
89             currentFrame->calls.append(apiCall);
90             if (ApiTrace::isCallAFrameMarker(apiCall,
91                                              m_frameMarker)) {
92                 frames.append(currentFrame);
93                 currentFrame = 0;
94                 if (frames.count() >= FRAMES_TO_CACHE) {
95                     emit parsedFrames(frames);
96                     frames.clear();
97                 }
98             }
99             call = p.parse_call();
100         }
101     }
102     //last frames won't have markers
103     //  it's just a bunch of Delete calls for every object
104     //  after the last SwapBuffers
105     if (currentFrame) {
106         frames.append(currentFrame);
107         currentFrame = 0;
108     }
109     if (frames.count()) {
110         emit parsedFrames(frames);
111     }
112 }
113
114 void LoaderThread::loadFile(const QString &fileName)
115 {
116     m_fileName = fileName;
117     start();
118 }
119
120 ApiTrace::FrameMarker LoaderThread::frameMarker() const
121 {
122     return m_frameMarker;
123 }
124
125 void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
126 {
127     Q_ASSERT(!isRunning());
128     m_frameMarker = marker;
129 }
130
131 #include "loaderthread.moc"