]> git.cworth.org Git - apitrace/blob - gui/loaderthread.cpp
Allow filling state for frames and calls.
[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     return apiCall;
31 }
32
33 LoaderThread::LoaderThread(QObject *parent)
34     : QThread(parent),
35       m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
36 {
37 }
38
39 void LoaderThread::run()
40 {
41     QList<ApiTraceFrame*> frames;
42     ApiTraceFrame *currentFrame = 0;
43     int frameCount = 0;
44     Trace::Parser p;
45     if (p.open(m_fileName.toLatin1().constData())) {
46         Trace::Call *call;
47         call = p.parse_call();
48         while (call) {
49             //std::cout << *call;
50             if (!currentFrame) {
51                 currentFrame = new ApiTraceFrame();
52                 currentFrame->number = frameCount;
53                 ++frameCount;
54             }
55             ApiTraceCall *apiCall =
56                 apiCallFromTraceCall(call);
57             apiCall->parentFrame = currentFrame;
58             currentFrame->calls.append(apiCall);
59             if (ApiTrace::isCallAFrameMarker(apiCall,
60                                              m_frameMarker)) {
61                 frames.append(currentFrame);
62                 currentFrame = 0;
63                 if (frames.count() >= FRAMES_TO_CACHE) {
64                     emit parsedFrames(frames);
65                     frames.clear();
66                 }
67             }
68             call = p.parse_call();
69         }
70     }
71     //last frames won't have markers
72     //  it's just a bunch of Delete calls for every object
73     //  after the last SwapBuffers
74     if (currentFrame) {
75         frames.append(currentFrame);
76         currentFrame = 0;
77     }
78     if (frames.count()) {
79         emit parsedFrames(frames);
80     }
81 }
82
83 void LoaderThread::loadFile(const QString &fileName)
84 {
85     m_fileName = fileName;
86     start();
87 }
88
89 ApiTrace::FrameMarker LoaderThread::frameMarker() const
90 {
91     return m_frameMarker;
92 }
93
94 void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
95 {
96     Q_ASSERT(!isRunning());
97     m_frameMarker = marker;
98 }
99
100 #include "loaderthread.moc"