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 case FrameMarker_Flush:
45 return call->name() == QLatin1String("glFlush");
46 case FrameMarker_Finish:
47 return call->name() == QLatin1String("glFinish");
48 case FrameMarker_Clear:
49 return call->name() == QLatin1String("glClear");
52 Q_ASSERT(!"unknown frame marker");
57 bool ApiTrace::isEmpty() const
59 return m_calls.isEmpty();
62 QString ApiTrace::fileName() const
65 return m_tempFileName;
70 ApiTrace::FrameMarker ApiTrace::frameMarker() const
75 QList<ApiTraceCall*> ApiTrace::calls() const
80 ApiTraceCall * ApiTrace::callAt(int idx) const
82 return m_calls.value(idx);
85 int ApiTrace::numCalls() const
87 return m_calls.count();
90 QList<ApiTraceFrame*> ApiTrace::frames() const
95 ApiTraceFrame * ApiTrace::frameAt(int idx) const
97 return m_frames.value(idx);
100 int ApiTrace::numFrames() const
102 return m_frames.count();
105 int ApiTrace::numCallsInFrame(int idx) const
107 const ApiTraceFrame *frame = frameAt(idx);
109 return frame->calls.count();
114 void ApiTrace::setFileName(const QString &name)
116 if (m_fileName != name) {
119 if (m_loader->isRunning()) {
120 m_loader->terminate();
127 m_loader->loadFile(m_fileName);
131 void ApiTrace::setFrameMarker(FrameMarker marker)
133 if (m_frameMarker != marker) {
134 emit framesInvalidated();
136 qDeleteAll(m_frames);
142 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
144 int currentFrames = m_frames.count();
145 int numNewFrames = frames.count();
148 int currentCalls = m_calls.count();
150 foreach(ApiTraceFrame *frame, frames) {
151 frame->setParentTrace(this);
152 numNewCalls += frame->calls.count();
153 m_calls += frame->calls;
156 emit framesAdded(currentFrames, numNewFrames);
157 emit callsAdded(currentCalls, numNewCalls);
160 void ApiTrace::detectFrames()
162 if (m_calls.isEmpty())
165 ApiTraceFrame *currentFrame = 0;
166 foreach(ApiTraceCall *apiCall, m_calls) {
168 currentFrame = new ApiTraceFrame();
169 currentFrame->setParentTrace(this);
170 currentFrame->number = m_frames.count();
172 apiCall->setParentFrame(currentFrame);
173 currentFrame->calls.append(apiCall);
174 if (ApiTrace::isCallAFrameMarker(apiCall,
176 m_frames.append(currentFrame);
180 //last frames won't have markers
181 // it's just a bunch of Delete calls for every object
182 // after the last SwapBuffers
184 m_frames.append(currentFrame);
187 emit framesAdded(0, m_frames.count());
190 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
192 for (int i = 0; i < m_calls.count(); ++i) {
193 ApiTraceCall *call = m_calls[i];
194 if (call->index() == idx)
200 ApiTraceState ApiTrace::defaultState() const
202 ApiTraceFrame *frame = frameAt(0);
204 return ApiTraceState();
206 return frame->state();
209 void ApiTrace::callEdited(ApiTraceCall *call)
211 if (!m_editedCalls.contains(call)) {
212 //lets generate a temp filename
213 QString tempPath = QDir::tempPath();
214 m_tempFileName = QString::fromLatin1("%1/%2.edited")
218 m_editedCalls.insert(call);
219 m_needsSaving = true;
224 void ApiTrace::callReverted(ApiTraceCall *call)
226 m_editedCalls.remove(call);
228 if (m_editedCalls.isEmpty()) {
229 m_needsSaving = false;
234 bool ApiTrace::edited() const
236 return !m_editedCalls.isEmpty();
239 bool ApiTrace::needsSaving() const
241 return m_needsSaving;
244 void ApiTrace::save()
246 QFileInfo fi(m_tempFileName);
248 emit startedSaving();
249 dir.mkpath(fi.absolutePath());
250 m_saver->saveFile(m_tempFileName, m_calls);
253 void ApiTrace::slotSaved()
255 m_needsSaving = false;
258 bool ApiTrace::isSaving() const
260 return m_saver->isRunning();
263 void ApiTrace::callError(ApiTraceCall *call)
268 #include "apitrace.moc"