Browse Source
Merge pull request #6697 from ameerj/fps-cap
config, nvflinger: Add FPS cap setting
pull/15/merge
bunnei
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with
49 additions and
6 deletions
-
src/common/settings.h
-
src/core/hle/service/nvflinger/nvflinger.cpp
-
src/yuzu/configuration/config.cpp
-
src/yuzu/configuration/configure_general.cpp
-
src/yuzu/configuration/configure_general.ui
-
src/yuzu/main.cpp
-
src/yuzu_cmd/config.cpp
-
src/yuzu_cmd/default_ini.h
|
|
|
@ -339,6 +339,7 @@ struct Values { |
|
|
|
Setting<bool> use_nvdec_emulation{true, "use_nvdec_emulation"}; |
|
|
|
Setting<bool> accelerate_astc{true, "accelerate_astc"}; |
|
|
|
Setting<bool> use_vsync{true, "use_vsync"}; |
|
|
|
BasicSetting<u16> fps_cap{1000, "fps_cap"}; |
|
|
|
BasicSetting<bool> disable_fps_limit{false, "disable_fps_limit"}; |
|
|
|
Setting<ShaderBackend> shader_backend{ShaderBackend::GLASM, "shader_backend"}; |
|
|
|
Setting<bool> use_asynchronous_shaders{false, "use_asynchronous_shaders"}; |
|
|
|
|
|
|
|
@ -307,11 +307,12 @@ void NVFlinger::Compose() { |
|
|
|
} |
|
|
|
|
|
|
|
s64 NVFlinger::GetNextTicks() const { |
|
|
|
if (Settings::values.disable_fps_limit.GetValue()) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
constexpr s64 max_hertz = 120LL; |
|
|
|
return (1000000000 * (1LL << swap_interval)) / max_hertz; |
|
|
|
static constexpr s64 max_hertz = 120LL; |
|
|
|
|
|
|
|
const auto& settings = Settings::values; |
|
|
|
const bool unlocked_fps = settings.disable_fps_limit.GetValue(); |
|
|
|
const s64 fps_cap = unlocked_fps ? static_cast<s64>(settings.fps_cap.GetValue()) : 1; |
|
|
|
return (1000000000 * (1LL << swap_interval)) / (max_hertz * fps_cap); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Service::NVFlinger
|
|
|
|
@ -823,6 +823,7 @@ void Config::ReadRendererValues() { |
|
|
|
ReadGlobalSetting(Settings::values.bg_blue); |
|
|
|
|
|
|
|
if (global) { |
|
|
|
ReadBasicSetting(Settings::values.fps_cap); |
|
|
|
ReadBasicSetting(Settings::values.renderer_debug); |
|
|
|
ReadBasicSetting(Settings::values.enable_nsight_aftermath); |
|
|
|
ReadBasicSetting(Settings::values.disable_shader_loop_safety_checks); |
|
|
|
@ -1357,6 +1358,7 @@ void Config::SaveRendererValues() { |
|
|
|
WriteGlobalSetting(Settings::values.bg_blue); |
|
|
|
|
|
|
|
if (global) { |
|
|
|
WriteBasicSetting(Settings::values.fps_cap); |
|
|
|
WriteBasicSetting(Settings::values.renderer_debug); |
|
|
|
WriteBasicSetting(Settings::values.enable_nsight_aftermath); |
|
|
|
WriteBasicSetting(Settings::values.disable_shader_loop_safety_checks); |
|
|
|
|
|
|
|
@ -48,6 +48,8 @@ void ConfigureGeneral::SetConfiguration() { |
|
|
|
ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue()); |
|
|
|
ui->frame_limit->setValue(Settings::values.frame_limit.GetValue()); |
|
|
|
|
|
|
|
ui->fps_cap->setValue(Settings::values.fps_cap.GetValue()); |
|
|
|
|
|
|
|
ui->button_reset_defaults->setEnabled(runtime_lock); |
|
|
|
|
|
|
|
if (Settings::IsConfiguringGlobal()) { |
|
|
|
@ -87,6 +89,8 @@ void ConfigureGeneral::ApplyConfiguration() { |
|
|
|
UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked(); |
|
|
|
UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked(); |
|
|
|
|
|
|
|
Settings::values.fps_cap.SetValue(ui->fps_cap->value()); |
|
|
|
|
|
|
|
// Guard if during game and set to game-specific value
|
|
|
|
if (Settings::values.use_frame_limit.UsingGlobal()) { |
|
|
|
Settings::values.use_frame_limit.SetValue(ui->toggle_frame_limit->checkState() == |
|
|
|
|
|
|
|
@ -51,6 +51,36 @@ |
|
|
|
</item> |
|
|
|
</layout> |
|
|
|
</item> |
|
|
|
<item> |
|
|
|
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
|
|
|
<item> |
|
|
|
<widget class="QLabel" name="fps_cap_label"> |
|
|
|
<property name="text"> |
|
|
|
<string>Framerate Cap</string> |
|
|
|
</property> |
|
|
|
<property name="toolTip"> |
|
|
|
<string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string> |
|
|
|
</property> |
|
|
|
</widget> |
|
|
|
</item> |
|
|
|
<item> |
|
|
|
<widget class="QSpinBox" name="fps_cap"> |
|
|
|
<property name="suffix"> |
|
|
|
<string>x</string> |
|
|
|
</property> |
|
|
|
<property name="minimum"> |
|
|
|
<number>1</number> |
|
|
|
</property> |
|
|
|
<property name="maximum"> |
|
|
|
<number>1000</number> |
|
|
|
</property> |
|
|
|
<property name="value"> |
|
|
|
<number>500</number> |
|
|
|
</property> |
|
|
|
</widget> |
|
|
|
</item> |
|
|
|
</layout> |
|
|
|
</item> |
|
|
|
<item> |
|
|
|
<widget class="QCheckBox" name="use_multi_core"> |
|
|
|
<property name="text"> |
|
|
|
|
|
|
|
@ -2919,7 +2919,7 @@ void GMainWindow::UpdateStatusBar() { |
|
|
|
} |
|
|
|
if (Settings::values.disable_fps_limit) { |
|
|
|
game_fps_label->setText( |
|
|
|
tr("Game: %1 FPS (Limit off)").arg(results.average_game_fps, 0, 'f', 0)); |
|
|
|
tr("Game: %1 FPS (Unlocked)").arg(results.average_game_fps, 0, 'f', 0)); |
|
|
|
} else { |
|
|
|
game_fps_label->setText(tr("Game: %1 FPS").arg(results.average_game_fps, 0, 'f', 0)); |
|
|
|
} |
|
|
|
|
|
|
|
@ -457,6 +457,7 @@ void Config::ReadValues() { |
|
|
|
ReadSetting("Renderer", Settings::values.gpu_accuracy); |
|
|
|
ReadSetting("Renderer", Settings::values.use_asynchronous_gpu_emulation); |
|
|
|
ReadSetting("Renderer", Settings::values.use_vsync); |
|
|
|
ReadSetting("Renderer", Settings::values.fps_cap); |
|
|
|
ReadSetting("Renderer", Settings::values.disable_fps_limit); |
|
|
|
ReadSetting("Renderer", Settings::values.shader_backend); |
|
|
|
ReadSetting("Renderer", Settings::values.use_asynchronous_shaders); |
|
|
|
|
|
|
|
@ -299,6 +299,10 @@ bg_red = |
|
|
|
bg_blue = |
|
|
|
bg_green = |
|
|
|
|
|
|
|
# Caps the unlocked framerate to a multiple of the title's target FPS. |
|
|
|
# 1 - 1000: Target FPS multiple cap. 1000 (default) |
|
|
|
fps_cap = |
|
|
|
|
|
|
|
[Audio] |
|
|
|
# Which audio output engine to use. |
|
|
|
# auto (default): Auto-select |
|
|
|
|