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 frame->setParentTrace(this);
138 numNewCalls += frame->calls.count();
139 m_calls += frame->calls;
142 emit framesAdded(currentFrames, numNewFrames);
143 emit callsAdded(currentCalls, numNewCalls);
146 void ApiTrace::detectFrames()
148 if (m_calls.isEmpty())
151 ApiTraceFrame *currentFrame = 0;
152 foreach(ApiTraceCall *apiCall, m_calls) {
154 currentFrame = new ApiTraceFrame();
155 currentFrame->setParentTrace(this);
156 currentFrame->number = m_frames.count();
158 apiCall->setParentFrame(currentFrame);
159 currentFrame->calls.append(apiCall);
160 if (ApiTrace::isCallAFrameMarker(apiCall,
162 m_frames.append(currentFrame);
166 //last frames won't have markers
167 // it's just a bunch of Delete calls for every object
168 // after the last SwapBuffers
170 m_frames.append(currentFrame);
173 emit framesAdded(0, m_frames.count());
176 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
178 for (int i = 0; i < m_calls.count(); ++i) {
179 ApiTraceCall *call = m_calls[i];
180 if (call->index() == idx)
186 ApiTraceState ApiTrace::defaultState() const
188 ApiTraceFrame *frame = frameAt(0);
190 return ApiTraceState();
192 return frame->state();
195 #include "apitrace.moc"