mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #2357 from zarroboogs/force-30fps-mode
Add a toggle to force 30FPS mode
This commit is contained in:
		
						commit
						6088898b02
					
				| @ -21,12 +21,13 @@ | |||||||
| #include "core/hle/service/vi/display/vi_display.h" | #include "core/hle/service/vi/display/vi_display.h" | ||||||
| #include "core/hle/service/vi/layer/vi_layer.h" | #include "core/hle/service/vi/layer/vi_layer.h" | ||||||
| #include "core/perf_stats.h" | #include "core/perf_stats.h" | ||||||
|  | #include "core/settings.h" | ||||||
| #include "video_core/renderer_base.h" | #include "video_core/renderer_base.h" | ||||||
| 
 | 
 | ||||||
| namespace Service::NVFlinger { | namespace Service::NVFlinger { | ||||||
| 
 | 
 | ||||||
| constexpr std::size_t SCREEN_REFRESH_RATE = 60; | constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60); | ||||||
| constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / SCREEN_REFRESH_RATE); | constexpr s64 frame_ticks_30fps = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 30); | ||||||
| 
 | 
 | ||||||
| NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { | NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { | ||||||
|     displays.emplace_back(0, "Default"); |     displays.emplace_back(0, "Default"); | ||||||
| @ -36,13 +37,15 @@ NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_t | |||||||
|     displays.emplace_back(4, "Null"); |     displays.emplace_back(4, "Null"); | ||||||
| 
 | 
 | ||||||
|     // Schedule the screen composition events
 |     // Schedule the screen composition events
 | ||||||
|     composition_event = |     const auto ticks = Settings::values.force_30fps_mode ? frame_ticks_30fps : frame_ticks; | ||||||
|         core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, s64 cycles_late) { | 
 | ||||||
|  |     composition_event = core_timing.RegisterEvent( | ||||||
|  |         "ScreenComposition", [this, ticks](u64 userdata, s64 cycles_late) { | ||||||
|             Compose(); |             Compose(); | ||||||
|             this->core_timing.ScheduleEvent(frame_ticks - cycles_late, composition_event); |             this->core_timing.ScheduleEvent(ticks - cycles_late, composition_event); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|     core_timing.ScheduleEvent(frame_ticks, composition_event); |     core_timing.ScheduleEvent(ticks, composition_event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| NVFlinger::~NVFlinger() { | NVFlinger::~NVFlinger() { | ||||||
| @ -62,6 +65,7 @@ std::optional<u64> NVFlinger::OpenDisplay(std::string_view name) { | |||||||
|     const auto itr = |     const auto itr = | ||||||
|         std::find_if(displays.begin(), displays.end(), |         std::find_if(displays.begin(), displays.end(), | ||||||
|                      [&](const VI::Display& display) { return display.GetName() == name; }); |                      [&](const VI::Display& display) { return display.GetName() == name; }); | ||||||
|  | 
 | ||||||
|     if (itr == displays.end()) { |     if (itr == displays.end()) { | ||||||
|         return {}; |         return {}; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -393,6 +393,7 @@ struct Values { | |||||||
|     bool use_disk_shader_cache; |     bool use_disk_shader_cache; | ||||||
|     bool use_accurate_gpu_emulation; |     bool use_accurate_gpu_emulation; | ||||||
|     bool use_asynchronous_gpu_emulation; |     bool use_asynchronous_gpu_emulation; | ||||||
|  |     bool force_30fps_mode; | ||||||
| 
 | 
 | ||||||
|     float bg_red; |     float bg_red; | ||||||
|     float bg_green; |     float bg_green; | ||||||
|  | |||||||
| @ -394,6 +394,7 @@ void Config::ReadValues() { | |||||||
|         ReadSetting("use_accurate_gpu_emulation", false).toBool(); |         ReadSetting("use_accurate_gpu_emulation", false).toBool(); | ||||||
|     Settings::values.use_asynchronous_gpu_emulation = |     Settings::values.use_asynchronous_gpu_emulation = | ||||||
|         ReadSetting("use_asynchronous_gpu_emulation", false).toBool(); |         ReadSetting("use_asynchronous_gpu_emulation", false).toBool(); | ||||||
|  |     Settings::values.force_30fps_mode = ReadSetting("force_30fps_mode", false).toBool(); | ||||||
| 
 | 
 | ||||||
|     Settings::values.bg_red = ReadSetting("bg_red", 0.0).toFloat(); |     Settings::values.bg_red = ReadSetting("bg_red", 0.0).toFloat(); | ||||||
|     Settings::values.bg_green = ReadSetting("bg_green", 0.0).toFloat(); |     Settings::values.bg_green = ReadSetting("bg_green", 0.0).toFloat(); | ||||||
| @ -664,6 +665,7 @@ void Config::SaveValues() { | |||||||
|     WriteSetting("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation, false); |     WriteSetting("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation, false); | ||||||
|     WriteSetting("use_asynchronous_gpu_emulation", Settings::values.use_asynchronous_gpu_emulation, |     WriteSetting("use_asynchronous_gpu_emulation", Settings::values.use_asynchronous_gpu_emulation, | ||||||
|                  false); |                  false); | ||||||
|  |     WriteSetting("force_30fps_mode", Settings::values.force_30fps_mode, false); | ||||||
| 
 | 
 | ||||||
|     // Cast to double because Qt's written float values are not human-readable
 |     // Cast to double because Qt's written float values are not human-readable
 | ||||||
|     WriteSetting("bg_red", (double)Settings::values.bg_red, 0.0); |     WriteSetting("bg_red", (double)Settings::values.bg_red, 0.0); | ||||||
|  | |||||||
| @ -77,6 +77,8 @@ void ConfigureGraphics::setConfiguration() { | |||||||
|     ui->use_accurate_gpu_emulation->setChecked(Settings::values.use_accurate_gpu_emulation); |     ui->use_accurate_gpu_emulation->setChecked(Settings::values.use_accurate_gpu_emulation); | ||||||
|     ui->use_asynchronous_gpu_emulation->setEnabled(!Core::System::GetInstance().IsPoweredOn()); |     ui->use_asynchronous_gpu_emulation->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||||
|     ui->use_asynchronous_gpu_emulation->setChecked(Settings::values.use_asynchronous_gpu_emulation); |     ui->use_asynchronous_gpu_emulation->setChecked(Settings::values.use_asynchronous_gpu_emulation); | ||||||
|  |     ui->force_30fps_mode->setEnabled(!Core::System::GetInstance().IsPoweredOn()); | ||||||
|  |     ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode); | ||||||
|     UpdateBackgroundColorButton(QColor::fromRgbF(Settings::values.bg_red, Settings::values.bg_green, |     UpdateBackgroundColorButton(QColor::fromRgbF(Settings::values.bg_red, Settings::values.bg_green, | ||||||
|                                                  Settings::values.bg_blue)); |                                                  Settings::values.bg_blue)); | ||||||
| } | } | ||||||
| @ -90,6 +92,7 @@ void ConfigureGraphics::applyConfiguration() { | |||||||
|     Settings::values.use_accurate_gpu_emulation = ui->use_accurate_gpu_emulation->isChecked(); |     Settings::values.use_accurate_gpu_emulation = ui->use_accurate_gpu_emulation->isChecked(); | ||||||
|     Settings::values.use_asynchronous_gpu_emulation = |     Settings::values.use_asynchronous_gpu_emulation = | ||||||
|         ui->use_asynchronous_gpu_emulation->isChecked(); |         ui->use_asynchronous_gpu_emulation->isChecked(); | ||||||
|  |     Settings::values.force_30fps_mode = ui->force_30fps_mode->isChecked(); | ||||||
|     Settings::values.bg_red = static_cast<float>(bg_color.redF()); |     Settings::values.bg_red = static_cast<float>(bg_color.redF()); | ||||||
|     Settings::values.bg_green = static_cast<float>(bg_color.greenF()); |     Settings::values.bg_green = static_cast<float>(bg_color.greenF()); | ||||||
|     Settings::values.bg_blue = static_cast<float>(bg_color.blueF()); |     Settings::values.bg_blue = static_cast<float>(bg_color.blueF()); | ||||||
|  | |||||||
| @ -70,6 +70,13 @@ | |||||||
|           </property> |           </property> | ||||||
|          </widget> |          </widget> | ||||||
|         </item> |         </item> | ||||||
|  |         <item> | ||||||
|  |          <widget class="QCheckBox" name="force_30fps_mode"> | ||||||
|  |           <property name="text"> | ||||||
|  |            <string>Force 30 FPS mode</string> | ||||||
|  |           </property> | ||||||
|  |          </widget> | ||||||
|  |         </item> | ||||||
|         <item> |         <item> | ||||||
|          <layout class="QHBoxLayout" name="horizontalLayout"> |          <layout class="QHBoxLayout" name="horizontalLayout"> | ||||||
|           <item> |           <item> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei