3 #include "loaderthread.h"
4 #include "saverthread.h"
9 : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
12 m_loader = new LoaderThread(this);
13 connect(m_loader, SIGNAL(parsedFrames(const QList<ApiTraceFrame*>)),
14 this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
15 connect(m_loader, SIGNAL(started()),
16 this, SIGNAL(startedLoadingTrace()));
17 connect(m_loader, SIGNAL(finished()),
18 this, SIGNAL(finishedLoadingTrace()));
20 m_saver = new SaverThread(this);
21 connect(m_saver, SIGNAL(traceSaved()),
22 this, SLOT(slotSaved()));
23 connect(m_saver, SIGNAL(traceSaved()),
24 this, SIGNAL(saved()));
35 bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
36 ApiTrace::FrameMarker marker)
42 case FrameMarker_SwapBuffers:
43 return call->name().contains(QLatin1String("SwapBuffers")) ||
44 call->name() == QLatin1String("CGLFlushDrawable");
45 case FrameMarker_Flush:
46 return call->name() == QLatin1String("glFlush");
47 case FrameMarker_Finish:
48 return call->name() == QLatin1String("glFinish");
49 case FrameMarker_Clear:
50 return call->name() == QLatin1String("glClear");
53 Q_ASSERT(!"unknown frame marker");
58 bool ApiTrace::isEmpty() const
60 return m_calls.isEmpty();
63 QString ApiTrace::fileName() const
66 return m_tempFileName;
71 ApiTrace::FrameMarker ApiTrace::frameMarker() const
76 QList<ApiTraceCall*> ApiTrace::calls() const
81 ApiTraceCall * ApiTrace::callAt(int idx) const
83 return m_calls.value(idx);
86 int ApiTrace::numCalls() const
88 return m_calls.count();
91 QList<ApiTraceFrame*> ApiTrace::frames() const
96 ApiTraceFrame * ApiTrace::frameAt(int idx) const
98 return m_frames.value(idx);
101 int ApiTrace::numFrames() const
103 return m_frames.count();
106 int ApiTrace::numCallsInFrame(int idx) const
108 const ApiTraceFrame *frame = frameAt(idx);
110 return frame->numChildren();
115 void ApiTrace::setFileName(const QString &name)
117 if (m_fileName != name) {
120 if (m_loader->isRunning()) {
121 m_loader->terminate();
127 m_editedCalls.clear();
128 m_needsSaving = false;
131 m_loader->loadFile(m_fileName);
135 void ApiTrace::setFrameMarker(FrameMarker marker)
137 if (m_frameMarker != marker) {
138 emit framesInvalidated();
140 qDeleteAll(m_frames);
146 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
148 int currentFrames = m_frames.count();
149 int numNewFrames = frames.count();
151 emit beginAddingFrames(currentFrames, numNewFrames);
155 int currentCalls = m_calls.count();
157 foreach(ApiTraceFrame *frame, frames) {
158 frame->setParentTrace(this);
159 numNewCalls += frame->numChildren();
160 m_calls += frame->calls();
163 emit endAddingFrames();
164 emit callsAdded(currentCalls, numNewCalls);
167 void ApiTrace::detectFrames()
169 if (m_calls.isEmpty())
172 emit beginAddingFrames(0, m_frames.count());
174 ApiTraceFrame *currentFrame = 0;
175 foreach(ApiTraceCall *apiCall, m_calls) {
177 currentFrame = new ApiTraceFrame();
178 currentFrame->setParentTrace(this);
179 currentFrame->number = m_frames.count();
181 apiCall->setParentFrame(currentFrame);
182 currentFrame->addCall(apiCall);
183 if (ApiTrace::isCallAFrameMarker(apiCall,
185 m_frames.append(currentFrame);
189 //last frames won't have markers
190 // it's just a bunch of Delete calls for every object
191 // after the last SwapBuffers
193 m_frames.append(currentFrame);
196 emit endAddingFrames();
199 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
201 for (int i = 0; i < m_calls.count(); ++i) {
202 ApiTraceCall *call = m_calls[i];
203 if (call->index() == idx)
209 ApiTraceState ApiTrace::defaultState() const
211 ApiTraceFrame *frame = frameAt(0);
213 return ApiTraceState();
215 return frame->state();
218 void ApiTrace::callEdited(ApiTraceCall *call)
220 if (!m_editedCalls.contains(call)) {
221 //lets generate a temp filename
222 QString tempPath = QDir::tempPath();
223 m_tempFileName = QString::fromLatin1("%1/%2.edited")
227 m_editedCalls.insert(call);
228 m_needsSaving = true;
233 void ApiTrace::callReverted(ApiTraceCall *call)
235 m_editedCalls.remove(call);
237 if (m_editedCalls.isEmpty()) {
238 m_needsSaving = false;
243 bool ApiTrace::edited() const
245 return !m_editedCalls.isEmpty();
248 bool ApiTrace::needsSaving() const
250 return m_needsSaving;
253 void ApiTrace::save()
255 QFileInfo fi(m_tempFileName);
257 emit startedSaving();
258 dir.mkpath(fi.absolutePath());
259 m_saver->saveFile(m_tempFileName, m_calls);
262 void ApiTrace::slotSaved()
264 m_needsSaving = false;
267 bool ApiTrace::isSaving() const
269 return m_saver->isRunning();
272 void ApiTrace::callError(ApiTraceCall *call)
276 if (call->hasError())
277 m_errors.insert(call);
279 m_errors.remove(call);
284 bool ApiTrace::hasErrors() const
286 return !m_errors.isEmpty();
289 #include "apitrace.moc"