System: Add 'Fast Forward Boot' option
This commit is contained in:
parent
b36e2ce6be
commit
29da7f7211
|
@ -3266,6 +3266,11 @@ void FullscreenUI::DrawBIOSSettingsPage()
|
||||||
DrawToggleSetting(bsi, FSUI_CSTR("Enable Fast Boot"),
|
DrawToggleSetting(bsi, FSUI_CSTR("Enable Fast Boot"),
|
||||||
FSUI_CSTR("Patches the BIOS to skip the boot animation. Safe to enable."), "BIOS", "PatchFastBoot",
|
FSUI_CSTR("Patches the BIOS to skip the boot animation. Safe to enable."), "BIOS", "PatchFastBoot",
|
||||||
Settings::DEFAULT_FAST_BOOT_VALUE);
|
Settings::DEFAULT_FAST_BOOT_VALUE);
|
||||||
|
DrawToggleSetting(bsi, FSUI_CSTR("Fast Forward Boot"),
|
||||||
|
FSUI_CSTR("Fast forwards through the early loading process when fast booting, saving time. Results "
|
||||||
|
"may vary between games."),
|
||||||
|
"BIOS", "FastForwardBoot", false,
|
||||||
|
GetEffectiveBoolSetting(bsi, "BIOS", "PatchFastBoot", Settings::DEFAULT_FAST_BOOT_VALUE));
|
||||||
DrawToggleSetting(bsi, FSUI_CSTR("Enable TTY Logging"),
|
DrawToggleSetting(bsi, FSUI_CSTR("Enable TTY Logging"),
|
||||||
FSUI_CSTR("Logs BIOS calls to printf(). Not all games contain debugging messages."), "BIOS",
|
FSUI_CSTR("Logs BIOS calls to printf(). Not all games contain debugging messages."), "BIOS",
|
||||||
"TTYLogging", false);
|
"TTYLogging", false);
|
||||||
|
@ -7399,8 +7404,10 @@ TRANSLATE_NOOP("FullscreenUI", "Failed to load '{}'.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Failed to load shader {}. It may be invalid.\nError was:");
|
TRANSLATE_NOOP("FullscreenUI", "Failed to load shader {}. It may be invalid.\nError was:");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Failed to save input profile '{}'.");
|
TRANSLATE_NOOP("FullscreenUI", "Failed to save input profile '{}'.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Fast Boot");
|
TRANSLATE_NOOP("FullscreenUI", "Fast Boot");
|
||||||
|
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Boot");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Speed");
|
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Speed");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Volume");
|
TRANSLATE_NOOP("FullscreenUI", "Fast Forward Volume");
|
||||||
|
TRANSLATE_NOOP("FullscreenUI", "Fast forwards through the early loading process when fast booting, saving time. Results may vary between games.");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "File Size");
|
TRANSLATE_NOOP("FullscreenUI", "File Size");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "File Size: %.2f MB");
|
TRANSLATE_NOOP("FullscreenUI", "File Size: %.2f MB");
|
||||||
TRANSLATE_NOOP("FullscreenUI", "File Title");
|
TRANSLATE_NOOP("FullscreenUI", "File Title");
|
||||||
|
|
|
@ -360,6 +360,7 @@ void Settings::Load(SettingsInterface& si, SettingsInterface& controller_si)
|
||||||
|
|
||||||
bios_tty_logging = si.GetBoolValue("BIOS", "TTYLogging", false);
|
bios_tty_logging = si.GetBoolValue("BIOS", "TTYLogging", false);
|
||||||
bios_patch_fast_boot = si.GetBoolValue("BIOS", "PatchFastBoot", DEFAULT_FAST_BOOT_VALUE);
|
bios_patch_fast_boot = si.GetBoolValue("BIOS", "PatchFastBoot", DEFAULT_FAST_BOOT_VALUE);
|
||||||
|
bios_fast_forward_boot = si.GetBoolValue("BIOS", "FastForwardBoot", false);
|
||||||
|
|
||||||
multitap_mode =
|
multitap_mode =
|
||||||
ParseMultitapModeName(
|
ParseMultitapModeName(
|
||||||
|
@ -618,6 +619,7 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const
|
||||||
|
|
||||||
si.SetBoolValue("BIOS", "TTYLogging", bios_tty_logging);
|
si.SetBoolValue("BIOS", "TTYLogging", bios_tty_logging);
|
||||||
si.SetBoolValue("BIOS", "PatchFastBoot", bios_patch_fast_boot);
|
si.SetBoolValue("BIOS", "PatchFastBoot", bios_patch_fast_boot);
|
||||||
|
si.SetBoolValue("BIOS", "FastForwardBoot", bios_fast_forward_boot);
|
||||||
|
|
||||||
for (u32 i = 0; i < NUM_CONTROLLER_AND_CARD_PORTS; i++)
|
for (u32 i = 0; i < NUM_CONTROLLER_AND_CARD_PORTS; i++)
|
||||||
{
|
{
|
||||||
|
@ -747,6 +749,9 @@ void Settings::FixIncompatibleSettings(bool display_osd_messages)
|
||||||
g_settings.bios_patch_fast_boot = false;
|
g_settings.bios_patch_fast_boot = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fast forward boot requires fast boot
|
||||||
|
g_settings.bios_fast_forward_boot = g_settings.bios_patch_fast_boot && g_settings.bios_fast_forward_boot;
|
||||||
|
|
||||||
if (g_settings.pcdrv_enable && g_settings.pcdrv_root.empty())
|
if (g_settings.pcdrv_enable && g_settings.pcdrv_root.empty())
|
||||||
{
|
{
|
||||||
Host::AddKeyedOSDMessage("pcdrv_disabled_no_root",
|
Host::AddKeyedOSDMessage("pcdrv_disabled_no_root",
|
||||||
|
|
|
@ -258,6 +258,7 @@ struct Settings
|
||||||
|
|
||||||
bool bios_tty_logging : 1 = false;
|
bool bios_tty_logging : 1 = false;
|
||||||
bool bios_patch_fast_boot : 1 = DEFAULT_FAST_BOOT_VALUE;
|
bool bios_patch_fast_boot : 1 = DEFAULT_FAST_BOOT_VALUE;
|
||||||
|
bool bios_fast_forward_boot : 1 = false;
|
||||||
bool enable_8mb_ram : 1 = false;
|
bool enable_8mb_ram : 1 = false;
|
||||||
|
|
||||||
std::array<ControllerType, NUM_CONTROLLER_AND_CARD_PORTS> controller_types{};
|
std::array<ControllerType, NUM_CONTROLLER_AND_CARD_PORTS> controller_types{};
|
||||||
|
|
|
@ -162,6 +162,12 @@ static bool CreateGPU(GPURenderer renderer, bool is_switching, Error* error);
|
||||||
static bool RecreateGPU(GPURenderer renderer, bool force_recreate_device = false, bool update_display = true);
|
static bool RecreateGPU(GPURenderer renderer, bool force_recreate_device = false, bool update_display = true);
|
||||||
static void HandleHostGPUDeviceLost();
|
static void HandleHostGPUDeviceLost();
|
||||||
|
|
||||||
|
/// Returns true if fast forwarding or slow motion is currently active.
|
||||||
|
static bool IsRunningAtNonStandardSpeed();
|
||||||
|
|
||||||
|
/// Returns true if boot is being fast forwarded.
|
||||||
|
static bool IsFastForwardingBoot();
|
||||||
|
|
||||||
/// Updates the throttle period, call when target emulation speed changes.
|
/// Updates the throttle period, call when target emulation speed changes.
|
||||||
static void UpdateThrottlePeriod();
|
static void UpdateThrottlePeriod();
|
||||||
static void ResetThrottler();
|
static void ResetThrottler();
|
||||||
|
@ -1497,6 +1503,10 @@ void System::ResetSystem()
|
||||||
if (Error error; !SetBootMode(new_boot_mode, &error))
|
if (Error error; !SetBootMode(new_boot_mode, &error))
|
||||||
ERROR_LOG("Failed to reload BIOS on boot mode change, the system may be unstable: {}", error.GetDescription());
|
ERROR_LOG("Failed to reload BIOS on boot mode change, the system may be unstable: {}", error.GetDescription());
|
||||||
|
|
||||||
|
// Have to turn on turbo if fast forwarding boot.
|
||||||
|
if (IsFastForwardingBoot())
|
||||||
|
UpdateSpeedLimiterState();
|
||||||
|
|
||||||
Host::AddIconOSDMessage("SystemReset", ICON_FA_POWER_OFF, TRANSLATE_STR("OSDMessage", "System reset."),
|
Host::AddIconOSDMessage("SystemReset", ICON_FA_POWER_OFF, TRANSLATE_STR("OSDMessage", "System reset."),
|
||||||
Host::OSD_QUICK_DURATION);
|
Host::OSD_QUICK_DURATION);
|
||||||
|
|
||||||
|
@ -1837,7 +1847,7 @@ bool System::Initialize(bool force_software_renderer, Error* error)
|
||||||
g_ticks_per_second = ScaleTicksToOverclock(MASTER_CLOCK);
|
g_ticks_per_second = ScaleTicksToOverclock(MASTER_CLOCK);
|
||||||
s_max_slice_ticks = ScaleTicksToOverclock(MASTER_CLOCK / 10);
|
s_max_slice_ticks = ScaleTicksToOverclock(MASTER_CLOCK / 10);
|
||||||
s_frame_number = 1;
|
s_frame_number = 1;
|
||||||
s_internal_frame_number = 1;
|
s_internal_frame_number = 0;
|
||||||
|
|
||||||
s_target_speed = g_settings.emulation_speed;
|
s_target_speed = g_settings.emulation_speed;
|
||||||
s_throttle_frequency = 60.0f;
|
s_throttle_frequency = 60.0f;
|
||||||
|
@ -2333,6 +2343,14 @@ void System::SingleStepCPU()
|
||||||
|
|
||||||
void System::IncrementInternalFrameNumber()
|
void System::IncrementInternalFrameNumber()
|
||||||
{
|
{
|
||||||
|
if (IsFastForwardingBoot()) [[unlikely]]
|
||||||
|
{
|
||||||
|
// Need to turn off present throttle.
|
||||||
|
s_internal_frame_number++;
|
||||||
|
UpdateSpeedLimiterState();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
s_internal_frame_number++;
|
s_internal_frame_number++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3368,9 +3386,11 @@ void System::UpdateSpeedLimiterState()
|
||||||
{
|
{
|
||||||
DebugAssert(IsValid());
|
DebugAssert(IsValid());
|
||||||
|
|
||||||
s_target_speed = s_turbo_enabled ?
|
s_target_speed =
|
||||||
g_settings.turbo_speed :
|
IsFastForwardingBoot() ?
|
||||||
(s_fast_forward_enabled ? g_settings.fast_forward_speed : g_settings.emulation_speed);
|
0.0f :
|
||||||
|
(s_turbo_enabled ? g_settings.turbo_speed :
|
||||||
|
(s_fast_forward_enabled ? g_settings.fast_forward_speed : g_settings.emulation_speed));
|
||||||
s_throttler_enabled = (s_target_speed != 0.0f);
|
s_throttler_enabled = (s_target_speed != 0.0f);
|
||||||
s_optimal_frame_pacing = (s_throttler_enabled && g_settings.display_optimal_frame_pacing);
|
s_optimal_frame_pacing = (s_throttler_enabled && g_settings.display_optimal_frame_pacing);
|
||||||
s_skip_presenting_duplicate_frames = s_throttler_enabled && g_settings.display_skip_presenting_duplicate_frames;
|
s_skip_presenting_duplicate_frames = s_throttler_enabled && g_settings.display_skip_presenting_duplicate_frames;
|
||||||
|
@ -5090,6 +5110,11 @@ bool System::IsRunningAtNonStandardSpeed()
|
||||||
return (s_target_speed != 1.0f && !s_syncing_to_host);
|
return (s_target_speed != 1.0f && !s_syncing_to_host);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool System::IsFastForwardingBoot()
|
||||||
|
{
|
||||||
|
return (g_settings.bios_fast_forward_boot && s_internal_frame_number == 0 && s_boot_mode == BootMode::FastBoot);
|
||||||
|
}
|
||||||
|
|
||||||
s32 System::GetAudioOutputVolume()
|
s32 System::GetAudioOutputVolume()
|
||||||
{
|
{
|
||||||
return g_settings.GetAudioOutputVolume(IsRunningAtNonStandardSpeed());
|
return g_settings.GetAudioOutputVolume(IsRunningAtNonStandardSpeed());
|
||||||
|
|
|
@ -430,9 +430,6 @@ void ApplyCheatCode(u32 index);
|
||||||
/// Toggle Widescreen Hack and Aspect Ratio
|
/// Toggle Widescreen Hack and Aspect Ratio
|
||||||
void ToggleWidescreen();
|
void ToggleWidescreen();
|
||||||
|
|
||||||
/// Returns true if fast forwarding or slow motion is currently active.
|
|
||||||
bool IsRunningAtNonStandardSpeed();
|
|
||||||
|
|
||||||
/// Returns true if vsync should be used.
|
/// Returns true if vsync should be used.
|
||||||
GPUVSyncMode GetEffectiveVSyncMode();
|
GPUVSyncMode GetEffectiveVSyncMode();
|
||||||
bool ShouldAllowPresentThrottle();
|
bool ShouldAllowPresentThrottle();
|
||||||
|
|
|
@ -21,6 +21,11 @@ BIOSSettingsWidget::BIOSSettingsWidget(SettingsWindow* dialog, QWidget* parent)
|
||||||
|
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableTTYLogging, "BIOS", "TTYLogging", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableTTYLogging, "BIOS", "TTYLogging", false);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fastBoot, "BIOS", "PatchFastBoot", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fastBoot, "BIOS", "PatchFastBoot", false);
|
||||||
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fastForwardBoot, "BIOS", "FastForwardBoot", false);
|
||||||
|
|
||||||
|
connect(m_ui.fastBoot, &QCheckBox::checkStateChanged, this, &BIOSSettingsWidget::onFastBootChanged);
|
||||||
|
|
||||||
|
onFastBootChanged();
|
||||||
|
|
||||||
dialog->registerWidgetHelp(m_ui.fastBoot, tr("Fast Boot"), tr("Unchecked"),
|
dialog->registerWidgetHelp(m_ui.fastBoot, tr("Fast Boot"), tr("Unchecked"),
|
||||||
tr("Patches the BIOS to skip the console's boot animation. Does not work with all games, "
|
tr("Patches the BIOS to skip the console's boot animation. Does not work with all games, "
|
||||||
|
@ -84,6 +89,14 @@ BIOSSettingsWidget::BIOSSettingsWidget(SettingsWindow* dialog, QWidget* parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshList();
|
refreshList();
|
||||||
|
|
||||||
|
m_dialog->registerWidgetHelp(m_ui.fastBoot, tr("Fast Boot"), tr("Unchecked"),
|
||||||
|
tr("Patches the BIOS to skip the boot animation. Safe to enable."));
|
||||||
|
m_dialog->registerWidgetHelp(m_ui.fastForwardBoot, tr("Fast Forward Boot"), tr("Unchecked"),
|
||||||
|
tr("Fast forwards through the early loading process when fast booting, saving time. "
|
||||||
|
"Results may vary between games."));
|
||||||
|
m_dialog->registerWidgetHelp(m_ui.enableTTYLogging, tr("Enable TTY Logging"), tr("Unchecked"),
|
||||||
|
tr("Logs BIOS calls to printf(). Not all games contain debugging messages."));
|
||||||
}
|
}
|
||||||
|
|
||||||
BIOSSettingsWidget::~BIOSSettingsWidget() = default;
|
BIOSSettingsWidget::~BIOSSettingsWidget() = default;
|
||||||
|
@ -103,6 +116,13 @@ void BIOSSettingsWidget::refreshList()
|
||||||
m_dialog->isPerGameSettings());
|
m_dialog->isPerGameSettings());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BIOSSettingsWidget::onFastBootChanged()
|
||||||
|
{
|
||||||
|
const bool fast_boot_enabled =
|
||||||
|
m_dialog->getEffectiveBoolValue("BIOS", "PatchFastBoot", Settings::DEFAULT_FAST_BOOT_VALUE);
|
||||||
|
m_ui.fastForwardBoot->setEnabled(fast_boot_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
void BIOSSettingsWidget::populateDropDownForRegion(ConsoleRegion region, QComboBox* cb,
|
void BIOSSettingsWidget::populateDropDownForRegion(ConsoleRegion region, QComboBox* cb,
|
||||||
std::vector<std::pair<std::string, const BIOS::ImageInfo*>>& images,
|
std::vector<std::pair<std::string, const BIOS::ImageInfo*>>& images,
|
||||||
bool per_game)
|
bool per_game)
|
||||||
|
|
|
@ -29,6 +29,7 @@ public:
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void refreshList();
|
void refreshList();
|
||||||
|
void onFastBootChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::BIOSSettingsWidget m_ui;
|
Ui::BIOSSettingsWidget m_ui;
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer">
|
<spacer name="horizontalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Orientation::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
|
@ -152,28 +152,35 @@
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Options and Patches</string>
|
<string>Options and Patches</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
<item>
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="fastBoot">
|
<widget class="QCheckBox" name="fastBoot">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Fast Boot</string>
|
<string>Fast Boot</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="enableTTYLogging">
|
<widget class="QCheckBox" name="enableTTYLogging">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Enable TTY Logging</string>
|
<string>Enable TTY Logging</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QCheckBox" name="fastForwardBoot">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fast Forward Boot</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Orientation::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
|
|
Loading…
Reference in New Issue