early-access version 1751

This commit is contained in:
pineappleEA 2021-06-04 10:40:16 +02:00
parent 8aa580f023
commit af925f1c1f
8 changed files with 131 additions and 4 deletions

View file

@ -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

View file

@ -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);

View file

@ -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();

View file

@ -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,

View file

@ -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;

View file

@ -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>

View file

@ -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();
} }

View file

@ -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;