early-access version 1751
This commit is contained in:
parent
8aa580f023
commit
af925f1c1f
8 changed files with 131 additions and 4 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1750.
|
This is the source code for early-access 1751.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,14 @@ void Swizzle(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixe
|
||||||
const u32 unswizzled_offset =
|
const u32 unswizzled_offset =
|
||||||
slice * pitch * height + line * pitch + column * bytes_per_pixel;
|
slice * pitch * height + line * pitch + column * bytes_per_pixel;
|
||||||
|
|
||||||
|
if (const auto offset = (TO_LINEAR ? unswizzled_offset : swizzled_offset);
|
||||||
|
offset > input.size()) {
|
||||||
|
// TODO(Rodrigo): This is an out of bounds access that should never happen. To
|
||||||
|
// avoid crashing the emulator, continue.
|
||||||
|
ASSERT_MSG(false, "offset {} exceeds input size {}!", offset, input.size());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
u8* const dst = &output[TO_LINEAR ? swizzled_offset : unswizzled_offset];
|
u8* const dst = &output[TO_LINEAR ? swizzled_offset : unswizzled_offset];
|
||||||
const u8* const src = &input[TO_LINEAR ? unswizzled_offset : swizzled_offset];
|
const u8* const src = &input[TO_LINEAR ? unswizzled_offset : swizzled_offset];
|
||||||
std::memcpy(dst, src, bytes_per_pixel);
|
std::memcpy(dst, src, bytes_per_pixel);
|
||||||
|
|
|
@ -27,6 +27,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
|
||||||
|
|
||||||
ui->inputTab->Initialize(input_subsystem);
|
ui->inputTab->Initialize(input_subsystem);
|
||||||
|
|
||||||
|
ui->generalTab->SetResetCallback([&] { this->close(); });
|
||||||
|
|
||||||
SetConfiguration();
|
SetConfiguration();
|
||||||
PopulateSelectionList();
|
PopulateSelectionList();
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,15 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <utility>
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
|
#include <QMessageBox>
|
||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "ui_configure_general.h"
|
#include "ui_configure_general.h"
|
||||||
|
#include "yuzu/configuration/config.h"
|
||||||
#include "yuzu/configuration/configuration_shared.h"
|
#include "yuzu/configuration/configuration_shared.h"
|
||||||
#include "yuzu/configuration/configure_general.h"
|
#include "yuzu/configuration/configure_general.h"
|
||||||
#include "yuzu/uisettings.h"
|
#include "yuzu/uisettings.h"
|
||||||
|
@ -23,6 +27,9 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
||||||
connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit,
|
connect(ui->toggle_frame_limit, &QCheckBox::clicked, ui->frame_limit,
|
||||||
[this]() { ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked()); });
|
[this]() { ui->frame_limit->setEnabled(ui->toggle_frame_limit->isChecked()); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(ui->button_reset_defaults, &QPushButton::clicked, this,
|
||||||
|
&ConfigureGeneral::ResetDefaults);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureGeneral::~ConfigureGeneral() = default;
|
ConfigureGeneral::~ConfigureGeneral() = default;
|
||||||
|
@ -41,6 +48,8 @@ void ConfigureGeneral::SetConfiguration() {
|
||||||
ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue());
|
ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue());
|
||||||
ui->frame_limit->setValue(Settings::values.frame_limit.GetValue());
|
ui->frame_limit->setValue(Settings::values.frame_limit.GetValue());
|
||||||
|
|
||||||
|
ui->button_reset_defaults->setEnabled(runtime_lock);
|
||||||
|
|
||||||
if (Settings::IsConfiguringGlobal()) {
|
if (Settings::IsConfiguringGlobal()) {
|
||||||
ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue());
|
ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue());
|
||||||
} else {
|
} else {
|
||||||
|
@ -49,6 +58,25 @@ void ConfigureGeneral::SetConfiguration() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Called to set the callback when resetting settings to defaults
|
||||||
|
void ConfigureGeneral::SetResetCallback(std::function<void()> callback) {
|
||||||
|
reset_callback = std::move(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureGeneral::ResetDefaults() {
|
||||||
|
QMessageBox::StandardButton answer = QMessageBox::question(
|
||||||
|
this, tr("yuzu"),
|
||||||
|
tr("This reset all settings and remove all per-game configurations. This will not delete "
|
||||||
|
"game directories, profiles, or input profiles. Proceed?"),
|
||||||
|
QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
|
||||||
|
if (answer == QMessageBox::No) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
UISettings::values.reset_to_defaults = true;
|
||||||
|
UISettings::values.is_game_list_reload_pending.exchange(true);
|
||||||
|
reset_callback();
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigureGeneral::ApplyConfiguration() {
|
void ConfigureGeneral::ApplyConfiguration() {
|
||||||
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_multi_core, ui->use_multi_core,
|
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_multi_core, ui->use_multi_core,
|
||||||
use_multi_core);
|
use_multi_core);
|
||||||
|
@ -105,6 +133,8 @@ void ConfigureGeneral::SetupPerGameUI() {
|
||||||
ui->toggle_background_pause->setVisible(false);
|
ui->toggle_background_pause->setVisible(false);
|
||||||
ui->toggle_hide_mouse->setVisible(false);
|
ui->toggle_hide_mouse->setVisible(false);
|
||||||
|
|
||||||
|
ui->button_reset_defaults->setVisible(false);
|
||||||
|
|
||||||
ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit,
|
ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit,
|
||||||
Settings::values.use_frame_limit, use_frame_limit);
|
Settings::values.use_frame_limit, use_frame_limit);
|
||||||
ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core,
|
ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core,
|
||||||
|
|
|
@ -4,9 +4,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
|
class ConfigureDialog;
|
||||||
|
|
||||||
namespace ConfigurationShared {
|
namespace ConfigurationShared {
|
||||||
enum class CheckState;
|
enum class CheckState;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +27,8 @@ public:
|
||||||
explicit ConfigureGeneral(QWidget* parent = nullptr);
|
explicit ConfigureGeneral(QWidget* parent = nullptr);
|
||||||
~ConfigureGeneral() override;
|
~ConfigureGeneral() override;
|
||||||
|
|
||||||
|
void SetResetCallback(std::function<void()> callback);
|
||||||
|
void ResetDefaults();
|
||||||
void ApplyConfiguration();
|
void ApplyConfiguration();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -34,6 +39,8 @@ private:
|
||||||
|
|
||||||
void SetupPerGameUI();
|
void SetupPerGameUI();
|
||||||
|
|
||||||
|
std::function<void()> reset_callback;
|
||||||
|
|
||||||
std::unique_ptr<Ui::ConfigureGeneral> ui;
|
std::unique_ptr<Ui::ConfigureGeneral> ui;
|
||||||
|
|
||||||
ConfigurationShared::CheckState use_frame_limit;
|
ConfigurationShared::CheckState use_frame_limit;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>300</width>
|
<width>329</width>
|
||||||
<height>407</height>
|
<height>407</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
@ -104,6 +104,45 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="layout_reset">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_reset_defaults">
|
||||||
|
<property name="text">
|
||||||
|
<string>Reset All Settings</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="spacer_reset">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -2596,13 +2596,53 @@ void GMainWindow::OnConfigure() {
|
||||||
&GMainWindow::OnLanguageChanged);
|
&GMainWindow::OnLanguageChanged);
|
||||||
|
|
||||||
const auto result = configure_dialog.exec();
|
const auto result = configure_dialog.exec();
|
||||||
if (result != QDialog::Accepted && !UISettings::values.configuration_applied) {
|
if (result != QDialog::Accepted && !UISettings::values.configuration_applied &&
|
||||||
|
!UISettings::values.reset_to_defaults) {
|
||||||
|
// Runs if the user hit Cancel or closed the window, and did not ever press the Apply button
|
||||||
|
// or `Reset to Defaults` button
|
||||||
return;
|
return;
|
||||||
} else if (result == QDialog::Accepted) {
|
} else if (result == QDialog::Accepted) {
|
||||||
|
// Only apply new changes if user hit Okay
|
||||||
|
// This is here to avoid applying changes if the user hit Apply, made some changes, then hit
|
||||||
|
// Cancel
|
||||||
configure_dialog.ApplyConfiguration();
|
configure_dialog.ApplyConfiguration();
|
||||||
controller_dialog->refreshConfiguration();
|
} else if (UISettings::values.reset_to_defaults) {
|
||||||
|
LOG_INFO(Frontend, "Resetting all settings to defaults");
|
||||||
|
if (!Common::FS::RemoveFile(config->GetConfigFilePath())) {
|
||||||
|
LOG_WARNING(Frontend, "Failed to remove configuration file");
|
||||||
}
|
}
|
||||||
|
if (!Common::FS::RemoveDirContentsRecursively(
|
||||||
|
Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / "custom")) {
|
||||||
|
LOG_WARNING(Frontend, "Failed to remove custom configuration files");
|
||||||
|
}
|
||||||
|
if (!Common::FS::RemoveDirRecursively(
|
||||||
|
Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) / "game_list")) {
|
||||||
|
LOG_WARNING(Frontend, "Failed to remove game metadata cache files");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicitly save the game directories, since reinitializing config does not explicitly do
|
||||||
|
// so.
|
||||||
|
QVector<UISettings::GameDir> old_game_dirs = std::move(UISettings::values.game_dirs);
|
||||||
|
QVector<u64> old_favorited_ids = std::move(UISettings::values.favorited_ids);
|
||||||
|
|
||||||
|
Settings::values.disabled_addons.clear();
|
||||||
|
|
||||||
|
config = std::make_unique<Config>();
|
||||||
|
UISettings::values.reset_to_defaults = false;
|
||||||
|
|
||||||
|
UISettings::values.game_dirs = std::move(old_game_dirs);
|
||||||
|
UISettings::values.favorited_ids = std::move(old_favorited_ids);
|
||||||
|
|
||||||
|
InitializeRecentFileMenuActions();
|
||||||
|
|
||||||
|
SetDefaultUIGeometry();
|
||||||
|
RestoreUIState();
|
||||||
|
|
||||||
|
ShowTelemetryCallout();
|
||||||
|
}
|
||||||
|
controller_dialog->refreshConfiguration();
|
||||||
InitializeHotkeys();
|
InitializeHotkeys();
|
||||||
|
|
||||||
if (UISettings::values.theme != old_theme) {
|
if (UISettings::values.theme != old_theme) {
|
||||||
UpdateUITheme();
|
UpdateUITheme();
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,6 +97,7 @@ struct Values {
|
||||||
bool cache_game_list;
|
bool cache_game_list;
|
||||||
|
|
||||||
bool configuration_applied;
|
bool configuration_applied;
|
||||||
|
bool reset_to_defaults;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Values values;
|
extern Values values;
|
||||||
|
|
Loading…
Reference in a new issue