diff options
| -rw-r--r-- | src/common/settings.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 11 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm.cpp | 2 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_instructions.h | 2 | ||||
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/control_flow.cpp | 2 | ||||
| -rw-r--r-- | src/shader_recompiler/object_pool.h | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_general.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_general.ui | 30 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu_cmd/config.cpp | 1 | ||||
| -rw-r--r-- | src/yuzu_cmd/default_ini.h | 4 |
13 files changed, 55 insertions, 9 deletions
diff --git a/src/common/settings.h b/src/common/settings.h index 32dfb1d9f..df1762d1b 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -339,6 +339,7 @@ struct Values { | |||
| 339 | Setting<bool> use_nvdec_emulation{true, "use_nvdec_emulation"}; | 339 | Setting<bool> use_nvdec_emulation{true, "use_nvdec_emulation"}; |
| 340 | Setting<bool> accelerate_astc{true, "accelerate_astc"}; | 340 | Setting<bool> accelerate_astc{true, "accelerate_astc"}; |
| 341 | Setting<bool> use_vsync{true, "use_vsync"}; | 341 | Setting<bool> use_vsync{true, "use_vsync"}; |
| 342 | BasicSetting<u16> fps_cap{1000, "fps_cap"}; | ||
| 342 | BasicSetting<bool> disable_fps_limit{false, "disable_fps_limit"}; | 343 | BasicSetting<bool> disable_fps_limit{false, "disable_fps_limit"}; |
| 343 | Setting<ShaderBackend> shader_backend{ShaderBackend::GLASM, "shader_backend"}; | 344 | Setting<ShaderBackend> shader_backend{ShaderBackend::GLASM, "shader_backend"}; |
| 344 | Setting<bool> use_asynchronous_shaders{false, "use_asynchronous_shaders"}; | 345 | Setting<bool> use_asynchronous_shaders{false, "use_asynchronous_shaders"}; |
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 1d810562f..941748970 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -307,11 +307,12 @@ void NVFlinger::Compose() { | |||
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | s64 NVFlinger::GetNextTicks() const { | 309 | s64 NVFlinger::GetNextTicks() const { |
| 310 | if (Settings::values.disable_fps_limit.GetValue()) { | 310 | static constexpr s64 max_hertz = 120LL; |
| 311 | return 0; | 311 | |
| 312 | } | 312 | const auto& settings = Settings::values; |
| 313 | constexpr s64 max_hertz = 120LL; | 313 | const bool unlocked_fps = settings.disable_fps_limit.GetValue(); |
| 314 | return (1000000000 * (1LL << swap_interval)) / max_hertz; | 314 | const s64 fps_cap = unlocked_fps ? static_cast<s64>(settings.fps_cap.GetValue()) : 1; |
| 315 | return (1000000000 * (1LL << swap_interval)) / (max_hertz * fps_cap); | ||
| 315 | } | 316 | } |
| 316 | 317 | ||
| 317 | } // namespace Service::NVFlinger | 318 | } // namespace Service::NVFlinger |
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp index a5e8c9b6e..4ce1c4f54 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp | |||
| @@ -350,7 +350,7 @@ std::string_view InputPrimitive(InputTopology topology) { | |||
| 350 | case InputTopology::Lines: | 350 | case InputTopology::Lines: |
| 351 | return "LINES"; | 351 | return "LINES"; |
| 352 | case InputTopology::LinesAdjacency: | 352 | case InputTopology::LinesAdjacency: |
| 353 | return "LINESS_ADJACENCY"; | 353 | return "LINES_ADJACENCY"; |
| 354 | case InputTopology::Triangles: | 354 | case InputTopology::Triangles: |
| 355 | return "TRIANGLES"; | 355 | return "TRIANGLES"; |
| 356 | case InputTopology::TrianglesAdjacency: | 356 | case InputTopology::TrianglesAdjacency: |
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index f99c02848..c9db1c164 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #pragma once | ||
| 6 | |||
| 5 | #include <sirit/sirit.h> | 7 | #include <sirit/sirit.h> |
| 6 | 8 | ||
| 7 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
diff --git a/src/shader_recompiler/frontend/maxwell/control_flow.cpp b/src/shader_recompiler/frontend/maxwell/control_flow.cpp index 1a954a509..efe457baa 100644 --- a/src/shader_recompiler/frontend/maxwell/control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/control_flow.cpp | |||
| @@ -73,7 +73,7 @@ Token OpcodeToken(Opcode opcode) { | |||
| 73 | return Token::PBK; | 73 | return Token::PBK; |
| 74 | case Opcode::PCNT: | 74 | case Opcode::PCNT: |
| 75 | case Opcode::CONT: | 75 | case Opcode::CONT: |
| 76 | return Token::PBK; | 76 | return Token::PCNT; |
| 77 | case Opcode::PEXIT: | 77 | case Opcode::PEXIT: |
| 78 | case Opcode::EXIT: | 78 | case Opcode::EXIT: |
| 79 | return Token::PEXIT; | 79 | return Token::PEXIT; |
diff --git a/src/shader_recompiler/object_pool.h b/src/shader_recompiler/object_pool.h index f8b255b66..f3b12d04b 100644 --- a/src/shader_recompiler/object_pool.h +++ b/src/shader_recompiler/object_pool.h | |||
| @@ -63,6 +63,7 @@ private: | |||
| 63 | used_objects = std::exchange(rhs.used_objects, 0); | 63 | used_objects = std::exchange(rhs.used_objects, 0); |
| 64 | num_objects = std::exchange(rhs.num_objects, 0); | 64 | num_objects = std::exchange(rhs.num_objects, 0); |
| 65 | storage = std::move(rhs.storage); | 65 | storage = std::move(rhs.storage); |
| 66 | return *this; | ||
| 66 | } | 67 | } |
| 67 | 68 | ||
| 68 | Chunk(Chunk&& rhs) noexcept | 69 | Chunk(Chunk&& rhs) noexcept |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 52b3ed02e..4d89b00e9 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -823,6 +823,7 @@ void Config::ReadRendererValues() { | |||
| 823 | ReadGlobalSetting(Settings::values.bg_blue); | 823 | ReadGlobalSetting(Settings::values.bg_blue); |
| 824 | 824 | ||
| 825 | if (global) { | 825 | if (global) { |
| 826 | ReadBasicSetting(Settings::values.fps_cap); | ||
| 826 | ReadBasicSetting(Settings::values.renderer_debug); | 827 | ReadBasicSetting(Settings::values.renderer_debug); |
| 827 | ReadBasicSetting(Settings::values.enable_nsight_aftermath); | 828 | ReadBasicSetting(Settings::values.enable_nsight_aftermath); |
| 828 | ReadBasicSetting(Settings::values.disable_shader_loop_safety_checks); | 829 | ReadBasicSetting(Settings::values.disable_shader_loop_safety_checks); |
| @@ -1357,6 +1358,7 @@ void Config::SaveRendererValues() { | |||
| 1357 | WriteGlobalSetting(Settings::values.bg_blue); | 1358 | WriteGlobalSetting(Settings::values.bg_blue); |
| 1358 | 1359 | ||
| 1359 | if (global) { | 1360 | if (global) { |
| 1361 | WriteBasicSetting(Settings::values.fps_cap); | ||
| 1360 | WriteBasicSetting(Settings::values.renderer_debug); | 1362 | WriteBasicSetting(Settings::values.renderer_debug); |
| 1361 | WriteBasicSetting(Settings::values.enable_nsight_aftermath); | 1363 | WriteBasicSetting(Settings::values.enable_nsight_aftermath); |
| 1362 | WriteBasicSetting(Settings::values.disable_shader_loop_safety_checks); | 1364 | WriteBasicSetting(Settings::values.disable_shader_loop_safety_checks); |
diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index 18f25def6..d79d2e23e 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp | |||
| @@ -48,6 +48,8 @@ void ConfigureGeneral::SetConfiguration() { | |||
| 48 | ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue()); | 48 | ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue()); |
| 49 | ui->frame_limit->setValue(Settings::values.frame_limit.GetValue()); | 49 | ui->frame_limit->setValue(Settings::values.frame_limit.GetValue()); |
| 50 | 50 | ||
| 51 | ui->fps_cap->setValue(Settings::values.fps_cap.GetValue()); | ||
| 52 | |||
| 51 | ui->button_reset_defaults->setEnabled(runtime_lock); | 53 | ui->button_reset_defaults->setEnabled(runtime_lock); |
| 52 | 54 | ||
| 53 | if (Settings::IsConfiguringGlobal()) { | 55 | if (Settings::IsConfiguringGlobal()) { |
| @@ -87,6 +89,8 @@ void ConfigureGeneral::ApplyConfiguration() { | |||
| 87 | UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked(); | 89 | UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked(); |
| 88 | UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked(); | 90 | UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked(); |
| 89 | 91 | ||
| 92 | Settings::values.fps_cap.SetValue(ui->fps_cap->value()); | ||
| 93 | |||
| 90 | // Guard if during game and set to game-specific value | 94 | // Guard if during game and set to game-specific value |
| 91 | if (Settings::values.use_frame_limit.UsingGlobal()) { | 95 | if (Settings::values.use_frame_limit.UsingGlobal()) { |
| 92 | Settings::values.use_frame_limit.SetValue(ui->toggle_frame_limit->checkState() == | 96 | Settings::values.use_frame_limit.SetValue(ui->toggle_frame_limit->checkState() == |
diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index bc7041090..bc3c4b481 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui | |||
| @@ -52,6 +52,36 @@ | |||
| 52 | </layout> | 52 | </layout> |
| 53 | </item> | 53 | </item> |
| 54 | <item> | 54 | <item> |
| 55 | <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||
| 56 | <item> | ||
| 57 | <widget class="QLabel" name="fps_cap_label"> | ||
| 58 | <property name="text"> | ||
| 59 | <string>Framerate Cap</string> | ||
| 60 | </property> | ||
| 61 | <property name="toolTip"> | ||
| 62 | <string>Requires the use of the FPS Limiter Toggle hotkey to take effect.</string> | ||
| 63 | </property> | ||
| 64 | </widget> | ||
| 65 | </item> | ||
| 66 | <item> | ||
| 67 | <widget class="QSpinBox" name="fps_cap"> | ||
| 68 | <property name="suffix"> | ||
| 69 | <string>x</string> | ||
| 70 | </property> | ||
| 71 | <property name="minimum"> | ||
| 72 | <number>1</number> | ||
| 73 | </property> | ||
| 74 | <property name="maximum"> | ||
| 75 | <number>1000</number> | ||
| 76 | </property> | ||
| 77 | <property name="value"> | ||
| 78 | <number>500</number> | ||
| 79 | </property> | ||
| 80 | </widget> | ||
| 81 | </item> | ||
| 82 | </layout> | ||
| 83 | </item> | ||
| 84 | <item> | ||
| 55 | <widget class="QCheckBox" name="use_multi_core"> | 85 | <widget class="QCheckBox" name="use_multi_core"> |
| 56 | <property name="text"> | 86 | <property name="text"> |
| 57 | <string>Multicore CPU Emulation</string> | 87 | <string>Multicore CPU Emulation</string> |
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index fef211707..1bc477c96 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp | |||
| @@ -31,7 +31,7 @@ ConfigureGraphics::ConfigureGraphics(QWidget* parent) | |||
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | ui->backend->addItem(QStringLiteral("GLSL")); | 33 | ui->backend->addItem(QStringLiteral("GLSL")); |
| 34 | ui->backend->addItem(tr("GLASM (NVIDIA Only)")); | 34 | ui->backend->addItem(tr("GLASM (Assembly Shaders, NVIDIA Only)")); |
| 35 | ui->backend->addItem(QStringLiteral("SPIR-V (Experimental, Mesa Only)")); | 35 | ui->backend->addItem(QStringLiteral("SPIR-V (Experimental, Mesa Only)")); |
| 36 | 36 | ||
| 37 | SetupPerGameUI(); | 37 | SetupPerGameUI(); |
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 2f84ada73..3d747e8d9 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp | |||
| @@ -2919,7 +2919,7 @@ void GMainWindow::UpdateStatusBar() { | |||
| 2919 | } | 2919 | } |
| 2920 | if (Settings::values.disable_fps_limit) { | 2920 | if (Settings::values.disable_fps_limit) { |
| 2921 | game_fps_label->setText( | 2921 | game_fps_label->setText( |
| 2922 | tr("Game: %1 FPS (Limit off)").arg(results.average_game_fps, 0, 'f', 0)); | 2922 | tr("Game: %1 FPS (Unlocked)").arg(results.average_game_fps, 0, 'f', 0)); |
| 2923 | } else { | 2923 | } else { |
| 2924 | game_fps_label->setText(tr("Game: %1 FPS").arg(results.average_game_fps, 0, 'f', 0)); | 2924 | game_fps_label->setText(tr("Game: %1 FPS").arg(results.average_game_fps, 0, 'f', 0)); |
| 2925 | } | 2925 | } |
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index 640d7d111..d4ca6bb57 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp | |||
| @@ -457,6 +457,7 @@ void Config::ReadValues() { | |||
| 457 | ReadSetting("Renderer", Settings::values.gpu_accuracy); | 457 | ReadSetting("Renderer", Settings::values.gpu_accuracy); |
| 458 | ReadSetting("Renderer", Settings::values.use_asynchronous_gpu_emulation); | 458 | ReadSetting("Renderer", Settings::values.use_asynchronous_gpu_emulation); |
| 459 | ReadSetting("Renderer", Settings::values.use_vsync); | 459 | ReadSetting("Renderer", Settings::values.use_vsync); |
| 460 | ReadSetting("Renderer", Settings::values.fps_cap); | ||
| 460 | ReadSetting("Renderer", Settings::values.disable_fps_limit); | 461 | ReadSetting("Renderer", Settings::values.disable_fps_limit); |
| 461 | ReadSetting("Renderer", Settings::values.shader_backend); | 462 | ReadSetting("Renderer", Settings::values.shader_backend); |
| 462 | ReadSetting("Renderer", Settings::values.use_asynchronous_shaders); | 463 | ReadSetting("Renderer", Settings::values.use_asynchronous_shaders); |
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index b7115b06a..b2b2095d1 100644 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h | |||
| @@ -299,6 +299,10 @@ bg_red = | |||
| 299 | bg_blue = | 299 | bg_blue = |
| 300 | bg_green = | 300 | bg_green = |
| 301 | 301 | ||
| 302 | # Caps the unlocked framerate to a multiple of the title's target FPS. | ||
| 303 | # 1 - 1000: Target FPS multiple cap. 1000 (default) | ||
| 304 | fps_cap = | ||
| 305 | |||
| 302 | [Audio] | 306 | [Audio] |
| 303 | # Which audio output engine to use. | 307 | # Which audio output engine to use. |
| 304 | # auto (default): Auto-select | 308 | # auto (default): Auto-select |