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)
{