From b39844bb59d5895412a5c73cde9622e45436dab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matth=C3=A4us=20G=2E=20Chajdas?= Date: Fri, 18 Aug 2017 14:54:42 +0200 Subject: [PATCH] Hook up the counter capture and result display. --- qrenderdoc/Code/CaptureContext.cpp | 14 +-- qrenderdoc/Code/CaptureContext.h | 4 +- .../Windows/PerformanceCounterViewer.cpp | 95 ++++++++++++++++++- 3 files changed, 103 insertions(+), 10 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index 4cfdb6d18..a10509600 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -735,14 +735,14 @@ IDebugMessageView *CaptureContext::GetDebugMessageView() IPerformanceCounterViewer *CaptureContext::GetPerformanceCounterViewer() { - if(m_PerformanecCounterViewer) - return m_PerformanecCounterViewer; + if(m_PerformanceCounterViewer) + return m_PerformanceCounterViewer; - m_PerformanecCounterViewer = new PerformanceCounterViewer(*this, m_MainWindow); - m_PerformanecCounterViewer->setObjectName(lit("performanceCounterViewer")); - setupDockWindow(m_PerformanecCounterViewer); + m_PerformanceCounterViewer = new PerformanceCounterViewer(*this, m_MainWindow); + m_PerformanceCounterViewer->setObjectName(lit("performanceCounterViewer")); + setupDockWindow(m_PerformanceCounterViewer); - return m_PerformanecCounterViewer; + return m_PerformanceCounterViewer; } IStatisticsViewer *CaptureContext::GetStatisticsViewer() @@ -963,6 +963,8 @@ void CaptureContext::BuiltinWindowClosed(QWidget *window) m_TimelineBar = NULL; else if(m_PythonShell && m_PythonShell->Widget() == window) m_PythonShell = NULL; + else if(m_PerformanceCounterViewer && m_PerformanceCounterViewer->Widget() == window) + m_PerformanceCounterViewer = NULL; else qCritical() << "Unrecognised window being closed: " << window; } diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index e849d70bb..97151075d 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -146,7 +146,7 @@ public: bool HasMeshPreview() override { return m_MeshPreview != NULL; } bool HasCaptureDialog() override { return m_CaptureDialog != NULL; } bool HasDebugMessageView() override { return m_DebugMessageView != NULL; } - bool HasPerformanceCounterViewer() override { return m_PerformanecCounterViewer != NULL; } + bool HasPerformanceCounterViewer() override { return m_PerformanceCounterViewer != NULL; } bool HasStatisticsViewer() override { return m_StatisticsViewer != NULL; } bool HasTimelineBar() override { return m_TimelineBar != NULL; } bool HasPythonShell() override { return m_PythonShell != NULL; } @@ -282,7 +282,7 @@ private: PipelineStateViewer *m_PipelineViewer = NULL; CaptureDialog *m_CaptureDialog = NULL; DebugMessageView *m_DebugMessageView = NULL; - PerformanceCounterViewer *m_PerformanecCounterViewer = NULL; + PerformanceCounterViewer *m_PerformanceCounterViewer = NULL; StatisticsViewer *m_StatisticsViewer = NULL; TimelineBar *m_TimelineBar = NULL; PythonShell *m_PythonShell = NULL; diff --git a/qrenderdoc/Windows/PerformanceCounterViewer.cpp b/qrenderdoc/Windows/PerformanceCounterViewer.cpp index 77c7e491d..9bbbcf266 100644 --- a/qrenderdoc/Windows/PerformanceCounterViewer.cpp +++ b/qrenderdoc/Windows/PerformanceCounterViewer.cpp @@ -26,6 +26,48 @@ #include "Windows/Dialogs/PerformanceCounterSelection.h" #include "ui_PerformanceCounterViewer.h" +static QString FormatCounterResult(const CounterResult &result, const CounterDescription &description) +{ + QString returnValue; + + switch(description.resultType) + { + case CompType::Float: returnValue += QString::number(result.value.f); break; + + case CompType::Double: returnValue += QString::number(result.value.d); break; + + case CompType::UInt: + if(description.resultByteWidth == 8) + { + returnValue += QString::number(result.value.u64); + } + else + { + returnValue += QString::number(result.value.u32); + } + + default: + // assert (false) + break; + } + + switch(description.unit) + { + case CounterUnit::Bytes: returnValue += QLatin1String{" bytes"}; break; + + case CounterUnit::Cycles: returnValue += QLatin1String{" cycles"}; break; + + case CounterUnit::Percentage: returnValue += QLatin1String{" %"}; break; + + case CounterUnit::Seconds: returnValue += QLatin1String{" s"}; break; + + case CounterUnit::Absolute: + case CounterUnit::Ratio: break; + } + + return returnValue; +} + PerformanceCounterViewer::PerformanceCounterViewer(ICaptureContext &ctx, QWidget *parent) : QFrame(parent), ui(new Ui::PerformanceCounterViewer), m_Ctx(ctx) { @@ -39,17 +81,66 @@ PerformanceCounterViewer::PerformanceCounterViewer(ICaptureContext &ctx, QWidget { const QList selectedCounters = pcs.GetSelectedCounters(); - m_Ctx.Replay().AsyncInvoke([=](IReplayController *controller) -> void { + bool done = false; + m_Ctx.Replay().AsyncInvoke([=, &done](IReplayController *controller) -> void { rdctype::array counters; counters.create(selectedCounters.size()); + QMap counterDescriptions; + for(int i = 0; i < selectedCounters.size(); ++i) { counters[i] = (GPUCounter)selectedCounters[i]; + counterDescriptions.insert(counters[i], controller->DescribeCounter(counters[i])); } - controller->FetchCounters(counters); + QMap counterIndex; + for(int i = 0; i < selectedCounters.size(); ++i) + { + counterIndex.insert((GPUCounter)selectedCounters[i], i); + } + + const auto results = controller->FetchCounters(counters); + + GUIInvoke::call([this, results, counterDescriptions, counterIndex]() -> void { + ui->counterResults->clear(); + + QStringList headers; + headers << QLatin1String{"EID"}; + for(const auto &cd : counterDescriptions) + { + headers << cd.name; + } + + QMap eventIdToRow; + for(const auto &result : results) + { + if(eventIdToRow.contains(result.eventID)) + continue; + eventIdToRow[result.eventID] = eventIdToRow.size(); + } + + ui->counterResults->setColumnCount(headers.size()); + ui->counterResults->setHorizontalHeaderLabels(headers); + ui->counterResults->setRowCount(eventIdToRow.size()); + ui->counterResults->verticalHeader()->hide(); + + for(int i = 0; i < (int)results.size(); ++i) + { + int row = eventIdToRow[results[i].eventID]; + ui->counterResults->setItem(row, 0, + new QTableWidgetItem(QString::number(results[i].eventID))); + ui->counterResults->setItem(row, counterIndex[results[i].counterID] + 1, + new QTableWidgetItem(FormatCounterResult( + results[i], counterDescriptions[results[i].counterID]))); + } + }); + + done = true; }); + + ShowProgressDialog(this, QLatin1String("Capturing counters"), + [&done]() -> bool { return done; }); } }); }