diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 7c22c4e..005397e 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -679,6 +679,8 @@ ApiTraceCall::loadData(TraceLoader *loader, { m_index = call->no; m_thread = call->thread_id; + m_cpuStart = call->cpuStart; + m_cpuEnd = call->cpuEnd; m_signature = loader->signature(call->sig->id); if (!m_signature) { @@ -863,6 +865,16 @@ int ApiTraceCall::index() const return m_index; } +int64_t ApiTraceCall::cpuStart() const +{ + return m_cpuStart; +} + +int64_t ApiTraceCall::cpuEnd() const +{ + return m_cpuEnd; +} + QString ApiTraceCall::name() const { return m_signature->name(); @@ -957,8 +969,8 @@ QStaticText ApiTraceCall::staticText() const m_signature->name()); for (int i = 0; i < argNames.count(); ++i) { richText += QLatin1String(""); + QString argText = apiVariantToString(argValues[i]); - //if arguments are really long (e.g. shader text), cut them // and elide it if (argText.length() > 40) { @@ -1145,9 +1157,10 @@ QStaticText ApiTraceFrame::staticText() const "Frame %1" "   " " " - "(%2 calls)") + "(%2 calls) %3ms") .arg(number) - .arg(m_loaded ? m_calls.count() : m_callsToLoad); + .arg(m_loaded ? m_calls.count() : m_callsToLoad) + .arg(m_duration); //mark the frame if it uploads more than a meg a frame if (m_binaryDataSize > (1024*1024)) { @@ -1320,6 +1333,17 @@ unsigned ApiTraceFrame::lastCallIndex() const } } +void ApiTraceFrame::setDuration(int64_t duration) +{ + m_duration = duration / 1000000; +} + +int64_t ApiTraceFrame::duration() const +{ + return m_duration; +} + + void ApiTraceFrame::missingThumbnail() { m_parentTrace->missingThumbnail(this); diff --git a/gui/apitracecall.h b/gui/apitracecall.h index 5ad2e3f..14017ea 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -245,6 +245,8 @@ public: ~ApiTraceCall(); int index() const; + int64_t cpuStart() const; + int64_t cpuEnd() const; QString name() const; QStringList argNames() const; QVector arguments() const; @@ -298,6 +300,8 @@ private: private: int m_index; unsigned m_thread; + int64_t m_cpuStart; + int64_t m_cpuEnd; ApiTraceCallSignature *m_signature; QVector m_argValues; QVariant m_returnValue; @@ -358,6 +362,9 @@ public: void setLastCallIndex(unsigned index); unsigned lastCallIndex() const; + void setDuration(int64_t duration); + int64_t duration() const; + void missingThumbnail() override; private: @@ -368,5 +375,6 @@ private: bool m_loaded; unsigned m_callsToLoad; unsigned m_lastCallIndex; + int64_t m_duration; }; Q_DECLARE_METATYPE(ApiTraceFrame*); diff --git a/gui/apitracemodel.cpp b/gui/apitracemodel.cpp index ee43dd7..c7ec556 100644 --- a/gui/apitracemodel.cpp +++ b/gui/apitracemodel.cpp @@ -60,7 +60,7 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const "\n" "Frame %2\n" "\n" - "
%3 calls%4
\n" + "
%3 calls %4ms %5
\n" "\n"; @@ -95,10 +95,13 @@ QVariant ApiTraceModel::data(const QModelIndex &index, int role) const ? frame->numTotalCalls() : frame->numChildrenToLoad(); + int64_t duration = frame->duration(); + return tr(htmlTempl) .arg(thumbStr) .arg(frame->number) .arg(numCalls) + .arg(duration) .arg(sizeStr); } } diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 1fc8b35..eabfdde 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -148,9 +148,12 @@ void MainWindow::callItemSelected(const QModelIndex &index) if (event && event->type() == ApiTraceEvent::Call) { ApiTraceCall *call = static_cast(event); m_ui.detailsDock->setWindowTitle( - tr("Details View. Frame %1, Call %2") + tr("Details View. Frame %1, Call %2, TS %3.%4ms, D %5ns") .arg(call->parentFrame() ? call->parentFrame()->number : 0) - .arg(call->index())); + .arg(call->index()) + .arg(call->cpuStart()/1000000) + .arg(call->cpuStart()%1000000, 6, 10, QChar('0')) + .arg(call->cpuEnd() - call->cpuStart())); m_ui.detailsWebView->setHtml(call->toHtml()); m_ui.detailsDock->show(); m_ui.callView->scrollTo(index); diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index 483f991..cafe5c5 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -121,6 +121,7 @@ void TraceLoader::scanTrace() int numOfFrames = 0; int numOfCalls = 0; int lastPercentReport = 0; + int64_t lastFrameEndTime = 0; m_parser.getBookmark(startBookmark); @@ -135,6 +136,7 @@ void TraceLoader::scanTrace() currentFrame->number = numOfFrames; currentFrame->setNumChildren(numOfCalls); currentFrame->setLastCallIndex(call->no); + currentFrame->setDuration(call->cpuEnd - lastFrameEndTime); frames.append(currentFrame); m_createdFrames.append(currentFrame); @@ -147,6 +149,7 @@ void TraceLoader::scanTrace() } m_parser.getBookmark(startBookmark); numOfCalls = 0; + lastFrameEndTime = call->cpuEnd; } delete call; } @@ -444,7 +447,7 @@ TraceLoader::FrameContents::isEmpty() bool TraceLoader::FrameContents::load(TraceLoader *loader, - ApiTraceFrame *currentFrame, + ApiTraceFrame *currentFrame, QHash helpHash, trace::Parser &parser) {