diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index a9a41154a7..ff1c1d3ae0 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -3195,7 +3195,8 @@ namespace rsx case frame_limit_type::_50: limit = 50.; break; case frame_limit_type::_60: limit = 60.; break; case frame_limit_type::_30: limit = 30.; break; - case frame_limit_type::_auto: limit = 0.; break; + case frame_limit_type::_auto: limit = static_cast(g_cfg.video.vblank_rate); break; + case frame_limit_type::_ps3: limit = 0.; break; default: break; } diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 86b0e8b916..9dd8136f61 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -106,11 +106,13 @@ namespace rsx if (addr == rsx->device_addr + 0x30) { - if (g_cfg.video.frame_limit == frame_limit_type::_auto) + if (g_cfg.video.frame_limit == frame_limit_type::_ps3 && rsx->requested_vsync) { + // Enables PS3-compliant vblank behavior rsx->flip_sema_wait_val = arg; rsx->wait_for_flip_sema = (sema != arg); } + return; } diff --git a/rpcs3/Emu/system_config_types.cpp b/rpcs3/Emu/system_config_types.cpp index a527486ff5..5c968c7d06 100644 --- a/rpcs3/Emu/system_config_types.cpp +++ b/rpcs3/Emu/system_config_types.cpp @@ -295,6 +295,7 @@ void fmt_class_string::format(std::string& out, u64 arg) case frame_limit_type::_60: return "60"; case frame_limit_type::_30: return "30"; case frame_limit_type::_auto: return "Auto"; + case frame_limit_type::_ps3: return "PS3 Native"; } return unknown; diff --git a/rpcs3/Emu/system_config_types.h b/rpcs3/Emu/system_config_types.h index 8cdf3bf3a7..dff7b5e41b 100644 --- a/rpcs3/Emu/system_config_types.h +++ b/rpcs3/Emu/system_config_types.h @@ -182,6 +182,7 @@ enum class frame_limit_type _60, _30, _auto, + _ps3, }; enum class msaa_level diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index a3a69b7d5d..26d2dba855 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -955,6 +955,7 @@ QString emu_settings::GetLocalizedSetting(const QString& original, emu_settings_ case frame_limit_type::_60: return tr("60", "Frame limit"); case frame_limit_type::_30: return tr("30", "Frame limit"); case frame_limit_type::_auto: return tr("Auto", "Frame limit"); + case frame_limit_type::_ps3: return tr("PS3 Native", "Frame limit"); } break; case emu_settings_type::MSAA: diff --git a/rpcs3/rpcs3qt/tooltips.h b/rpcs3/rpcs3qt/tooltips.h index 46dd845e6f..a5a645823e 100644 --- a/rpcs3/rpcs3qt/tooltips.h +++ b/rpcs3/rpcs3qt/tooltips.h @@ -155,7 +155,7 @@ public: const QString resolution = tr("This setting will be ignored if the Resolution Scale is set to anything other than 100%!\nLeave this on 1280x720. Every PS3 game is compatible with this resolution.\nOnly use 1920x1080 if the game supports it.\nRarely due to emulation bugs some games will only render at low resolutions like 480p."); const QString graphics_adapter = tr("On multi GPU systems select which GPU to use in RPCS3 when using Vulkan.\nThis is not needed when using OpenGL."); const QString aspect_ratio = tr("Leave this on 16:9 unless you have a 4:3 monitor."); - const QString frame_limit = tr("Off is the best option as it performs faster.\nUsing the frame limiter will add extra overhead and slow down the game.\nHowever, some games will crash if the frame rate is too high.\nIf that happens, set value to anything other than Off."); + const QString frame_limit = tr("Off is the best option as it performs faster.\nUsing the frame limiter will add extra overhead and slow down the game.\nHowever, some games will crash if the frame rate is too high.\nPS3 native should only be used if Auto is not working correctly as it can introduce frame-pacing issues."); const QString anti_aliasing = tr("Emulate PS3 multisampling layout.\nCan fix some otherwise difficult to solve graphics glitches.\nLow to moderate performance hit depending on your GPU hardware."); const QString anisotropic_filter = tr("Higher values increase sharpness of textures on sloped surfaces at the cost of GPU resources.\nModern GPUs can handle this setting just fine, even at 16x.\nKeep this on Automatic if you want to use the original setting used by a real PS3."); const QString resolution_scale = tr("Scales the game's resolution by the given percentage.\nThe base resolution is always 1280x720.\nSet this value to 100% if you want to use the normal Resolution options.");