]> git.cworth.org Git - apitrace/blob - gui/loaderthread.cpp
Introduce ApiTrace which encapsulates the data.
[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
13     QString argumentsText;
14     for (int i = 0; i < call->sig->arg_names.size(); ++i) {
15         apiCall->argNames +=
16             QString::fromStdString(call->sig->arg_names[i]);
17     }
18     if (call->ret) {
19         VariantVisitor retVisitor;
20         call->ret->visit(retVisitor);
21         apiCall->returnValue = retVisitor.variant();
22     }
23     for (int i = 0; i < call->args.size(); ++i) {
24         VariantVisitor argVisitor;
25         call->args[i]->visit(argVisitor);
26         apiCall->argValues += argVisitor.variant();
27     }
28
29     return apiCall;
30 }
31
32 LoaderThread::LoaderThread(QObject *parent)
33     : QThread(parent),
34       m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
35 {
36 }
37
38 void LoaderThread::run()
39 {
40     QList<ApiTraceFrame*> frames;
41     ApiTraceFrame *currentFrame = 0;
42     int frameCount = 0;
43     Trace::Parser p;
44     if (p.open(m_fileName.toLatin1().constData())) {
45         Trace::Call *call;
46         call = p.parse_call();
47         while (call) {
48             //std::cout << *call;
49             if (!currentFrame) {
50                 currentFrame = new ApiTraceFrame();
51                 currentFrame->number = frameCount;
52                 ++frameCount;
53             }
54             ApiTraceCall *apiCall =
55                 apiCallFromTraceCall(call);
56             apiCall->parentFrame = currentFrame;
57             apiCall->index = currentFrame->calls.count();
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"