3 #include "loaderthread.h"
6 : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
8 m_loader = new LoaderThread(this);
9 connect(m_loader, SIGNAL(parsedFrames(const QList<ApiTraceFrame*>)),
10 this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
11 connect(m_loader, SIGNAL(started()),
12 this, SIGNAL(startedLoadingTrace()));
13 connect(m_loader, SIGNAL(finished()),
14 this, SIGNAL(finishedLoadingTrace()));
24 bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
25 ApiTrace::FrameMarker marker)
31 case FrameMarker_SwapBuffers:
32 return call->name.contains(QLatin1String("SwapBuffers"));
33 case FrameMarker_Flush:
34 return call->name == QLatin1String("glFlush");
35 case FrameMarker_Finish:
36 return call->name == QLatin1String("glFinish");
37 case FrameMarker_Clear:
38 return call->name == QLatin1String("glClear");
41 Q_ASSERT(!"unknown frame marker");
46 bool ApiTrace::isEmpty() const
48 return m_calls.isEmpty();
51 QString ApiTrace::fileName() const
56 ApiTrace::FrameMarker ApiTrace::frameMarker() const
61 QList<ApiTraceCall*> ApiTrace::calls() const
66 ApiTraceCall * ApiTrace::callAt(int idx) const
68 return m_calls.value(idx);
71 int ApiTrace::numCalls() const
73 return m_calls.count();
76 QList<ApiTraceFrame*> ApiTrace::frames() const
81 ApiTraceFrame * ApiTrace::frameAt(int idx) const
83 return m_frames.value(idx);
86 int ApiTrace::numFrames() const
88 return m_frames.count();
91 int ApiTrace::numCallsInFrame(int idx) const
93 const ApiTraceFrame *frame = frameAt(idx);
95 return frame->calls.count();
100 void ApiTrace::setFileName(const QString &name)
102 if (m_fileName != name) {
105 if (m_loader->isRunning()) {
106 m_loader->terminate();
113 m_loader->loadFile(m_fileName);
117 void ApiTrace::setFrameMarker(FrameMarker marker)
119 if (m_frameMarker != marker) {
120 emit framesInvalidated();
122 qDeleteAll(m_frames);
128 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
130 int currentFrames = m_frames.count();
131 int numNewFrames = frames.count();
134 int currentCalls = m_calls.count();
136 foreach(ApiTraceFrame *frame, frames) {
137 numNewCalls += frame->calls.count();
138 m_calls += frame->calls;
141 emit framesAdded(currentFrames, numNewFrames);
142 emit callsAdded(currentCalls, numNewCalls);
145 void ApiTrace::detectFrames()
147 if (m_calls.isEmpty())
150 ApiTraceFrame *currentFrame = 0;
151 foreach(ApiTraceCall *apiCall, m_calls) {
153 currentFrame = new ApiTraceFrame();
154 currentFrame->number = m_frames.count();
156 apiCall->parentFrame = currentFrame;
157 currentFrame->calls.append(apiCall);
158 if (ApiTrace::isCallAFrameMarker(apiCall,
160 m_frames.append(currentFrame);
164 //last frames won't have markers
165 // it's just a bunch of Delete calls for every object
166 // after the last SwapBuffers
168 m_frames.append(currentFrame);
171 emit framesAdded(0, m_frames.count());
174 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
176 for (int i = 0; i < m_calls.count(); ++i) {
177 ApiTraceCall *call = m_calls[i];
178 if (call->index == idx)
184 ApiTraceState ApiTrace::defaultState() const
186 ApiTraceFrame *frame = frameAt(0);
188 return ApiTraceState();
190 return frame->state();
193 #include "apitrace.moc"