Merge pull request #2357 from zarroboogs/force-30fps-mode
Add a toggle to force 30FPS mode
This commit is contained in:
commit
6088898b02
5 changed files with 23 additions and 6 deletions
|
@ -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 a new issue