]> git.cworth.org Git - apitrace/blob - gui/loaderthread.cpp
f3a4c5a268f6209238dd232dcbc52ef80f615749
[apitrace] / gui / loaderthread.cpp
1 #include "loaderthread.h"
2
3 #include "trace_parser.hpp"
4
5 #define FRAMES_TO_CACHE 100
6
7 static ApiTraceCall *
8 apiCallFromTraceCall(const Trace::Call *call)
9 {
10     ApiTraceCall *apiCall = new ApiTraceCall();
11     apiCall->name = QString::fromStdString(call->sig->name);
12     apiCall->index = call->no;
13
14     QString argumentsText;
15     for (int i = 0; i < call->sig->arg_names.size(); ++i) {
16         apiCall->argNames +=
17             QString::fromStdString(call->sig->arg_names[i]);
18     }
19     if (call->ret) {
20         VariantVisitor retVisitor;
21         call->ret->visit(retVisitor);
22         apiCall->returnValue = retVisitor.variant();
23     }
24     for (int i = 0; i < call->args.size(); ++i) {
25         VariantVisitor argVisitor;
26         call->args[i]->visit(argVisitor);
27         apiCall->argValues += argVisitor.variant();
28     }
29
30     //force generation of the internal state
31     apiCall->filterText();
32     return apiCall;
33 }
34
35 LoaderThread::LoaderThread(QObject *parent)
36     : QThread(parent),
37       m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
38 {
39 }
40
41 void LoaderThread::run()
42 {
43     QList<ApiTraceFrame*> frames;
44     ApiTraceFrame *currentFrame = 0;
45     int frameCount = 0;
46     Trace::Parser p;
47     if (p.open(m_fileName.toLatin1().constData())) {
48         Trace::Call *call;
49         call = p.parse_call();
50         while (call) {
51             //std::cout << *call;
52             if (!currentFrame) {
53                 currentFrame = new ApiTraceFrame();
54                 currentFrame->number = frameCount;
55                 ++frameCount;
56             }
57             ApiTraceCall *apiCall =
58                 apiCallFromTraceCall(call);
59             apiCall->parentFrame = currentFrame;
60             currentFrame->calls.append(apiCall);
61             if (ApiTrace::isCallAFrameMarker(apiCall,
62                                              m_frameMarker)) {
63                 frames.append(currentFrame);
64                 currentFrame = 0;
65                 if (frames.count() >= FRAMES_TO_CACHE) {
66                     emit parsedFrames(frames);
67                     frames.clear();
68                 }
69             }
70             call = p.parse_call();
71         }
72     }
73     //last frames won't have markers
74     //  it's just a bunch of Delete calls for every object
75     //  after the last SwapBuffers
76     if (currentFrame) {
77         frames.append(currentFrame);
78         currentFrame = 0;
79     }
80     if (frames.count()) {
81         emit parsedFrames(frames);
82     }
83 }
84
85 void LoaderThread::loadFile(const QString &fileName)
86 {
87     m_fileName = fileName;
88     start();
89 }
90
91 ApiTrace::FrameMarker LoaderThread::frameMarker() const
92 {
93     return m_frameMarker;
94 }
95
96 void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
97 {
98     Q_ASSERT(!isRunning());
99     m_frameMarker = marker;
100 }
101
102 #include "loaderthread.moc"