X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitrace.cpp;h=5758b0750a3acb0ca743af3908bafe6a21d59796;hb=2ae3c962d308ceb866f7478866cdcc85f50a987d;hp=6f101cd9f789aa21dc7ae13d83683ba4e638fe2d;hpb=851d0b0452234ace66a511327bd8e6f9d68fe9e9;p=apitrace diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 6f101cd..5758b07 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -25,14 +25,12 @@ ApiTrace::ApiTrace() SLOT(loaderFrameLoaded(ApiTraceFrame*,QVector,quint64))); connect(m_loader, SIGNAL(finishedParsing()), this, SLOT(finishedParsing())); - connect(this, SIGNAL(loaderSearchNext(int,QString,Qt::CaseSensitivity)), - m_loader, SLOT(searchNext(int,QString,Qt::CaseSensitivity))); - connect(this, SIGNAL(loaderSearchPrev(int,QString,Qt::CaseSensitivity)), - m_loader, SLOT(searchPrev(int,QString,Qt::CaseSensitivity))); + connect(this, SIGNAL(loaderSearch(ApiTrace::SearchRequest)), + m_loader, SLOT(search(ApiTrace::SearchRequest))); connect(m_loader, - SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)), + SIGNAL(searchResult(ApiTrace::SearchRequest,ApiTrace::SearchResult,ApiTraceCall*)), this, - SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*))); + SLOT(loaderSearchResult(ApiTrace::SearchRequest,ApiTrace::SearchResult,ApiTraceCall*))); connect(this, SIGNAL(loaderFindFrameStart(ApiTraceFrame*)), m_loader, SLOT(findFrameStart(ApiTraceFrame*))); connect(this, SIGNAL(loaderFindFrameEnd(ApiTraceFrame*)), @@ -78,14 +76,13 @@ ApiTrace::~ApiTrace() bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call, ApiTrace::FrameMarker marker) { - if (!call) + if (!call) { return false; + } switch (marker) { case FrameMarker_SwapBuffers: - return call->name().contains(QLatin1String("SwapBuffers")) || - call->name() == QLatin1String("CGLFlushDrawable") || - call->name() == QLatin1String("glFrameTerminatorGREMEDY"); + return call->flags() & trace::CALL_FLAG_END_FRAME; case FrameMarker_Flush: return call->name() == QLatin1String("glFlush"); case FrameMarker_Finish: @@ -106,8 +103,9 @@ bool ApiTrace::isEmpty() const QString ApiTrace::fileName() const { - if (edited()) + if (edited()) { return m_tempFileName; + } return m_fileName; } @@ -135,31 +133,32 @@ int ApiTrace::numFrames() const int ApiTrace::numCallsInFrame(int idx) const { const ApiTraceFrame *frame = frameAt(idx); - if (frame) + if (frame) { return frame->numChildren(); - else + } else { return 0; + } } void ApiTrace::setFileName(const QString &name) { if (m_fileName != name) { m_fileName = name; + m_tempFileName = QString(); m_frames.clear(); m_errors.clear(); m_editedCalls.clear(); + m_queuedErrors.clear(); m_needsSaving = false; emit invalidated(); -// m_loader->loadTrace(m_fileName); emit loadTrace(m_fileName); } } void ApiTrace::addFrames(const QList &frames) { - QVector calls; int currentFrames = m_frames.count(); int numNewFrames = frames.count(); @@ -167,11 +166,8 @@ void ApiTrace::addFrames(const QList &frames) m_frames += frames; - int numNewCalls = 0; foreach(ApiTraceFrame *frame, frames) { frame->setParentTrace(this); - numNewCalls += frame->numChildren(); - calls += frame->calls(); } emit endAddingFrames(); @@ -181,8 +177,9 @@ ApiTraceCall * ApiTrace::callWithIndex(int idx) const { for (int i = 0; i < m_frames.count(); ++i) { ApiTraceCall *call = m_frames[i]->callWithIndex(idx); - if (call) + if (call) { return call; + } } return NULL; } @@ -190,8 +187,9 @@ ApiTraceCall * ApiTrace::callWithIndex(int idx) const ApiTraceState ApiTrace::defaultState() const { ApiTraceFrame *frame = frameAt(0); - if (!frame || !frame->loaded() || frame->isEmpty()) + if (!frame || !frame->isLoaded() || frame->isEmpty()) { return ApiTraceState(); + } ApiTraceCall *firstCall = frame->calls().first(); if (!firstCall->hasState()) { @@ -264,14 +262,17 @@ bool ApiTrace::hasErrors() const void ApiTrace::loadFrame(ApiTraceFrame *frame) { - Q_ASSERT(!frame->loaded()); - emit requestFrame(frame); + if (!isFrameLoading(frame)) { + Q_ASSERT(!frame->isLoaded()); + m_loadingFrames.insert(frame); + emit requestFrame(frame); + } } void ApiTrace::finishedParsing() { ApiTraceFrame *firstFrame = m_frames[0]; - if (firstFrame && !firstFrame->loaded()) { + if (firstFrame && !firstFrame->isLoaded()) { loadFrame(firstFrame); } } @@ -281,9 +282,13 @@ void ApiTrace::loaderFrameLoaded(ApiTraceFrame *frame, quint64 binaryDataSize) { Q_ASSERT(frame->numChildrenToLoad() == calls.size()); - emit beginLoadingFrame(frame, calls.size()); - frame->setCalls(calls, binaryDataSize); - emit endLoadingFrame(frame); + + if (!frame->isLoaded()) { + emit beginLoadingFrame(frame, calls.size()); + frame->setCalls(calls, binaryDataSize); + emit endLoadingFrame(frame); + m_loadingFrames.remove(frame); + } if (!m_queuedErrors.isEmpty()) { QList< QPair >::iterator itr; @@ -318,11 +323,13 @@ void ApiTrace::findNext(ApiTraceFrame *frame, { ApiTraceCall *foundCall = 0; int frameIdx = m_frames.indexOf(frame); + SearchRequest request(SearchRequest::Next, + frame, from, str, sensitivity); - if (frame->loaded()) { + if (frame->isLoaded()) { foundCall = frame->findNextCall(from, str, sensitivity); if (foundCall) { - emit findResult(SearchFound, foundCall); + emit findResult(request, SearchResult_Found, foundCall); return; } @@ -331,20 +338,23 @@ void ApiTrace::findNext(ApiTraceFrame *frame, frameIdx += 1; } + //for the rest of the frames we search from beginning + request.from = 0; for (int i = frameIdx; i < m_frames.count(); ++i) { ApiTraceFrame *frame = m_frames[i]; - if (!frame->loaded()) { - emit loaderSearchNext(i, str, sensitivity); + request.frame = frame; + if (!frame->isLoaded()) { + emit loaderSearch(request); return; } else { ApiTraceCall *call = frame->findNextCall(0, str, sensitivity); if (call) { - emit findResult(SearchFound, call); + emit findResult(request, SearchResult_Found, call); return; } } } - emit findResult(SearchWrapped, 0); + emit findResult(request, SearchResult_Wrapped, 0); } void ApiTrace::findPrev(ApiTraceFrame *frame, @@ -354,11 +364,13 @@ void ApiTrace::findPrev(ApiTraceFrame *frame, { ApiTraceCall *foundCall = 0; int frameIdx = m_frames.indexOf(frame); + SearchRequest request(SearchRequest::Prev, + frame, from, str, sensitivity); - if (frame->loaded()) { + if (frame->isLoaded()) { foundCall = frame->findPrevCall(from, str, sensitivity); if (foundCall) { - emit findResult(SearchFound, foundCall); + emit findResult(request, SearchResult_Found, foundCall); return; } @@ -367,33 +379,36 @@ void ApiTrace::findPrev(ApiTraceFrame *frame, frameIdx -= 1; } + request.from = 0; for (int i = frameIdx; i >= 0; --i) { ApiTraceFrame *frame = m_frames[i]; - if (!frame->loaded()) { - emit loaderSearchPrev(i, str, sensitivity); + request.frame = frame; + if (!frame->isLoaded()) { + emit loaderSearch(request); return; } else { ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity); if (call) { - emit findResult(SearchFound, call); + emit findResult(request, SearchResult_Found, call); return; } } } - emit findResult(SearchWrapped, 0); + emit findResult(request, SearchResult_Wrapped, 0); } -void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result, +void ApiTrace::loaderSearchResult(const ApiTrace::SearchRequest &request, + ApiTrace::SearchResult result, ApiTraceCall *call) { //qDebug()<<"Search result = "<