summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-05-19 04:56:29 +0200
committerGitHub <noreply@github.com>2021-05-19 04:56:29 +0200
commit7d86a6ff02e0778aa69ec52ef5c0eb0d26200818 (patch)
treeec9657e464e62c444ee2062cb0110b7e710d9788 /src/core
parentMerge pull request #6337 from Morph1984/transfer-mem-size (diff)
parentperf_stats: Rework FPS counter to be more accurate (diff)
downloadyuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.tar
yuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.tar.gz
yuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.tar.bz2
yuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.tar.lz
yuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.tar.xz
yuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.tar.zst
yuzu-7d86a6ff02e0778aa69ec52ef5c0eb0d26200818.zip
Diffstat (limited to 'src/core')
-rw-r--r--src/core/core.cpp3
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp1
-rw-r--r--src/core/perf_stats.cpp12
-rw-r--r--src/core/perf_stats.h9
4 files changed, 14 insertions, 11 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 434bf3262..47e70c157 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -289,7 +289,8 @@ struct System::Impl {
telemetry_session->AddField(performance, "Shutdown_EmulationSpeed",
perf_results.emulation_speed * 100.0);
- telemetry_session->AddField(performance, "Shutdown_Framerate", perf_results.game_fps);
+ telemetry_session->AddField(performance, "Shutdown_Framerate",
+ perf_results.average_game_fps);
telemetry_session->AddField(performance, "Shutdown_Frametime",
perf_results.frametime * 1000.0);
telemetry_session->AddField(performance, "Mean_Frametime_MS",
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
index bbef04a29..2cc0da124 100644
--- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
@@ -52,7 +52,6 @@ void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u3
addr, offset, width, height, stride, static_cast<PixelFormat>(format),
transform, crop_rect};
- system.GetPerfStats().EndGameFrame();
system.GetPerfStats().EndSystemFrame();
system.GPU().SwapBuffers(&framebuffer);
system.FrameLimiter().DoFrameLimiting(system.CoreTiming().GetGlobalTimeUs());
diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp
index b185a3884..c42c437b7 100644
--- a/src/core/perf_stats.cpp
+++ b/src/core/perf_stats.cpp
@@ -69,9 +69,7 @@ void PerfStats::EndSystemFrame() {
}
void PerfStats::EndGameFrame() {
- std::lock_guard lock{object_mutex};
-
- game_frames += 1;
+ game_frames.fetch_add(1, std::memory_order_relaxed);
}
double PerfStats::GetMeanFrametime() const {
@@ -94,10 +92,11 @@ PerfStatsResults PerfStats::GetAndResetStats(microseconds current_system_time_us
const auto interval = duration_cast<DoubleSecs>(now - reset_point).count();
const auto system_us_per_second = (current_system_time_us - reset_point_system_us) / interval;
-
+ const auto current_frames = static_cast<double>(game_frames.load(std::memory_order_relaxed));
+ const auto current_fps = current_frames / interval;
const PerfStatsResults results{
.system_fps = static_cast<double>(system_frames) / interval,
- .game_fps = static_cast<double>(game_frames) / interval,
+ .average_game_fps = (current_fps + previous_fps) / 2.0,
.frametime = duration_cast<DoubleSecs>(accumulated_frametime).count() /
static_cast<double>(system_frames),
.emulation_speed = system_us_per_second.count() / 1'000'000.0,
@@ -108,7 +107,8 @@ PerfStatsResults PerfStats::GetAndResetStats(microseconds current_system_time_us
reset_point_system_us = current_system_time_us;
accumulated_frametime = Clock::duration::zero();
system_frames = 0;
- game_frames = 0;
+ game_frames.store(0, std::memory_order_relaxed);
+ previous_fps = current_fps;
return results;
}
diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h
index ae4698696..e5d603717 100644
--- a/src/core/perf_stats.h
+++ b/src/core/perf_stats.h
@@ -5,6 +5,7 @@
#pragma once
#include <array>
+#include <atomic>
#include <chrono>
#include <cstddef>
#include <mutex>
@@ -15,8 +16,8 @@ namespace Core {
struct PerfStatsResults {
/// System FPS (LCD VBlanks) in Hz
double system_fps;
- /// Game FPS (GSP frame submissions) in Hz
- double game_fps;
+ /// Average game FPS (GPU frame renders) in Hz
+ double average_game_fps;
/// Walltime per system frame, in seconds, excluding any waits
double frametime;
/// Ratio of walltime / emulated time elapsed
@@ -72,7 +73,7 @@ private:
/// Cumulative number of system frames (LCD VBlanks) presented since last reset
u32 system_frames = 0;
/// Cumulative number of game frames (GSP frame submissions) since last reset
- u32 game_frames = 0;
+ std::atomic<u32> game_frames = 0;
/// Point when the previous system frame ended
Clock::time_point previous_frame_end = reset_point;
@@ -80,6 +81,8 @@ private:
Clock::time_point frame_begin = reset_point;
/// Total visible duration (including frame-limiting, etc.) of the previous system frame
Clock::duration previous_frame_length = Clock::duration::zero();
+ /// Previously computed fps
+ double previous_fps = 0;
};
class FrameLimiter {