1 #include "loaderthread.h"
3 #include "trace_parser.hpp"
11 #define FRAMES_TO_CACHE 100
14 apiCallFromTraceCall(const Trace::Call *call,
15 const QHash<QString, QUrl> &helpHash,
18 ApiTraceCall *apiCall = new ApiTraceCall(frame, call);
20 apiCall->setHelpUrl(helpHash.value(apiCall->name()));
25 LoaderThread::LoaderThread(ApiTrace *parent)
27 m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
32 void LoaderThread::run()
34 QList<ApiTraceFrame*> frames;
35 ApiTraceFrame *currentFrame = 0;
38 QHash<QString, QUrl> helpHash;
41 QFile file(":/resources/glreference.tsv");
42 if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
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);
52 qWarning() << "Couldn't open reference file "
58 QVector<ApiTraceCall*> calls;
59 quint64 binaryDataSize = 0;
60 if (p.open(m_fileName.toLatin1().constData())) {
61 Trace::Call *call = p.parse_call();
65 currentFrame = new ApiTraceFrame(m_trace);
66 currentFrame->number = frameCount;
69 ApiTraceCall *apiCall =
70 apiCallFromTraceCall(call, helpHash, currentFrame);
71 calls.append(apiCall);
72 if (apiCall->hasBinaryData()) {
74 apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
75 binaryDataSize += data.size();
77 if (ApiTrace::isCallAFrameMarker(apiCall,
80 currentFrame->setCalls(calls, binaryDataSize);
82 frames.append(currentFrame);
85 if (frames.count() >= FRAMES_TO_CACHE) {
86 emit parsedFrames(frames);
91 call = p.parse_call();
94 //last frames won't have markers
95 // it's just a bunch of Delete calls for every object
96 // after the last SwapBuffers
98 if (!frames.count()) {
100 currentFrame->setCalls(calls, binaryDataSize);
102 frames.append(currentFrame);
105 if (frames.count()) {
106 emit parsedFrames(frames);
110 void LoaderThread::loadFile(const QString &fileName)
112 m_fileName = fileName;
116 ApiTrace::FrameMarker LoaderThread::frameMarker() const
118 return m_frameMarker;
121 void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
123 Q_ASSERT(!isRunning());
124 m_frameMarker = marker;
127 #include "loaderthread.moc"