From 9143eb00fb167e14dfb2d64a959df3fb8d8f0f55 Mon Sep 17 00:00:00 2001 From: Sam Belliveau Date: Sat, 31 Dec 2022 16:04:44 -0500 Subject: [PATCH 1/3] PerformanceMetrics: Fix Line Width Issue on Non HiDPI Screens --- Source/Core/VideoCommon/PerformanceMetrics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/VideoCommon/PerformanceMetrics.cpp b/Source/Core/VideoCommon/PerformanceMetrics.cpp index 3b9cc81791..23e35623cb 100644 --- a/Source/Core/VideoCommon/PerformanceMetrics.cpp +++ b/Source/Core/VideoCommon/PerformanceMetrics.cpp @@ -134,7 +134,7 @@ void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale) const ImPlot::PushStyleColor(ImPlotCol_PlotBg, {0, 0, 0, 0}); ImPlot::PushStyleColor(ImPlotCol_LegendBg, {0, 0, 0, 0.2f}); ImPlot::PushStyleVar(ImPlotStyleVar_FitPadding, ImVec2(0.f, 0.f)); - ImPlot::PushStyleVar(ImPlotStyleVar_LineWeight, 3.f); + ImPlot::PushStyleVar(ImPlotStyleVar_LineWeight, 1.5f * backbuffer_scale); ImPlot::SetupAxes(nullptr, nullptr, ImPlotAxisFlags_Lock | ImPlotAxisFlags_Invert | ImPlotAxisFlags_NoDecorations | ImPlotAxisFlags_NoHighlight, From bc46089ab0ca7963ca3b5507969a3df0f2afca6c Mon Sep 17 00:00:00 2001 From: Sam Belliveau Date: Fri, 30 Dec 2022 14:56:08 -0500 Subject: [PATCH 2/3] PerformanceTracker: Use shared_mutex instead of mutex so multiple threads can read at the same time. --- .../Core/VideoCommon/PerformanceTracker.cpp | 20 ++++++++++--------- Source/Core/VideoCommon/PerformanceTracker.h | 4 ++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Source/Core/VideoCommon/PerformanceTracker.cpp b/Source/Core/VideoCommon/PerformanceTracker.cpp index ffde157883..305fb35598 100644 --- a/Source/Core/VideoCommon/PerformanceTracker.cpp +++ b/Source/Core/VideoCommon/PerformanceTracker.cpp @@ -5,8 +5,10 @@ #include #include -#include #include +#include + +#include #include "Common/CommonTypes.h" #include "Common/FileUtil.h" @@ -36,7 +38,7 @@ PerformanceTracker::~PerformanceTracker() void PerformanceTracker::Reset() { - std::lock_guard lock{m_mutex}; + std::unique_lock lock{m_mutex}; QueueClear(); m_last_time = Clock::now(); @@ -47,7 +49,7 @@ void PerformanceTracker::Reset() void PerformanceTracker::Count() { - std::lock_guard lock{m_mutex}; + std::unique_lock lock{m_mutex}; if (m_paused) return; @@ -97,19 +99,19 @@ DT PerformanceTracker::GetSampleWindow() const double PerformanceTracker::GetHzAvg() const { - std::lock_guard lock{m_mutex}; + std::shared_lock lock{m_mutex}; return m_hz_avg; } DT PerformanceTracker::GetDtAvg() const { - std::lock_guard lock{m_mutex}; + std::shared_lock lock{m_mutex}; return m_dt_avg; } DT PerformanceTracker::GetDtStd() const { - std::lock_guard lock{m_mutex}; + std::unique_lock lock{m_mutex}; if (m_dt_std) return *m_dt_std; @@ -130,7 +132,7 @@ DT PerformanceTracker::GetDtStd() const DT PerformanceTracker::GetLastRawDt() const { - std::lock_guard lock{m_mutex}; + std::shared_lock lock{m_mutex}; if (QueueEmpty()) return DT::zero(); @@ -142,7 +144,7 @@ void PerformanceTracker::ImPlotPlotLines(const char* label) const { static std::array x, y; - std::lock_guard lock{m_mutex}; + std::shared_lock lock{m_mutex}; if (QueueEmpty()) return; @@ -238,7 +240,7 @@ void PerformanceTracker::LogRenderTimeToFile(DT val) void PerformanceTracker::SetPaused(bool paused) { - std::lock_guard lock{m_mutex}; + std::unique_lock lock{m_mutex}; m_paused = paused; if (m_paused) diff --git a/Source/Core/VideoCommon/PerformanceTracker.h b/Source/Core/VideoCommon/PerformanceTracker.h index e253f83352..4136664981 100644 --- a/Source/Core/VideoCommon/PerformanceTracker.h +++ b/Source/Core/VideoCommon/PerformanceTracker.h @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include #include "Common/CommonTypes.h" @@ -100,5 +100,5 @@ private: // Functions for managing dt queue mutable std::optional
m_dt_std = std::nullopt; // Used to enable thread safety with the performance tracker - mutable std::mutex m_mutex; + mutable std::shared_mutex m_mutex; }; From 588a72a4fc7eb46f161687d0828afd9703e618ee Mon Sep 17 00:00:00 2001 From: Sam Belliveau Date: Fri, 30 Dec 2022 14:56:08 -0500 Subject: [PATCH 3/3] PerformanceTracker: Add ownership of m_log_name. --- Source/Core/VideoCommon/PerformanceMetrics.h | 2 +- Source/Core/VideoCommon/PerformanceTracker.cpp | 11 +++++++---- Source/Core/VideoCommon/PerformanceTracker.h | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Source/Core/VideoCommon/PerformanceMetrics.h b/Source/Core/VideoCommon/PerformanceMetrics.h index b01c0782ab..eb6f8ecb00 100644 --- a/Source/Core/VideoCommon/PerformanceMetrics.h +++ b/Source/Core/VideoCommon/PerformanceMetrics.h @@ -34,7 +34,7 @@ public: private: PerformanceTracker m_fps_counter{"render_times.txt"}; PerformanceTracker m_vps_counter{"vblank_times.txt"}; - PerformanceTracker m_speed_counter{nullptr, 500000}; + PerformanceTracker m_speed_counter{std::nullopt, 500000}; }; extern PerformanceMetrics g_perf_metrics; diff --git a/Source/Core/VideoCommon/PerformanceTracker.cpp b/Source/Core/VideoCommon/PerformanceTracker.cpp index 305fb35598..93b33cff9a 100644 --- a/Source/Core/VideoCommon/PerformanceTracker.cpp +++ b/Source/Core/VideoCommon/PerformanceTracker.cpp @@ -18,7 +18,7 @@ static constexpr double SAMPLE_RC_RATIO = 0.25; -PerformanceTracker::PerformanceTracker(const char* log_name, +PerformanceTracker::PerformanceTracker(const std::optional log_name, const std::optional sample_window_us) : m_on_state_changed_handle{Core::AddOnStateChangedCallback([this](Core::State state) { if (state == Core::State::Paused) @@ -86,8 +86,7 @@ void PerformanceTracker::Count() m_dt_std = std::nullopt; - if (m_log_name && g_ActiveConfig.bLogRenderTimeToFile) - LogRenderTimeToFile(diff); + LogRenderTimeToFile(diff); } DT PerformanceTracker::GetSampleWindow() const @@ -230,9 +229,13 @@ bool PerformanceTracker::QueueEmpty() const void PerformanceTracker::LogRenderTimeToFile(DT val) { + if (!m_log_name || !g_ActiveConfig.bLogRenderTimeToFile) + return; + if (!m_bench_file.is_open()) { - File::OpenFStream(m_bench_file, File::GetUserPath(D_LOGS_IDX) + m_log_name, std::ios_base::out); + File::OpenFStream(m_bench_file, File::GetUserPath(D_LOGS_IDX) + *m_log_name, + std::ios_base::out); } m_bench_file << std::fixed << std::setprecision(8) << DT_ms(val).count() << std::endl; diff --git a/Source/Core/VideoCommon/PerformanceTracker.h b/Source/Core/VideoCommon/PerformanceTracker.h index 4136664981..f24601c845 100644 --- a/Source/Core/VideoCommon/PerformanceTracker.h +++ b/Source/Core/VideoCommon/PerformanceTracker.h @@ -34,8 +34,8 @@ private: } public: - PerformanceTracker(const char* log_name = nullptr, - const std::optional sample_window_us = {}); + PerformanceTracker(const std::optional log_name = std::nullopt, + const std::optional sample_window_us = std::nullopt); ~PerformanceTracker(); PerformanceTracker(const PerformanceTracker&) = delete; @@ -77,7 +77,7 @@ private: // Functions for managing dt queue int m_on_state_changed_handle; // Name of log file and file stream - const char* m_log_name; + std::optional m_log_name; std::ofstream m_bench_file; // Last time Count() was called