diff options
| author | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2017-02-19 18:18:26 -0800 | 
|---|---|---|
| committer | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2017-02-26 17:22:03 -0800 | 
| commit | 92c8bd4b1f650438274e50303a6d3f668924d071 (patch) | |
| tree | 0c9e162129dabd2424ee329b51f5765a73f6a494 /src/core | |
| parent | c75ae6c585f651a1b7c162c2e1ecccd22a1c587d (diff) | |
PerfStats: Add method to get the instantaneous time ratio
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/frontend/emu_window.cpp | 5 | ||||
| -rw-r--r-- | src/core/perf_stats.cpp | 14 | ||||
| -rw-r--r-- | src/core/perf_stats.h | 10 | 
3 files changed, 22 insertions, 7 deletions
| diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 6b4637741..b65d6ff58 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -5,7 +5,7 @@  #include <algorithm>  #include <cmath>  #include "common/assert.h" -#include "common/profiler_reporting.h" +#include "core/core.h"  #include "core/frontend/emu_window.h"  #include "core/frontend/key_map.h"  #include "video_core/video_core.h" @@ -104,8 +104,7 @@ void EmuWindow::AccelerometerChanged(float x, float y, float z) {  void EmuWindow::GyroscopeChanged(float x, float y, float z) {      constexpr float FULL_FPS = 60;      float coef = GetGyroscopeRawToDpsCoefficient(); -    float stretch = -        FULL_FPS / Common::Profiling::GetTimingResultsAggregator()->GetAggregatedResults().fps; +    float stretch = Core::System::GetInstance().perf_stats.Lock()->GetLastFrameTimeScale();      std::lock_guard<std::mutex> lock(gyro_mutex);      gyro_x = static_cast<s16>(x * coef * stretch);      gyro_y = static_cast<s16>(y * coef * stretch); diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp index 6d9e603e4..8d9e521a3 100644 --- a/src/core/perf_stats.cpp +++ b/src/core/perf_stats.cpp @@ -6,6 +6,9 @@  #include "core/hw/gpu.h"  #include "core/perf_stats.h" +using DoubleSecs = std::chrono::duration<double, std::chrono::seconds::period>; +using std::chrono::duration_cast; +  namespace Core {  void PerfStats::BeginSystemFrame() { @@ -16,6 +19,9 @@ void PerfStats::EndSystemFrame() {      auto frame_end = Clock::now();      accumulated_frametime += frame_end - frame_begin;      system_frames += 1; + +    previous_frame_length = frame_end - previous_frame_end; +    previous_frame_end = frame_end;  }  void PerfStats::EndGameFrame() { @@ -23,9 +29,6 @@ void PerfStats::EndGameFrame() {  }  PerfStats::Results PerfStats::GetAndResetStats(u64 current_system_time_us) { -    using DoubleSecs = std::chrono::duration<double, std::chrono::seconds::period>; -    using std::chrono::duration_cast; -      auto now = Clock::now();      // Walltime elapsed since stats were reset      auto interval = duration_cast<DoubleSecs>(now - reset_point).count(); @@ -50,4 +53,9 @@ PerfStats::Results PerfStats::GetAndResetStats(u64 current_system_time_us) {      return results;  } +double PerfStats::GetLastFrameTimeScale() { +    constexpr double FRAME_LENGTH = 1.0 / GPU::SCREEN_REFRESH_RATE; +    return duration_cast<DoubleSecs>(previous_frame_length).count() / FRAME_LENGTH; +} +  } // namespace Core diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index 566a1419a..8a03c511a 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h @@ -30,11 +30,19 @@ public:      Results GetAndResetStats(u64 current_system_time_us); +    /** +     * Gets the ratio between walltime and the emulated time of the previous system frame. This is +     * useful for scaling inputs or outputs moving between the two time domains. +     */ +    double GetLastFrameTimeScale(); +  private:      Clock::time_point reset_point = Clock::now(); -    Clock::time_point frame_begin; +    Clock::time_point frame_begin = reset_point; +    Clock::time_point previous_frame_end = reset_point;      Clock::duration accumulated_frametime = Clock::duration::zero(); +    Clock::duration previous_frame_length = Clock::duration::zero();      u64 reset_point_system_us = 0;      u32 system_frames = 0;      u32 game_frames = 0; | 
