diff options
| author | 2019-04-13 22:14:04 -0400 | |
|---|---|---|
| committer | 2019-04-13 22:14:04 -0400 | |
| commit | 6088898b02fc4141f81bfda0006adc2e8219dff1 (patch) | |
| tree | a1e406fd17f7105363d92803f77e6c7891b88579 | |
| parent | Merge pull request #2381 from lioncash/fs (diff) | |
| parent | added a toggle to force 30fps mode (diff) | |
| download | yuzu-6088898b02fc4141f81bfda0006adc2e8219dff1.tar.gz yuzu-6088898b02fc4141f81bfda0006adc2e8219dff1.tar.xz yuzu-6088898b02fc4141f81bfda0006adc2e8219dff1.zip | |
Merge pull request #2357 from zarroboogs/force-30fps-mode
Add a toggle to force 30FPS mode
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 16 | ||||
| -rw-r--r-- | src/core/settings.h | 1 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics.ui | 7 |
5 files changed, 23 insertions, 6 deletions
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index c7f5bbf28..3c5c53e24 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -21,12 +21,13 @@ | |||
| 21 | #include "core/hle/service/vi/display/vi_display.h" | 21 | #include "core/hle/service/vi/display/vi_display.h" |
| 22 | #include "core/hle/service/vi/layer/vi_layer.h" | 22 | #include "core/hle/service/vi/layer/vi_layer.h" |
| 23 | #include "core/perf_stats.h" | 23 | #include "core/perf_stats.h" |
| 24 | #include "core/settings.h" | ||
| 24 | #include "video_core/renderer_base.h" | 25 | #include "video_core/renderer_base.h" |
| 25 | 26 | ||
| 26 | namespace Service::NVFlinger { | 27 | namespace Service::NVFlinger { |
| 27 | 28 | ||
| 28 | constexpr std::size_t SCREEN_REFRESH_RATE = 60; | 29 | constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60); |
| 29 | constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE); | 30 | constexpr s64 frame_ticks_30fps = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 30); |
| 30 | 31 | ||
| 31 | NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { | 32 | NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { |
| 32 | displays.emplace_back(0, "Default"); | 33 | displays.emplace_back(0, "Default"); |
| @@ -36,13 +37,15 @@ NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_t | |||
| 36 | displays.emplace_back(4, "Null"); | 37 | displays.emplace_back(4, "Null"); |
| 37 | 38 | ||
| 38 | // Schedule the screen composition events | 39 | // Schedule the screen composition events |
| 39 | composition_event = | 40 | const auto ticks = Settings::values.force_30fps_mode ? frame_ticks_30fps : frame_ticks; |
| 40 | core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, s64 cycles_late) { | 41 | |
| 42 | composition_event = core_timing.RegisterEvent( | ||
| 43 | "ScreenComposition", [this, ticks](u64 userdata, s64 cycles_late) { | ||
| 41 | Compose(); | 44 | Compose(); |
| 42 | this->core_timing.ScheduleEvent(frame_ticks - cycles_late, composition_event); | 45 | this->core_timing.ScheduleEvent(ticks - cycles_late, composition_event); |
| 43 | }); | 46 | }); |
| 44 | 47 | ||
| 45 | core_timing.ScheduleEvent(frame_ticks, composition_event); | 48 | core_timing.ScheduleEvent(ticks, composition_event); |
| 46 | } | 49 | } |
| 47 | 50 | ||
| 48 | NVFlinger::~NVFlinger() { | 51 | NVFlinger::~NVFlinger() { |
| @@ -62,6 +65,7 @@ std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { | |||
| 62 | const auto itr = | 65 | const auto itr = |
| 63 | std::find_if(displays.begin(), displays.end(), | 66 | std::find_if(displays.begin(), displays.end(), |
| 64 | [&](const VI::Display& display) { return display.GetName() == name; }); | 67 | [&](const VI::Display& display) { return display.GetName() == name; }); |
| 68 | |||
| 65 | if (itr == displays.end()) { | 69 | if (itr == displays.end()) { |
| 66 | return {}; | 70 | return {}; |
| 67 | } | 71 | } |
diff --git a/src/core/settings.h b/src/core/settings.h index d543eb32f..b84390745 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -393,6 +393,7 @@ struct Values { | |||
| 393 | bool use_disk_shader_cache; | 393 | bool use_disk_shader_cache; |
| 394 | bool use_accurate_gpu_emulation; | 394 | bool use_accurate_gpu_emulation; |
| 395 | bool use_asynchronous_gpu_emulation; | 395 | bool use_asynchronous_gpu_emulation; |
| 396 | bool force_30fps_mode; | ||
| 396 | 397 | ||
| 397 | float bg_red; | 398 | float bg_red; |
| 398 | float bg_green; | 399 | float bg_green; |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index ca60bc0c9..8725a78dc 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -394,6 +394,7 @@ void Config::ReadValues() { | |||
| 394 | ReadSetting("use_accurate_gpu_emulation", false).toBool(); | 394 | ReadSetting("use_accurate_gpu_emulation", false).toBool(); |
| 395 | Settings::values.use_asynchronous_gpu_emulation = | 395 | Settings::values.use_asynchronous_gpu_emulation = |
| 396 | ReadSetting("use_asynchronous_gpu_emulation", false).toBool(); | 396 | ReadSetting("use_asynchronous_gpu_emulation", false).toBool(); |
| 397 | Settings::values.force_30fps_mode = ReadSetting("force_30fps_mode", false).toBool(); | ||
| 397 | 398 | ||
| 398 | Settings::values.bg_red = ReadSetting("bg_red", 0.0).toFloat(); | 399 | Settings::values.bg_red = ReadSetting("bg_red", 0.0).toFloat(); |
| 399 | Settings::values.bg_green = ReadSetting("bg_green", 0.0).toFloat(); | 400 | Settings::values.bg_green = ReadSetting("bg_green", 0.0).toFloat(); |
| @@ -664,6 +665,7 @@ void Config::SaveValues() { | |||
| 664 | WriteSetting("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation, false); | 665 | WriteSetting("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation, false); |
| 665 | WriteSetting("use_asynchronous_gpu_emulation", Settings::values.use_asynchronous_gpu_emulation, | 666 | WriteSetting("use_asynchronous_gpu_emulation", Settings::values.use_asynchronous_gpu_emulation, |
| 666 | false); | 667 | false); |
| 668 | WriteSetting("force_30fps_mode", Settings::values.force_30fps_mode, false); | ||
| 667 | 669 | ||
| 668 | // Cast to double because Qt's written float values are not human-readable | 670 | // Cast to double because Qt's written float values are not human-readable |
| 669 | WriteSetting("bg_red", (double)Settings::values.bg_red, 0.0); | 671 | WriteSetting("bg_red", (double)Settings::values.bg_red, 0.0); |
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index dd1d67488..0a9883d37 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp | |||
| @@ -77,6 +77,8 @@ void ConfigureGraphics::setConfiguration() { | |||
| 77 | ui->use_accurate_gpu_emulation->setChecked(Settings::values.use_accurate_gpu_emulation); | 77 | ui->use_accurate_gpu_emulation->setChecked(Settings::values.use_accurate_gpu_emulation); |
| 78 | ui->use_asynchronous_gpu_emulation->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | 78 | ui->use_asynchronous_gpu_emulation->setEnabled(!Core::System::GetInstance().IsPoweredOn()); |
| 79 | ui->use_asynchronous_gpu_emulation->setChecked(Settings::values.use_asynchronous_gpu_emulation); | 79 | ui->use_asynchronous_gpu_emulation->setChecked(Settings::values.use_asynchronous_gpu_emulation); |
| 80 | ui->force_30fps_mode->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||
| 81 | ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode); | ||
| 80 | UpdateBackgroundColorButton(QColor::fromRgbF(Settings::values.bg_red, Settings::values.bg_green, | 82 | UpdateBackgroundColorButton(QColor::fromRgbF(Settings::values.bg_red, Settings::values.bg_green, |
| 81 | Settings::values.bg_blue)); | 83 | Settings::values.bg_blue)); |
| 82 | } | 84 | } |
| @@ -90,6 +92,7 @@ void ConfigureGraphics::applyConfiguration() { | |||
| 90 | Settings::values.use_accurate_gpu_emulation = ui->use_accurate_gpu_emulation->isChecked(); | 92 | Settings::values.use_accurate_gpu_emulation = ui->use_accurate_gpu_emulation->isChecked(); |
| 91 | Settings::values.use_asynchronous_gpu_emulation = | 93 | Settings::values.use_asynchronous_gpu_emulation = |
| 92 | ui->use_asynchronous_gpu_emulation->isChecked(); | 94 | ui->use_asynchronous_gpu_emulation->isChecked(); |
| 95 | Settings::values.force_30fps_mode = ui->force_30fps_mode->isChecked(); | ||
| 93 | Settings::values.bg_red = static_cast<float>(bg_color.redF()); | 96 | Settings::values.bg_red = static_cast<float>(bg_color.redF()); |
| 94 | Settings::values.bg_green = static_cast<float>(bg_color.greenF()); | 97 | Settings::values.bg_green = static_cast<float>(bg_color.greenF()); |
| 95 | Settings::values.bg_blue = static_cast<float>(bg_color.blueF()); | 98 | Settings::values.bg_blue = static_cast<float>(bg_color.blueF()); |
diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui index c6767e0ca..15ab18ecd 100644 --- a/src/yuzu/configuration/configure_graphics.ui +++ b/src/yuzu/configuration/configure_graphics.ui | |||
| @@ -71,6 +71,13 @@ | |||
| 71 | </widget> | 71 | </widget> |
| 72 | </item> | 72 | </item> |
| 73 | <item> | 73 | <item> |
| 74 | <widget class="QCheckBox" name="force_30fps_mode"> | ||
| 75 | <property name="text"> | ||
| 76 | <string>Force 30 FPS mode</string> | ||
| 77 | </property> | ||
| 78 | </widget> | ||
| 79 | </item> | ||
| 80 | <item> | ||
| 74 | <layout class="QHBoxLayout" name="horizontalLayout"> | 81 | <layout class="QHBoxLayout" name="horizontalLayout"> |
| 75 | <item> | 82 | <item> |
| 76 | <widget class="QLabel" name="label"> | 83 | <widget class="QLabel" name="label"> |