@ -8,17 +8,13 @@
# include "common/color.h"
# include "common/common_types.h"
# include "common/logging/log.h"
# include "common/math_util.h"
# include "common/microprofile.h"
# include "common/thread.h"
# include "common/timer.h"
# include "common/vector_math.h"
# include "core/core_timing.h"
# include "core/hle/service/gsp_gpu.h"
# include "core/hw/gpu.h"
# include "core/hw/hw.h"
# include "core/memory.h"
# include "core/settings.h"
# include "core/tracer/recorder.h"
# include "video_core/command_processor.h"
# include "video_core/debug_utils/debug_utils.h"
@ -35,16 +31,6 @@ Regs g_regs;
const u64 frame_ticks = BASE_CLOCK_RATE_ARM11 / SCREEN_REFRESH_RATE ;
/// Event id for CoreTiming
static int vblank_event ;
/// Total number of frames drawn
static u64 frame_count ;
/// Start clock for frame limiter
static u32 time_point ;
/// Total delay caused by slow frames
static float time_delay ;
constexpr float FIXED_FRAME_TIME = 1000.0f / SCREEN_REFRESH_RATE ;
// Max lag caused by slow frames. Can be adjusted to compensate for too many slow frames. Higher
// values increases time needed to limit frame rate after spikes
constexpr float MAX_LAG_TIME = 18 ;
template < typename T >
inline void Read ( T & var , const u32 raw_addr ) {
@ -522,24 +508,8 @@ template void Write<u32>(u32 addr, const u32 data);
template void Write < u16 > ( u32 addr , const u16 data ) ;
template void Write < u8 > ( u32 addr , const u8 data ) ;
static void FrameLimiter ( ) {
time_delay + = FIXED_FRAME_TIME ;
time_delay = MathUtil : : Clamp ( time_delay , - MAX_LAG_TIME , MAX_LAG_TIME ) ;
s32 desired_time = static_cast < s32 > ( time_delay ) ;
s32 elapsed_time = static_cast < s32 > ( Common : : Timer : : GetTimeMs ( ) - time_point ) ;
if ( elapsed_time < desired_time ) {
Common : : SleepCurrentThread ( desired_time - elapsed_time ) ;
}
u32 frame_time = Common : : Timer : : GetTimeMs ( ) - time_point ;
time_delay - = frame_time ;
}
/// Update hardware
static void VBlankCallback ( u64 userdata , int cycles_late ) {
frame_count + + ;
VideoCore : : g_renderer - > SwapBuffers ( ) ;
// Signal to GSP that GPU interrupt has occurred
@ -550,12 +520,6 @@ static void VBlankCallback(u64 userdata, int cycles_late) {
Service : : GSP : : SignalInterrupt ( Service : : GSP : : InterruptId : : PDC0 ) ;
Service : : GSP : : SignalInterrupt ( Service : : GSP : : InterruptId : : PDC1 ) ;
if ( ! Settings : : values . use_vsync & & Settings : : values . toggle_framelimit ) {
FrameLimiter ( ) ;
}
time_point = Common : : Timer : : GetTimeMs ( ) ;
// Reschedule recurrent event
CoreTiming : : ScheduleEvent ( frame_ticks - cycles_late , vblank_event ) ;
}
@ -590,9 +554,6 @@ void Init() {
framebuffer_sub . color_format . Assign ( Regs : : PixelFormat : : RGB8 ) ;
framebuffer_sub . active_fb = 0 ;
frame_count = 0 ;
time_point = Common : : Timer : : GetTimeMs ( ) ;
vblank_event = CoreTiming : : RegisterEvent ( " GPU::VBlankCallback " , VBlankCallback ) ;
CoreTiming : : ScheduleEvent ( frame_ticks , vblank_event ) ;