3 #include "traceloader.h"
4 #include "saverthread.h"
11 : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
14 m_loader = new TraceLoader();
16 connect(this, SIGNAL(loadTrace(QString)),
17 m_loader, SLOT(loadTrace(QString)));
18 connect(this, SIGNAL(requestFrame(ApiTraceFrame*)),
19 m_loader, SLOT(loadFrame(ApiTraceFrame*)));
20 connect(m_loader, SIGNAL(framesLoaded(const QList<ApiTraceFrame*>)),
21 this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
23 SIGNAL(frameContentsLoaded(ApiTraceFrame*,QVector<ApiTraceCall*>,quint64)),
25 SLOT(loaderFrameLoaded(ApiTraceFrame*,QVector<ApiTraceCall*>,quint64)));
26 connect(m_loader, SIGNAL(finishedParsing()),
27 this, SLOT(finishedParsing()));
28 connect(this, SIGNAL(loaderSearchNext(int,QString,Qt::CaseSensitivity)),
29 m_loader, SLOT(searchNext(int,QString,Qt::CaseSensitivity)));
30 connect(this, SIGNAL(loaderSearchPrev(int,QString,Qt::CaseSensitivity)),
31 m_loader, SLOT(searchPrev(int,QString,Qt::CaseSensitivity)));
33 SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)),
35 SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*)));
36 connect(this, SIGNAL(loaderFindFrameStart(ApiTraceFrame*)),
37 m_loader, SLOT(findFrameStart(ApiTraceFrame*)));
38 connect(this, SIGNAL(loaderFindFrameEnd(ApiTraceFrame*)),
39 m_loader, SLOT(findFrameEnd(ApiTraceFrame*)));
40 connect(m_loader, SIGNAL(foundFrameStart(ApiTraceFrame*)),
41 this, SIGNAL(foundFrameStart(ApiTraceFrame*)));
42 connect(m_loader, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
43 this, SIGNAL(foundFrameEnd(ApiTraceFrame*)));
44 connect(this, SIGNAL(loaderFindCallIndex(int)),
45 m_loader, SLOT(findCallIndex(int)));
46 connect(m_loader, SIGNAL(foundCallIndex(ApiTraceCall*)),
47 this, SIGNAL(foundCallIndex(ApiTraceCall*)));
50 connect(m_loader, SIGNAL(startedParsing()),
51 this, SIGNAL(startedLoadingTrace()));
52 connect(m_loader, SIGNAL(parsed(int)),
53 this, SIGNAL(loaded(int)));
54 connect(m_loader, SIGNAL(finishedParsing()),
55 this, SIGNAL(finishedLoadingTrace()));
58 m_saver = new SaverThread(this);
59 connect(m_saver, SIGNAL(traceSaved()),
60 this, SLOT(slotSaved()));
61 connect(m_saver, SIGNAL(traceSaved()),
62 this, SIGNAL(saved()));
64 m_loaderThread = new QThread();
65 m_loader->moveToThread(m_loaderThread);
66 m_loaderThread->start();
71 m_loaderThread->quit();
72 m_loaderThread->deleteLater();
78 bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
79 ApiTrace::FrameMarker marker)
85 case FrameMarker_SwapBuffers:
86 return call->name().contains(QLatin1String("SwapBuffers")) ||
87 call->name() == QLatin1String("CGLFlushDrawable") ||
88 call->name() == QLatin1String("glFrameTerminatorGREMEDY");
89 case FrameMarker_Flush:
90 return call->name() == QLatin1String("glFlush");
91 case FrameMarker_Finish:
92 return call->name() == QLatin1String("glFinish");
93 case FrameMarker_Clear:
94 return call->name() == QLatin1String("glClear");
97 Q_ASSERT(!"unknown frame marker");
102 bool ApiTrace::isEmpty() const
104 return m_frames.isEmpty();
107 QString ApiTrace::fileName() const
110 return m_tempFileName;
115 ApiTrace::FrameMarker ApiTrace::frameMarker() const
117 return m_frameMarker;
120 QList<ApiTraceFrame*> ApiTrace::frames() const
125 ApiTraceFrame * ApiTrace::frameAt(int idx) const
127 return m_frames.value(idx);
130 int ApiTrace::numFrames() const
132 return m_frames.count();
135 int ApiTrace::numCallsInFrame(int idx) const
137 const ApiTraceFrame *frame = frameAt(idx);
139 return frame->numChildren();
144 void ApiTrace::setFileName(const QString &name)
146 if (m_fileName != name) {
151 m_editedCalls.clear();
152 m_needsSaving = false;
155 // m_loader->loadTrace(m_fileName);
156 emit loadTrace(m_fileName);
160 void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
162 QVector<ApiTraceCall*> calls;
163 int currentFrames = m_frames.count();
164 int numNewFrames = frames.count();
166 emit beginAddingFrames(currentFrames, numNewFrames);
171 foreach(ApiTraceFrame *frame, frames) {
172 frame->setParentTrace(this);
173 numNewCalls += frame->numChildren();
174 calls += frame->calls();
177 emit endAddingFrames();
180 ApiTraceCall * ApiTrace::callWithIndex(int idx) const
182 for (int i = 0; i < m_frames.count(); ++i) {
183 ApiTraceCall *call = m_frames[i]->callWithIndex(idx);
190 ApiTraceState ApiTrace::defaultState() const
192 ApiTraceFrame *frame = frameAt(0);
193 if (!frame || !frame->hasState())
194 return ApiTraceState();
196 return *frame->state();
199 void ApiTrace::callEdited(ApiTraceCall *call)
201 if (!m_editedCalls.contains(call)) {
202 //lets generate a temp filename
203 QString tempPath = QDir::tempPath();
204 m_tempFileName = QString::fromLatin1("%1/%2.edited")
208 m_editedCalls.insert(call);
209 m_needsSaving = true;
214 void ApiTrace::callReverted(ApiTraceCall *call)
216 m_editedCalls.remove(call);
218 if (m_editedCalls.isEmpty()) {
219 m_needsSaving = false;
224 bool ApiTrace::edited() const
226 return !m_editedCalls.isEmpty();
229 bool ApiTrace::needsSaving() const
231 return m_needsSaving;
234 void ApiTrace::save()
236 QFileInfo fi(m_tempFileName);
238 emit startedSaving();
239 dir.mkpath(fi.absolutePath());
240 m_saver->saveFile(m_tempFileName,
245 void ApiTrace::slotSaved()
247 m_needsSaving = false;
250 bool ApiTrace::isSaving() const
252 return m_saver->isRunning();
255 void ApiTrace::callError(ApiTraceCall *call)
259 if (call->hasError())
260 m_errors.insert(call);
262 m_errors.remove(call);
267 bool ApiTrace::hasErrors() const
269 return !m_errors.isEmpty();
272 void ApiTrace::loadFrame(ApiTraceFrame *frame)
274 Q_ASSERT(!frame->loaded());
275 emit requestFrame(frame);
278 void ApiTrace::finishedParsing()
280 ApiTraceFrame *firstFrame = m_frames[0];
281 if (firstFrame && !firstFrame->loaded()) {
282 loadFrame(firstFrame);
286 void ApiTrace::loaderFrameLoaded(ApiTraceFrame *frame,
287 const QVector<ApiTraceCall*> &calls,
288 quint64 binaryDataSize)
290 Q_ASSERT(frame->numChildrenToLoad() == calls.size());
291 emit beginLoadingFrame(frame, calls.size());
292 frame->setCalls(calls, binaryDataSize);
293 emit endLoadingFrame(frame);
296 void ApiTrace::findNext(ApiTraceFrame *frame,
299 Qt::CaseSensitivity sensitivity)
301 ApiTraceCall *foundCall = 0;
302 int frameIdx = m_frames.indexOf(frame);
304 if (frame->loaded()) {
305 foundCall = frame->findNextCall(from, str, sensitivity);
307 emit findResult(SearchFound, foundCall);
311 //if the frame is loaded we already searched it above
316 for (int i = frameIdx; i < m_frames.count(); ++i) {
317 ApiTraceFrame *frame = m_frames[i];
318 if (!frame->loaded()) {
319 emit loaderSearchNext(i, str, sensitivity);
322 ApiTraceCall *call = frame->findNextCall(0, str, sensitivity);
324 emit findResult(SearchFound, call);
329 emit findResult(SearchWrapped, 0);
332 void ApiTrace::findPrev(ApiTraceFrame *frame,
335 Qt::CaseSensitivity sensitivity)
337 ApiTraceCall *foundCall = 0;
338 int frameIdx = m_frames.indexOf(frame);
340 if (frame->loaded()) {
341 foundCall = frame->findPrevCall(from, str, sensitivity);
343 emit findResult(SearchFound, foundCall);
347 //if the frame is loaded we already searched it above
352 for (int i = frameIdx; i >= 0; --i) {
353 ApiTraceFrame *frame = m_frames[i];
354 if (!frame->loaded()) {
355 emit loaderSearchPrev(i, str, sensitivity);
358 ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity);
360 emit findResult(SearchFound, call);
365 emit findResult(SearchWrapped, 0);
368 void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result,
371 //qDebug()<<"Search result = "<<result
372 // <<", call is = "<<call;
373 emit findResult(result, call);
376 void ApiTrace::findFrameStart(ApiTraceFrame *frame)
378 if (frame->loaded()) {
379 emit foundFrameStart(frame);
381 emit loaderFindFrameStart(frame);
385 void ApiTrace::findFrameEnd(ApiTraceFrame *frame)
387 if (frame->loaded()) {
388 emit foundFrameEnd(frame);
390 emit loaderFindFrameEnd(frame);
394 void ApiTrace::findCallIndex(int index)
396 int frameIdx = callInFrame(index);
397 ApiTraceFrame *frame = 0;
400 emit foundCallIndex(0);
404 frame = m_frames[frameIdx];
407 if (frame->loaded()) {
408 ApiTraceCall *call = frame->callWithIndex(index);
409 emit foundCallIndex(call);
411 emit loaderFindCallIndex(index);
416 int ApiTrace::callInFrame(int callIdx) const
418 unsigned numCalls = 0;
420 for (int frameIdx = 0; frameIdx <= m_frames.size(); ++frameIdx) {
421 const ApiTraceFrame *frame = m_frames[frameIdx];
422 unsigned numCallsInFrame = frame->loaded()
423 ? frame->numChildren()
424 : frame->numChildrenToLoad();
425 unsigned firstCall = numCalls;
426 unsigned endCall = numCalls + numCallsInFrame;
427 if (firstCall <= callIdx && endCall > callIdx) {
436 #include "apitrace.moc"