summaryrefslogtreecommitdiff
path: root/src/yuzu
diff options
context:
space:
mode:
Diffstat (limited to 'src/yuzu')
-rw-r--r--src/yuzu/applets/profile_select.cpp7
-rw-r--r--src/yuzu/applets/software_keyboard.cpp18
-rw-r--r--src/yuzu/applets/web_browser.cpp6
-rw-r--r--src/yuzu/bootmanager.cpp17
-rw-r--r--src/yuzu/bootmanager.h2
-rw-r--r--src/yuzu/compatdb.cpp6
-rw-r--r--src/yuzu/configuration/config.cpp444
-rw-r--r--src/yuzu/configuration/config.h5
-rw-r--r--src/yuzu/configuration/configure_general.cpp2
-rw-r--r--src/yuzu/configuration/configure_general.ui20
-rw-r--r--src/yuzu/configuration/configure_graphics.cpp4
-rw-r--r--src/yuzu/configuration/configure_graphics.ui7
-rw-r--r--src/yuzu/debugger/graphics/graphics_surface.cpp9
-rw-r--r--src/yuzu/debugger/graphics/graphics_surface.h2
-rw-r--r--src/yuzu/debugger/profiler.cpp1
-rw-r--r--src/yuzu/debugger/profiler.h9
-rw-r--r--src/yuzu/debugger/wait_tree.cpp12
-rw-r--r--src/yuzu/debugger/wait_tree.h3
-rw-r--r--src/yuzu/main.cpp20
19 files changed, 326 insertions, 268 deletions
diff --git a/src/yuzu/applets/profile_select.cpp b/src/yuzu/applets/profile_select.cpp
index 5c1b65a2c..f95f7fe3c 100644
--- a/src/yuzu/applets/profile_select.cpp
+++ b/src/yuzu/applets/profile_select.cpp
@@ -58,10 +58,7 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(QWidget* parent)
scroll_area = new QScrollArea;
- buttons = new QDialogButtonBox;
- buttons->addButton(tr("Cancel"), QDialogButtonBox::RejectRole);
- buttons->addButton(tr("OK"), QDialogButtonBox::AcceptRole);
-
+ buttons = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
connect(buttons, &QDialogButtonBox::accepted, this, &QtProfileSelectionDialog::accept);
connect(buttons, &QDialogButtonBox::rejected, this, &QtProfileSelectionDialog::reject);
@@ -163,6 +160,6 @@ void QtProfileSelector::SelectProfile(
void QtProfileSelector::MainWindowFinishedSelection(std::optional<Service::Account::UUID> uuid) {
// Acquire the HLE mutex
- std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ std::lock_guard lock{HLE::g_hle_lock};
callback(uuid);
}
diff --git a/src/yuzu/applets/software_keyboard.cpp b/src/yuzu/applets/software_keyboard.cpp
index 8a26fdff1..f3eb29b25 100644
--- a/src/yuzu/applets/software_keyboard.cpp
+++ b/src/yuzu/applets/software_keyboard.cpp
@@ -75,13 +75,13 @@ QtSoftwareKeyboardDialog::QtSoftwareKeyboardDialog(
length_label->setText(QStringLiteral("%1/%2").arg(text.size()).arg(parameters.max_length));
});
- buttons = new QDialogButtonBox;
- buttons->addButton(tr("Cancel"), QDialogButtonBox::RejectRole);
- buttons->addButton(parameters.submit_text.empty()
- ? tr("OK")
- : QString::fromStdU16String(parameters.submit_text),
- QDialogButtonBox::AcceptRole);
-
+ buttons = new QDialogButtonBox(QDialogButtonBox::Cancel);
+ if (parameters.submit_text.empty()) {
+ buttons->addButton(QDialogButtonBox::Ok);
+ } else {
+ buttons->addButton(QString::fromStdU16String(parameters.submit_text),
+ QDialogButtonBox::AcceptRole);
+ }
connect(buttons, &QDialogButtonBox::accepted, this, &QtSoftwareKeyboardDialog::accept);
connect(buttons, &QDialogButtonBox::rejected, this, &QtSoftwareKeyboardDialog::reject);
layout->addWidget(header_label);
@@ -141,12 +141,12 @@ void QtSoftwareKeyboard::SendTextCheckDialog(std::u16string error_message,
void QtSoftwareKeyboard::MainWindowFinishedText(std::optional<std::u16string> text) {
// Acquire the HLE mutex
- std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ std::lock_guard lock{HLE::g_hle_lock};
text_output(text);
}
void QtSoftwareKeyboard::MainWindowFinishedCheckDialog() {
// Acquire the HLE mutex
- std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ std::lock_guard lock{HLE::g_hle_lock};
finished_check();
}
diff --git a/src/yuzu/applets/web_browser.cpp b/src/yuzu/applets/web_browser.cpp
index 6a9138d53..ac80b2fa2 100644
--- a/src/yuzu/applets/web_browser.cpp
+++ b/src/yuzu/applets/web_browser.cpp
@@ -56,6 +56,8 @@ constexpr char NX_SHIM_INJECT_SCRIPT[] = R"(
window.nx.endApplet = function() {
applet_done = true;
};
+
+ window.onkeypress = function(e) { if (e.keyCode === 13) { applet_done = true; } };
)";
QString GetNXShimInjectionScript() {
@@ -102,12 +104,12 @@ void QtWebBrowser::OpenPage(std::string_view url, std::function<void()> unpack_r
void QtWebBrowser::MainWindowUnpackRomFS() {
// Acquire the HLE mutex
- std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ std::lock_guard lock{HLE::g_hle_lock};
unpack_romfs_callback();
}
void QtWebBrowser::MainWindowFinishedBrowsing() {
// Acquire the HLE mutex
- std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+ std::lock_guard lock{HLE::g_hle_lock};
finished_callback();
}
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 73b04b749..7438fbc0a 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -20,15 +20,10 @@
EmuThread::EmuThread(GRenderWindow* render_window) : render_window(render_window) {}
void EmuThread::run() {
- if (!Settings::values.use_multi_core) {
- // Single core mode must acquire OpenGL context for entire emulation session
- render_window->MakeCurrent();
- }
+ render_window->MakeCurrent();
MicroProfileOnThreadCreate("EmuThread");
- stop_run = false;
-
emit LoadProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0);
Core::System::GetInstance().Renderer().Rasterizer().LoadDiskResources(
@@ -38,7 +33,12 @@ void EmuThread::run() {
emit LoadProgress(VideoCore::LoadCallbackStage::Complete, 0, 0);
- // holds whether the cpu was running during the last iteration,
+ if (Settings::values.use_asynchronous_gpu_emulation) {
+ // Release OpenGL context for the GPU thread
+ render_window->DoneCurrent();
+ }
+
+ // Holds whether the cpu was running during the last iteration,
// so that the DebugModeLeft signal can be emitted before the
// next execution step
bool was_active = false;
@@ -67,7 +67,7 @@ void EmuThread::run() {
was_active = false;
} else {
- std::unique_lock<std::mutex> lock(running_mutex);
+ std::unique_lock lock{running_mutex};
running_cv.wait(lock, [this] { return IsRunning() || exec_step || stop_run; });
}
}
@@ -121,7 +121,6 @@ GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread)
setAttribute(Qt::WA_AcceptTouchEvents);
InputCommon::Init();
- InputCommon::StartJoystickEventHandler();
connect(this, &GRenderWindow::FirstFrameDisplayed, static_cast<GMainWindow*>(parent),
&GMainWindow::OnLoadComplete);
}
diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h
index 7226e690e..3183621bc 100644
--- a/src/yuzu/bootmanager.h
+++ b/src/yuzu/bootmanager.h
@@ -53,7 +53,7 @@ public:
* @note This function is thread-safe
*/
void SetRunning(bool running) {
- std::unique_lock<std::mutex> lock(running_mutex);
+ std::unique_lock lock{running_mutex};
this->running = running;
lock.unlock();
running_cv.notify_all();
diff --git a/src/yuzu/compatdb.cpp b/src/yuzu/compatdb.cpp
index 5f0896f84..c8b0a5ec0 100644
--- a/src/yuzu/compatdb.cpp
+++ b/src/yuzu/compatdb.cpp
@@ -53,15 +53,15 @@ void CompatDB::Submit() {
case CompatDBPage::Final:
back();
LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId());
- Core::Telemetry().AddField(Telemetry::FieldType::UserFeedback, "Compatibility",
- compatibility->checkedId());
+ Core::System::GetInstance().TelemetrySession().AddField(
+ Telemetry::FieldType::UserFeedback, "Compatibility", compatibility->checkedId());
button(NextButton)->setEnabled(false);
button(NextButton)->setText(tr("Submitting"));
button(QWizard::CancelButton)->setVisible(false);
testcase_watcher.setFuture(QtConcurrent::run(
- [this]() { return Core::System::GetInstance().TelemetrySession().SubmitTestcase(); }));
+ [] { return Core::System::GetInstance().TelemetrySession().SubmitTestcase(); }));
break;
default:
LOG_ERROR(Frontend, "Unexpected page: {}", currentId());
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index e9546dadf..dead9f807 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -209,7 +209,7 @@ void Config::ReadPlayerValues() {
for (std::size_t p = 0; p < Settings::values.players.size(); ++p) {
auto& player = Settings::values.players[p];
- player.connected = qt_config->value(QString("player_%1_connected").arg(p), false).toBool();
+ player.connected = ReadSetting(QString("player_%1_connected").arg(p), false).toBool();
player.type = static_cast<Settings::ControllerType>(
qt_config
@@ -269,7 +269,7 @@ void Config::ReadPlayerValues() {
}
void Config::ReadDebugValues() {
- Settings::values.debug_pad_enabled = qt_config->value("debug_pad_enabled", false).toBool();
+ Settings::values.debug_pad_enabled = ReadSetting("debug_pad_enabled", false).toBool();
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
Settings::values.debug_pad_buttons[i] =
@@ -298,7 +298,7 @@ void Config::ReadDebugValues() {
}
void Config::ReadKeyboardValues() {
- Settings::values.keyboard_enabled = qt_config->value("keyboard_enabled", false).toBool();
+ Settings::values.keyboard_enabled = ReadSetting("keyboard_enabled", false).toBool();
std::transform(default_keyboard_keys.begin(), default_keyboard_keys.end(),
Settings::values.keyboard_keys.begin(), InputCommon::GenerateKeyboardParam);
@@ -311,7 +311,7 @@ void Config::ReadKeyboardValues() {
}
void Config::ReadMouseValues() {
- Settings::values.mouse_enabled = qt_config->value("mouse_enabled", false).toBool();
+ Settings::values.mouse_enabled = ReadSetting("mouse_enabled", false).toBool();
for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
@@ -327,16 +327,14 @@ void Config::ReadMouseValues() {
}
void Config::ReadTouchscreenValues() {
- Settings::values.touchscreen.enabled = qt_config->value("touchscreen_enabled", true).toBool();
+ Settings::values.touchscreen.enabled = ReadSetting("touchscreen_enabled", true).toBool();
Settings::values.touchscreen.device =
- qt_config->value("touchscreen_device", "engine:emu_window").toString().toStdString();
-
- Settings::values.touchscreen.finger = qt_config->value("touchscreen_finger", 0).toUInt();
- Settings::values.touchscreen.rotation_angle = qt_config->value("touchscreen_angle", 0).toUInt();
- Settings::values.touchscreen.diameter_x =
- qt_config->value("touchscreen_diameter_x", 15).toUInt();
- Settings::values.touchscreen.diameter_y =
- qt_config->value("touchscreen_diameter_y", 15).toUInt();
+ ReadSetting("touchscreen_device", "engine:emu_window").toString().toStdString();
+
+ Settings::values.touchscreen.finger = ReadSetting("touchscreen_finger", 0).toUInt();
+ Settings::values.touchscreen.rotation_angle = ReadSetting("touchscreen_angle", 0).toUInt();
+ Settings::values.touchscreen.diameter_x = ReadSetting("touchscreen_diameter_x", 15).toUInt();
+ Settings::values.touchscreen.diameter_y = ReadSetting("touchscreen_diameter_y", 15).toUInt();
qt_config->endGroup();
}
@@ -357,40 +355,41 @@ void Config::ReadValues() {
ReadTouchscreenValues();
Settings::values.motion_device =
- qt_config->value("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01")
+ ReadSetting("motion_device", "engine:motion_emu,update_period:100,sensitivity:0.01")
.toString()
.toStdString();
qt_config->beginGroup("Core");
- Settings::values.use_cpu_jit = qt_config->value("use_cpu_jit", true).toBool();
- Settings::values.use_multi_core = qt_config->value("use_multi_core", false).toBool();
+ Settings::values.use_cpu_jit = ReadSetting("use_cpu_jit", true).toBool();
+ Settings::values.use_multi_core = ReadSetting("use_multi_core", false).toBool();
qt_config->endGroup();
qt_config->beginGroup("Renderer");
- Settings::values.resolution_factor = qt_config->value("resolution_factor", 1.0).toFloat();
- Settings::values.use_frame_limit = qt_config->value("use_frame_limit", true).toBool();
- Settings::values.frame_limit = qt_config->value("frame_limit", 100).toInt();
- Settings::values.use_disk_shader_cache =
- qt_config->value("use_disk_shader_cache", false).toBool();
+ Settings::values.resolution_factor = ReadSetting("resolution_factor", 1.0).toFloat();
+ Settings::values.use_frame_limit = ReadSetting("use_frame_limit", true).toBool();
+ Settings::values.frame_limit = ReadSetting("frame_limit", 100).toInt();
+ Settings::values.use_disk_shader_cache = ReadSetting("use_disk_shader_cache", true).toBool();
Settings::values.use_accurate_gpu_emulation =
- qt_config->value("use_accurate_gpu_emulation", false).toBool();
+ ReadSetting("use_accurate_gpu_emulation", false).toBool();
+ Settings::values.use_asynchronous_gpu_emulation =
+ ReadSetting("use_asynchronous_gpu_emulation", false).toBool();
- Settings::values.bg_red = qt_config->value("bg_red", 0.0).toFloat();
- Settings::values.bg_green = qt_config->value("bg_green", 0.0).toFloat();
- Settings::values.bg_blue = qt_config->value("bg_blue", 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_blue = ReadSetting("bg_blue", 0.0).toFloat();
qt_config->endGroup();
qt_config->beginGroup("Audio");
- Settings::values.sink_id = qt_config->value("output_engine", "auto").toString().toStdString();
+ Settings::values.sink_id = ReadSetting("output_engine", "auto").toString().toStdString();
Settings::values.enable_audio_stretching =
- qt_config->value("enable_audio_stretching", true).toBool();
+ ReadSetting("enable_audio_stretching", true).toBool();
Settings::values.audio_device_id =
- qt_config->value("output_device", "auto").toString().toStdString();
- Settings::values.volume = qt_config->value("volume", 1).toFloat();
+ ReadSetting("output_device", "auto").toString().toStdString();
+ Settings::values.volume = ReadSetting("volume", 1).toFloat();
qt_config->endGroup();
qt_config->beginGroup("Data Storage");
- Settings::values.use_virtual_sd = qt_config->value("use_virtual_sd", true).toBool();
+ Settings::values.use_virtual_sd = ReadSetting("use_virtual_sd", true).toBool();
FileUtil::GetUserPath(
FileUtil::UserPath::NANDDir,
qt_config
@@ -408,30 +407,29 @@ void Config::ReadValues() {
qt_config->endGroup();
qt_config->beginGroup("Core");
- Settings::values.use_cpu_jit = qt_config->value("use_cpu_jit", true).toBool();
- Settings::values.use_multi_core = qt_config->value("use_multi_core", false).toBool();
+ Settings::values.use_cpu_jit = ReadSetting("use_cpu_jit", true).toBool();
+ Settings::values.use_multi_core = ReadSetting("use_multi_core", false).toBool();
qt_config->endGroup();
qt_config->beginGroup("System");
- Settings::values.use_docked_mode = qt_config->value("use_docked_mode", false).toBool();
- Settings::values.enable_nfc = qt_config->value("enable_nfc", true).toBool();
+ Settings::values.use_docked_mode = ReadSetting("use_docked_mode", false).toBool();
- Settings::values.current_user = std::clamp<int>(qt_config->value("current_user", 0).toInt(), 0,
- Service::Account::MAX_USERS - 1);
+ Settings::values.current_user =
+ std::clamp<int>(ReadSetting("current_user", 0).toInt(), 0, Service::Account::MAX_USERS - 1);
- Settings::values.language_index = qt_config->value("language_index", 1).toInt();
+ Settings::values.language_index = ReadSetting("language_index", 1).toInt();
- const auto rng_seed_enabled = qt_config->value("rng_seed_enabled", false).toBool();
+ const auto rng_seed_enabled = ReadSetting("rng_seed_enabled", false).toBool();
if (rng_seed_enabled) {
- Settings::values.rng_seed = qt_config->value("rng_seed", 0).toULongLong();
+ Settings::values.rng_seed = ReadSetting("rng_seed", 0).toULongLong();
} else {
Settings::values.rng_seed = std::nullopt;
}
- const auto custom_rtc_enabled = qt_config->value("custom_rtc_enabled", false).toBool();
+ const auto custom_rtc_enabled = ReadSetting("custom_rtc_enabled", false).toBool();
if (custom_rtc_enabled) {
Settings::values.custom_rtc =
- std::chrono::seconds(qt_config->value("custom_rtc", 0).toULongLong());
+ std::chrono::seconds(ReadSetting("custom_rtc", 0).toULongLong());
} else {
Settings::values.custom_rtc = std::nullopt;
}
@@ -439,35 +437,35 @@ void Config::ReadValues() {
qt_config->endGroup();
qt_config->beginGroup("Miscellaneous");
- Settings::values.log_filter = qt_config->value("log_filter", "*:Info").toString().toStdString();
- Settings::values.use_dev_keys = qt_config->value("use_dev_keys", false).toBool();
+ Settings::values.log_filter = ReadSetting("log_filter", "*:Info").toString().toStdString();
+ Settings::values.use_dev_keys = ReadSetting("use_dev_keys", false).toBool();
qt_config->endGroup();
qt_config->beginGroup("Debugging");
- Settings::values.use_gdbstub = qt_config->value("use_gdbstub", false).toBool();
- Settings::values.gdbstub_port = qt_config->value("gdbstub_port", 24689).toInt();
- Settings::values.program_args = qt_config->value("program_args", "").toString().toStdString();
- Settings::values.dump_exefs = qt_config->value("dump_exefs", false).toBool();
- Settings::values.dump_nso = qt_config->value("dump_nso", false).toBool();
+ Settings::values.use_gdbstub = ReadSetting("use_gdbstub", false).toBool();
+ Settings::values.gdbstub_port = ReadSetting("gdbstub_port", 24689).toInt();
+ Settings::values.program_args = ReadSetting("program_args", "").toString().toStdString();
+ Settings::values.dump_exefs = ReadSetting("dump_exefs", false).toBool();
+ Settings::values.dump_nso = ReadSetting("dump_nso", false).toBool();
qt_config->endGroup();
qt_config->beginGroup("WebService");
- Settings::values.enable_telemetry = qt_config->value("enable_telemetry", true).toBool();
+ Settings::values.enable_telemetry = ReadSetting("enable_telemetry", true).toBool();
Settings::values.web_api_url =
- qt_config->value("web_api_url", "https://api.yuzu-emu.org").toString().toStdString();
- Settings::values.yuzu_username = qt_config->value("yuzu_username").toString().toStdString();
- Settings::values.yuzu_token = qt_config->value("yuzu_token").toString().toStdString();
+ ReadSetting("web_api_url", "https://api.yuzu-emu.org").toString().toStdString();
+ Settings::values.yuzu_username = ReadSetting("yuzu_username").toString().toStdString();
+ Settings::values.yuzu_token = ReadSetting("yuzu_token").toString().toStdString();
qt_config->endGroup();
const auto size = qt_config->beginReadArray("DisabledAddOns");
for (int i = 0; i < size; ++i) {
qt_config->setArrayIndex(i);
- const auto title_id = qt_config->value("title_id", 0).toULongLong();
+ const auto title_id = ReadSetting("title_id", 0).toULongLong();
std::vector<std::string> out;
const auto d_size = qt_config->beginReadArray("disabled");
for (int j = 0; j < d_size; ++j) {
qt_config->setArrayIndex(j);
- out.push_back(qt_config->value("d", "").toString().toStdString());
+ out.push_back(ReadSetting("d", "").toString().toStdString());
}
qt_config->endArray();
Settings::values.disabled_addons.insert_or_assign(title_id, out);
@@ -475,41 +473,38 @@ void Config::ReadValues() {
qt_config->endArray();
qt_config->beginGroup("UI");
- UISettings::values.theme = qt_config->value("theme", UISettings::themes[0].second).toString();
+ UISettings::values.theme = ReadSetting("theme", UISettings::themes[0].second).toString();
UISettings::values.enable_discord_presence =
- qt_config->value("enable_discord_presence", true).toBool();
+ ReadSetting("enable_discord_presence", true).toBool();
UISettings::values.screenshot_resolution_factor =
- static_cast<u16>(qt_config->value("screenshot_resolution_factor", 0).toUInt());
- UISettings::values.select_user_on_boot =
- qt_config->value("select_user_on_boot", false).toBool();
+ static_cast<u16>(ReadSetting("screenshot_resolution_factor", 0).toUInt());
+ UISettings::values.select_user_on_boot = ReadSetting("select_user_on_boot", false).toBool();
qt_config->beginGroup("UIGameList");
- UISettings::values.show_unknown = qt_config->value("show_unknown", true).toBool();
- UISettings::values.show_add_ons = qt_config->value("show_add_ons", true).toBool();
- UISettings::values.icon_size = qt_config->value("icon_size", 64).toUInt();
- UISettings::values.row_1_text_id = qt_config->value("row_1_text_id", 3).toUInt();
- UISettings::values.row_2_text_id = qt_config->value("row_2_text_id", 2).toUInt();
+ UISettings::values.show_unknown = ReadSetting("show_unknown", true).toBool();
+ UISettings::values.show_add_ons = ReadSetting("show_add_ons", true).toBool();
+ UISettings::values.icon_size = ReadSetting("icon_size", 64).toUInt();
+ UISettings::values.row_1_text_id = ReadSetting("row_1_text_id", 3).toUInt();
+ UISettings::values.row_2_text_id = ReadSetting("row_2_text_id", 2).toUInt();
qt_config->endGroup();
qt_config->beginGroup("UILayout");
- UISettings::values.geometry = qt_config->value("geometry").toByteArray();
- UISettings::values.state = qt_config->value("state").toByteArray();
- UISettings::values.renderwindow_geometry =
- qt_config->value("geometryRenderWindow").toByteArray();
- UISettings::values.gamelist_header_state =
- qt_config->value("gameListHeaderState").toByteArray();
+ UISettings::values.geometry = ReadSetting("geometry").toByteArray();
+ UISettings::values.state = ReadSetting("state").toByteArray();
+ UISettings::values.renderwindow_geometry = ReadSetting("geometryRenderWindow").toByteArray();
+ UISettings::values.gamelist_header_state = ReadSetting("gameListHeaderState").toByteArray();
UISettings::values.microprofile_geometry =
- qt_config->value("microProfileDialogGeometry").toByteArray();
+ ReadSetting("microProfileDialogGeometry").toByteArray();
UISettings::values.microprofile_visible =
- qt_config->value("microProfileDialogVisible", false).toBool();
+ ReadSetting("microProfileDialogVisible", false).toBool();
qt_config->endGroup();
qt_config->beginGroup("Paths");
- UISettings::values.roms_path = qt_config->value("romsPath").toString();
- UISettings::values.symbols_path = qt_config->value("symbolsPath").toString();
- UISettings::values.gamedir = qt_config->value("gameListRootDir", ".").toString();
- UISettings::values.gamedir_deepscan = qt_config->value("gameListDeepScan", false).toBool();
- UISettings::values.recent_files = qt_config->value("recentFiles").toStringList();
+ UISettings::values.roms_path = ReadSetting("romsPath").toString();
+ UISettings::values.symbols_path = ReadSetting("symbolsPath").toString();
+ UISettings::values.gamedir = ReadSetting("gameListRootDir", ".").toString();
+ UISettings::values.gamedir_deepscan = ReadSetting("gameListDeepScan", false).toBool();
+ UISettings::values.recent_files = ReadSetting("recentFiles").toStringList();
qt_config->endGroup();
qt_config->beginGroup("Shortcuts");
@@ -522,8 +517,8 @@ void Config::ReadValues() {
qt_config->beginGroup(hotkey);
UISettings::values.shortcuts.emplace_back(UISettings::Shortcut(
group + "/" + hotkey,
- UISettings::ContextualShortcut(qt_config->value("KeySeq").toString(),
- qt_config->value("Context").toInt())));
+ UISettings::ContextualShortcut(ReadSetting("KeySeq").toString(),
+ ReadSetting("Context").toInt())));
qt_config->endGroup();
}
@@ -531,16 +526,16 @@ void Config::ReadValues() {
}
qt_config->endGroup();
- UISettings::values.single_window_mode = qt_config->value("singleWindowMode", true).toBool();
- UISettings::values.fullscreen = qt_config->value("fullscreen", false).toBool();
- UISettings::values.display_titlebar = qt_config->value("displayTitleBars", true).toBool();
- UISettings::values.show_filter_bar = qt_config->value("showFilterBar", true).toBool();
- UISettings::values.show_status_bar = qt_config->value("showStatusBar", true).toBool();
- UISettings::values.confirm_before_closing = qt_config->value("confirmClose", true).toBool();
- UISettings::values.first_start = qt_config->value("firstStart", true).toBool();
- UISettings::values.callout_flags = qt_config->value("calloutFlags", 0).toUInt();
- UISettings::values.show_console = qt_config->value("showConsole", false).toBool();
- UISettings::values.profile_index = qt_config->value("profileIndex", 0).toUInt();
+ UISettings::values.single_window_mode = ReadSetting("singleWindowMode", true).toBool();
+ UISettings::values.fullscreen = ReadSetting("fullscreen", false).toBool();
+ UISettings::values.display_titlebar = ReadSetting("displayTitleBars", true).toBool();
+ UISettings::values.show_filter_bar = ReadSetting("showFilterBar", true).toBool();
+ UISettings::values.show_status_bar = ReadSetting("showStatusBar", true).toBool();
+ UISettings::values.confirm_before_closing = ReadSetting("confirmClose", true).toBool();
+ UISettings::values.first_start = ReadSetting("firstStart", true).toBool();
+ UISettings::values.callout_flags = ReadSetting("calloutFlags", 0).toUInt();
+ UISettings::values.show_console = ReadSetting("showConsole", false).toBool();
+ UISettings::values.profile_index = ReadSetting("profileIndex", 0).toUInt();
ApplyDefaultProfileIfInputInvalid();
@@ -551,62 +546,79 @@ void Config::SavePlayerValues() {
for (std::size_t p = 0; p < Settings::values.players.size(); ++p) {
const auto& player = Settings::values.players[p];
- qt_config->setValue(QString("player_%1_connected").arg(p), player.connected);
- qt_config->setValue(QString("player_%1_type").arg(p), static_cast<u8>(player.type));
+ WriteSetting(QString("player_%1_connected").arg(p), player.connected, false);
+ WriteSetting(QString("player_%1_type").arg(p), static_cast<u8>(player.type),
+ static_cast<u8>(Settings::ControllerType::DualJoycon));
- qt_config->setValue(QString("player_%1_body_color_left").arg(p), player.body_color_left);
- qt_config->setValue(QString("player_%1_body_color_right").arg(p), player.body_color_right);
- qt_config->setValue(QString("player_%1_button_color_left").arg(p),
- player.button_color_left);
- qt_config->setValue(QString("player_%1_button_color_right").arg(p),
- player.button_color_right);
+ WriteSetting(QString("player_%1_body_color_left").arg(p), player.body_color_left,
+ Settings::JOYCON_BODY_NEON_BLUE);
+ WriteSetting(QString("player_%1_body_color_right").arg(p), player.body_color_right,
+ Settings::JOYCON_BODY_NEON_RED);
+ WriteSetting(QString("player_%1_button_color_left").arg(p), player.button_color_left,
+ Settings::JOYCON_BUTTONS_NEON_BLUE);
+ WriteSetting(QString("player_%1_button_color_right").arg(p), player.button_color_right,
+ Settings::JOYCON_BUTTONS_NEON_RED);
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
- qt_config->setValue(QString("player_%1_").arg(p) +
- QString::fromStdString(Settings::NativeButton::mapping[i]),
- QString::fromStdString(player.buttons[i]));
+ std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
+ WriteSetting(QString("player_%1_").arg(p) +
+ QString::fromStdString(Settings::NativeButton::mapping[i]),
+ QString::fromStdString(player.buttons[i]),
+ QString::fromStdString(default_param));
}
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
- qt_config->setValue(QString("player_%1_").arg(p) +
- QString::fromStdString(Settings::NativeAnalog::mapping[i]),
- QString::fromStdString(player.analogs[i]));
+ std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
+ default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
+ default_analogs[i][3], default_analogs[i][4], 0.5f);
+ WriteSetting(QString("player_%1_").arg(p) +
+ QString::fromStdString(Settings::NativeAnalog::mapping[i]),
+ QString::fromStdString(player.analogs[i]),
+ QString::fromStdString(default_param));
}
}
}
void Config::SaveDebugValues() {
- qt_config->setValue("debug_pad_enabled", Settings::values.debug_pad_enabled);
+ WriteSetting("debug_pad_enabled", Settings::values.debug_pad_enabled, false);
for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) {
- qt_config->setValue(QString("debug_pad_") +
- QString::fromStdString(Settings::NativeButton::mapping[i]),
- QString::fromStdString(Settings::values.debug_pad_buttons[i]));
+ std::string default_param = InputCommon::GenerateKeyboardParam(default_buttons[i]);
+ WriteSetting(QString("debug_pad_") +
+ QString::fromStdString(Settings::NativeButton::mapping[i]),
+ QString::fromStdString(Settings::values.debug_pad_buttons[i]),
+ QString::fromStdString(default_param));
}
for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) {
- qt_config->setValue(QString("debug_pad_") +
- QString::fromStdString(Settings::NativeAnalog::mapping[i]),
- QString::fromStdString(Settings::values.debug_pad_analogs[i]));
+ std::string default_param = InputCommon::GenerateAnalogParamFromKeys(
+ default_analogs[i][0], default_analogs[i][1], default_analogs[i][2],
+ default_analogs[i][3], default_analogs[i][4], 0.5f);
+ WriteSetting(QString("debug_pad_") +
+ QString::fromStdString(Settings::NativeAnalog::mapping[i]),
+ QString::fromStdString(Settings::values.debug_pad_analogs[i]),
+ QString::fromStdString(default_param));
}
}
void Config::SaveMouseValues() {
- qt_config->setValue("mouse_enabled", Settings::values.mouse_enabled);
+ WriteSetting("mouse_enabled", Settings::values.mouse_enabled, false);
for (int i = 0; i < Settings::NativeMouseButton::NumMouseButtons; ++i) {
- qt_config->setValue(QString("mouse_") +
- QString::fromStdString(Settings::NativeMouseButton::mapping[i]),
- QString::fromStdString(Settings::values.mouse_buttons[i]));
+ std::string default_param = InputCommon::GenerateKeyboardParam(default_mouse_buttons[i]);
+ WriteSetting(QString("mouse_") +
+ QString::fromStdString(Settings::NativeMouseButton::mapping[i]),
+ QString::fromStdString(Settings::values.mouse_buttons[i]),
+ QString::fromStdString(default_param));
}
}
void Config::SaveTouchscreenValues() {
- qt_config->setValue("touchscreen_enabled", Settings::values.touchscreen.enabled);
- qt_config->setValue("touchscreen_device",
- QString::fromStdString(Settings::values.touchscreen.device));
-
- qt_config->setValue("touchscreen_finger", Settings::values.touchscreen.finger);
- qt_config->setValue("touchscreen_angle", Settings::values.touchscreen.rotation_angle);
- qt_config->setValue("touchscreen_diameter_x", Settings::values.touchscreen.diameter_x);
- qt_config->setValue("touchscreen_diameter_y", Settings::values.touchscreen.diameter_y);
+ WriteSetting("touchscreen_enabled", Settings::values.touchscreen.enabled, true);
+ WriteSetting("touchscreen_device", QString::fromStdString(Settings::values.touchscreen.device),
+ "engine:emu_window");
+
+ WriteSetting("touchscreen_finger", Settings::values.touchscreen.finger, 0);
+ WriteSetting("touchscreen_angle", Settings::values.touchscreen.rotation_angle, 0);
+ WriteSetting("touchscreen_diameter_x", Settings::values.touchscreen.diameter_x, 15);
+ WriteSetting("touchscreen_diameter_y", Settings::values.touchscreen.diameter_y, 15);
}
void Config::SaveValues() {
@@ -617,89 +629,95 @@ void Config::SaveValues() {
SaveMouseValues();
SaveTouchscreenValues();
- qt_config->setValue("motion_device", QString::fromStdString(Settings::values.motion_device));
- qt_config->setValue("keyboard_enabled", Settings::values.keyboard_enabled);
+ WriteSetting("motion_device", QString::fromStdString(Settings::values.motion_device),
+ "engine:motion_emu,update_period:100,sensitivity:0.01");
+ WriteSetting("keyboard_enabled", Settings::values.keyboard_enabled, false);
qt_config->endGroup();
qt_config->beginGroup("Core");
- qt_config->setValue("use_cpu_jit", Settings::values.use_cpu_jit);
- qt_config->setValue("use_multi_core", Settings::values.use_multi_core);
+ WriteSetting("use_cpu_jit", Settings::values.use_cpu_jit, true);
+ WriteSetting("use_multi_core", Settings::values.use_multi_core, false);
qt_config->endGroup();
qt_config->beginGroup("Renderer");
- qt_config->setValue("resolution_factor", (double)Settings::values.resolution_factor);
- qt_config->setValue("use_frame_limit", Settings::values.use_frame_limit);
- qt_config->setValue("frame_limit", Settings::values.frame_limit);
- qt_config->setValue("use_disk_shader_cache", Settings::values.use_disk_shader_cache);
- qt_config->setValue("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation);
+ WriteSetting("resolution_factor", (double)Settings::values.resolution_factor, 1.0);
+ WriteSetting("use_frame_limit", Settings::values.use_frame_limit, true);
+ WriteSetting("frame_limit", Settings::values.frame_limit, 100);
+ WriteSetting("use_disk_shader_cache", Settings::values.use_disk_shader_cache, true);
+ WriteSetting("use_accurate_gpu_emulation", Settings::values.use_accurate_gpu_emulation, false);
+ WriteSetting("use_asynchronous_gpu_emulation", Settings::values.use_asynchronous_gpu_emulation,
+ false);
// Cast to double because Qt's written float values are not human-readable
- qt_config->setValue("bg_red", (double)Settings::values.bg_red);
- qt_config->setValue("bg_green", (double)Settings::values.bg_green);
- qt_config->setValue("bg_blue", (double)Settings::values.bg_blue);
+ WriteSetting("bg_red", (double)Settings::values.bg_red, 0.0);
+ WriteSetting("bg_green", (double)Settings::values.bg_green, 0.0);
+ WriteSetting("bg_blue", (double)Settings::values.bg_blue, 0.0);
qt_config->endGroup();
qt_config->beginGroup("Audio");
- qt_config->setValue("output_engine", QString::fromStdString(Settings::values.sink_id));
- qt_config->setValue("enable_audio_stretching", Settings::values.enable_audio_stretching);
- qt_config->setValue("output_device", QString::fromStdString(Settings::values.audio_device_id));
- qt_config->setValue("volume", Settings::values.volume);
+ WriteSetting("output_engine", QString::fromStdString(Settings::values.sink_id), "auto");
+ WriteSetting("enable_audio_stretching", Settings::values.enable_audio_stretching, true);
+ WriteSetting("output_device", QString::fromStdString(Settings::values.audio_device_id), "auto");
+ WriteSetting("volume", Settings::values.volume, 1.0f);
qt_config->endGroup();
qt_config->beginGroup("Data Storage");
- qt_config->setValue("use_virtual_sd", Settings::values.use_virtual_sd);
- qt_config->setValue("nand_directory",
- QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)));
- qt_config->setValue("sdmc_directory",
- QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)));
+ WriteSetting("use_virtual_sd", Settings::values.use_virtual_sd, true);
+ WriteSetting("nand_directory",
+ QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)),
+ QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)));
+ WriteSetting("sdmc_directory",
+ QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)),
+ QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)));
qt_config->endGroup();
qt_config->beginGroup("System");
- qt_config->setValue("use_docked_mode", Settings::values.use_docked_mode);
- qt_config->setValue("enable_nfc", Settings::values.enable_nfc);
- qt_config->setValue("current_user", Settings::values.current_user);
- qt_config->setValue("language_index", Settings::values.language_index);
+ WriteSetting("use_docked_mode", Settings::values.use_docked_mode, false);
+ WriteSetting("current_user", Settings::values.current_user, 0);
+ WriteSetting("language_index", Settings::values.language_index, 1);
- qt_config->setValue("rng_seed_enabled", Settings::values.rng_seed.has_value());
- qt_config->setValue("rng_seed", Settings::values.rng_seed.value_or(0));
+ WriteSetting("rng_seed_enabled", Settings::values.rng_seed.has_value(), false);
+ WriteSetting("rng_seed", Settings::values.rng_seed.value_or(0), 0);
- qt_config->setValue("custom_rtc_enabled", Settings::values.custom_rtc.has_value());
- qt_config->setValue("custom_rtc",
- QVariant::fromValue<long long>(
- Settings::values.custom_rtc.value_or(std::chrono::seconds{}).count()));
+ WriteSetting("custom_rtc_enabled", Settings::values.custom_rtc.has_value(), false);
+ WriteSetting("custom_rtc",
+ QVariant::fromValue<long long>(
+ Settings::values.custom_rtc.value_or(std::chrono::seconds{}).count()),
+ 0);
qt_config->endGroup();
qt_config->beginGroup("Miscellaneous");
- qt_config->setValue("log_filter", QString::fromStdString(Settings::values.log_filter));
- qt_config->setValue("use_dev_keys", Settings::values.use_dev_keys);
+ WriteSetting("log_filter", QString::fromStdString(Settings::values.log_filter), "*:Info");
+ WriteSetting("use_dev_keys", Settings::values.use_dev_keys, false);
qt_config->endGroup();
qt_config->beginGroup("Debugging");
- qt_config->setValue("use_gdbstub", Settings::values.use_gdbstub);
- qt_config->setValue("gdbstub_port", Settings::values.gdbstub_port);
- qt_config->setValue("program_args", QString::fromStdString(Settings::values.program_args));
- qt_config->setValue("dump_exefs", Settings::values.dump_exefs);
- qt_config->setValue("dump_nso", Settings::values.dump_nso);
+ WriteSetting("use_gdbstub", Settings::values.use_gdbstub, false);
+ WriteSetting("gdbstub_port", Settings::values.gdbstub_port, 24689);
+ WriteSetting("program_args", QString::fromStdString(Settings::values.program_args), "");
+ WriteSetting("dump_exefs", Settings::values.dump_exefs, false);
+ WriteSetting("dump_nso", Settings::values.dump_nso, false);
qt_config->endGroup();
qt_config->beginGroup("WebService");
- qt_config->setValue("enable_telemetry", Settings::values.enable_telemetry);
- qt_config->setValue("web_api_url", QString::fromStdString(Settings::values.web_api_url));
- qt_config->setValue("yuzu_username", QString::fromStdString(Settings::values.yuzu_username));
- qt_config->setValue("yuzu_token", QString::fromStdString(Settings::values.yuzu_token));
+ WriteSetting("enable_telemetry", Settings::values.enable_telemetry, true);
+ WriteSetting("web_api_url", QString::fromStdString(Settings::values.web_api_url),
+ "https://api.yuzu-emu.org");
+ WriteSetting("yuzu_username", QString::fromStdString(Settings::values.yuzu_username));
+ WriteSetting("yuzu_token", QString::fromStdString(Settings::values.yuzu_token));
qt_config->endGroup();
qt_config->beginWriteArray("DisabledAddOns");
int i = 0;
for (const auto& elem : Settings::values.disabled_addons) {
qt_config->setArrayIndex(i);
- qt_config->setValue("title_id", QVariant::fromValue<u64>(elem.first));
+ WriteSetting("title_id", QVariant::fromValue<u64>(elem.first), 0);
qt_config->beginWriteArray("disabled");
for (std::size_t j = 0; j < elem.second.size(); ++j) {
qt_config->setArrayIndex(static_cast<int>(j));
- qt_config->setValue("d", QString::fromStdString(elem.second[j]));
+ WriteSetting("d", QString::fromStdString(elem.second[j]), "");
}
qt_config->endArray();
++i;
@@ -707,60 +725,86 @@ void Config::SaveValues() {
qt_config->endArray();
qt_config->beginGroup("UI");
- qt_config->setValue("theme", UISettings::values.theme);
- qt_config->setValue("enable_discord_presence", UISettings::values.enable_discord_presence);
- qt_config->setValue("screenshot_resolution_factor",
- UISettings::values.screenshot_resolution_factor);
- qt_config->setValue("select_user_on_boot", UISettings::values.select_user_on_boot);
+ WriteSetting("theme", UISettings::values.theme, UISettings::themes[0].second);
+ WriteSetting("enable_discord_presence", UISettings::values.enable_discord_presence, true);
+ WriteSetting("screenshot_resolution_factor", UISettings::values.screenshot_resolution_factor,
+ 0);
+ WriteSetting("select_user_on_boot", UISettings::values.select_user_on_boot, false);
qt_config->beginGroup("UIGameList");
- qt_config->setValue("show_unknown", UISettings::values.show_unknown);
- qt_config->setValue("show_add_ons", UISettings::values.show_add_ons);
- qt_config->setValue("icon_size", UISettings::values.icon_size);
- qt_config->setValue("row_1_text_id", UISettings::values.row_1_text_id);
- qt_config->setValue("row_2_text_id", UISettings::values.row_2_text_id);
+ WriteSetting("show_unknown", UISettings::values.show_unknown, true);
+ WriteSetting("show_add_ons", UISettings::values.show_add_ons, true);
+ WriteSetting("icon_size", UISettings::values.icon_size, 64);
+ WriteSetting("row_1_text_id", UISettings::values.row_1_text_id, 3);
+ WriteSetting("row_2_text_id", UISettings::values.row_2_text_id, 2);
qt_config->endGroup();
qt_config->beginGroup("UILayout");
- qt_config->setValue("geometry", UISettings::values.geometry);
- qt_config->setValue("state", UISettings::values.state);
- qt_config->setValue("geometryRenderWindow", UISettings::values.renderwindow_geometry);
- qt_config->setValue("gameListHeaderState", UISettings::values.gamelist_header_state);
- qt_config->setValue("microProfileDialogGeometry", UISettings::values.microprofile_geometry);
- qt_config->setValue("microProfileDialogVisible", UISettings::values.microprofile_visible);
+ WriteSetting("geometry", UISettings::values.geometry);
+ WriteSetting("state", UISettings::values.state);
+ WriteSetting("geometryRenderWindow", UISettings::values.renderwindow_geometry);
+ WriteSetting("gameListHeaderState", UISettings::values.gamelist_header_state);
+ WriteSetting("microProfileDialogGeometry", UISettings::values.microprofile_geometry);
+ WriteSetting("microProfileDialogVisible", UISettings::values.microprofile_visible, false);
qt_config->endGroup();
qt_config->beginGroup("Paths");
- qt_config->setValue("romsPath", UISettings::values.roms_path);
- qt_config->setValue("symbolsPath", UISettings::values.symbols_path);
- qt_config->setValue("screenshotPath", UISettings::values.screenshot_path);
- qt_config->setValue("gameListRootDir", UISettings::values.gamedir);
- qt_config->setValue("gameListDeepScan", UISettings::values.gamedir_deepscan);
- qt_config->setValue("recentFiles", UISettings::values.recent_files);
+ WriteSetting("romsPath", UISettings::values.roms_path);
+ WriteSetting("symbolsPath", UISettings::values.symbols_path);
+ WriteSetting("screenshotPath", UISettings::values.screenshot_path);
+ WriteSetting("gameListRootDir", UISettings::values.gamedir, ".");
+ WriteSetting("gameListDeepScan", UISettings::values.gamedir_deepscan, false);
+ WriteSetting("recentFiles", UISettings::values.recent_files);
qt_config->endGroup();
qt_config->beginGroup("Shortcuts");
for (auto shortcut : UISettings::values.shortcuts) {
- qt_config->setValue(shortcut.first + "/KeySeq", shortcut.second.first);
- qt_config->setValue(shortcut.first + "/Context", shortcut.second.second);
+ WriteSetting(shortcut.first + "/KeySeq", shortcut.second.first);
+ WriteSetting(shortcut.first + "/Context", shortcut.second.second);
}
qt_config->endGroup();
- qt_config->setValue("singleWindowMode", UISettings::values.single_window_mode);
- qt_config->setValue("fullscreen", UISettings::values.fullscreen);
- qt_config->setValue("displayTitleBars", UISettings::values.display_titlebar);
- qt_config->setValue("showFilterBar", UISettings::values.show_filter_bar);
- qt_config->setValue("showStatusBar", UISettings::values.show_status_bar);
- qt_config->setValue("confirmClose", UISettings::values.confirm_before_closing);
- qt_config->setValue("firstStart", UISettings::values.first_start);
- qt_config->setValue("calloutFlags", UISettings::values.callout_flags);
- qt_config->setValue("showConsole", UISettings::values.show_console);
- qt_config->setValue("profileIndex", UISettings::values.profile_index);
+ WriteSetting("singleWindowMode", UISettings::values.single_window_mode, true);
+ WriteSetting("fullscreen", UISettings::values.fullscreen, false);
+ WriteSetting("displayTitleBars", UISettings::values.display_titlebar, true);
+ WriteSetting("showFilterBar", UISettings::values.show_filter_bar, true);
+ WriteSetting("showStatusBar", UISettings::values.show_status_bar, true);
+ WriteSetting("confirmClose", UISettings::values.confirm_before_closing, true);
+ WriteSetting("firstStart", UISettings::values.first_start, true);
+ WriteSetting("calloutFlags", UISettings::values.callout_flags, 0);
+ WriteSetting("showConsole", UISettings::values.show_console, false);
+ WriteSetting("profileIndex", UISettings::values.profile_index, 0);
qt_config->endGroup();
}
+QVariant Config::ReadSetting(const QString& name) const {
+ return qt_config->value(name);
+}
+
+QVariant Config::ReadSetting(const QString& name, const QVariant& default_value) const {
+ QVariant result;
+ if (qt_config->value(name + "/default", false).toBool()) {
+ result = default_value;
+ } else {
+ result = qt_config->value(name, default_value);
+ }
+ return result;
+}
+
+void Config::WriteSetting(const QString& name, const QVariant& value) {
+ qt_config->setValue(name, value);
+}
+
+void Config::WriteSetting(const QString& name, const QVariant& value,
+ const QVariant& default_value) {
+ qt_config->setValue(name + "/default", value == default_value);
+ qt_config->setValue(name, value);
+}
+
void Config::Reload() {
ReadValues();
+ // To apply default value changes
+ SaveValues();
Settings::Apply();
}
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index e73ad19bb..f4185db18 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -42,6 +42,11 @@ private:
void SaveMouseValues();
void SaveTouchscreenValues();
+ QVariant ReadSetting(const QString& name) const;
+ QVariant ReadSetting(const QString& name, const QVariant& default_value) const;
+ void WriteSetting(const QString& name, const QVariant& value);
+ void WriteSetting(const QString& name, const QVariant& value, const QVariant& default_value);
+
std::unique_ptr<QSettings> qt_config;
std::string qt_config_loc;
};
diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp
index 4116b6cd7..389fcf667 100644
--- a/src/yuzu/configuration/configure_general.cpp
+++ b/src/yuzu/configuration/configure_general.cpp
@@ -33,7 +33,6 @@ void ConfigureGeneral::setConfiguration() {
ui->toggle_user_on_boot->setChecked(UISettings::values.select_user_on_boot);
ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme));
ui->use_cpu_jit->setChecked(Settings::values.use_cpu_jit);
- ui->enable_nfc->setChecked(Settings::values.enable_nfc);
}
void ConfigureGeneral::PopulateHotkeyList(const HotkeyRegistry& registry) {
@@ -48,5 +47,4 @@ void ConfigureGeneral::applyConfiguration() {
ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString();
Settings::values.use_cpu_jit = ui->use_cpu_jit->isChecked();
- Settings::values.enable_nfc = ui->enable_nfc->isChecked();
}
diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui
index dff0ad5d0..01d1c0b8e 100644
--- a/src/yuzu/configuration/configure_general.ui
+++ b/src/yuzu/configuration/configure_general.ui
@@ -71,26 +71,6 @@
</widget>
</item>
<item>
- <widget class="QGroupBox" name="EmulationGroupBox">
- <property name="title">
- <string>Emulation</string>
- </property>
- <layout class="QHBoxLayout" name="EmulationHorizontalLayout">
- <item>
- <layout class="QVBoxLayout" name="EmulationVerticalLayout">
- <item>
- <widget class="QCheckBox" name="enable_nfc">
- <property name="text">
- <string>Enable NFC</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- <item>
<widget class="QGroupBox" name="theme_group_box">
<property name="title">
<string>Theme</string>
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index 0f5dd534b..dd1d67488 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -75,6 +75,8 @@ void ConfigureGraphics::setConfiguration() {
ui->frame_limit->setValue(Settings::values.frame_limit);
ui->use_disk_shader_cache->setChecked(Settings::values.use_disk_shader_cache);
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->setChecked(Settings::values.use_asynchronous_gpu_emulation);
UpdateBackgroundColorButton(QColor::fromRgbF(Settings::values.bg_red, Settings::values.bg_green,
Settings::values.bg_blue));
}
@@ -86,6 +88,8 @@ void ConfigureGraphics::applyConfiguration() {
Settings::values.frame_limit = ui->frame_limit->value();
Settings::values.use_disk_shader_cache = ui->use_disk_shader_cache->isChecked();
Settings::values.use_accurate_gpu_emulation = ui->use_accurate_gpu_emulation->isChecked();
+ Settings::values.use_asynchronous_gpu_emulation =
+ ui->use_asynchronous_gpu_emulation->isChecked();
Settings::values.bg_red = static_cast<float>(bg_color.redF());
Settings::values.bg_green = static_cast<float>(bg_color.greenF());
Settings::values.bg_blue = static_cast<float>(bg_color.blueF());
diff --git a/src/yuzu/configuration/configure_graphics.ui b/src/yuzu/configuration/configure_graphics.ui
index 824f5810a..c6767e0ca 100644
--- a/src/yuzu/configuration/configure_graphics.ui
+++ b/src/yuzu/configuration/configure_graphics.ui
@@ -64,6 +64,13 @@
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="use_asynchronous_gpu_emulation">
+ <property name="text">
+ <string>Use asynchronous GPU emulation</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
diff --git a/src/yuzu/debugger/graphics/graphics_surface.cpp b/src/yuzu/debugger/graphics/graphics_surface.cpp
index 209798521..11023ed63 100644
--- a/src/yuzu/debugger/graphics/graphics_surface.cpp
+++ b/src/yuzu/debugger/graphics/graphics_surface.cpp
@@ -261,7 +261,7 @@ void GraphicsSurfaceWidget::OnSurfaceSourceChanged(int new_value) {
void GraphicsSurfaceWidget::OnSurfaceAddressChanged(qint64 new_value) {
if (surface_address != new_value) {
- surface_address = static_cast<Tegra::GPUVAddr>(new_value);
+ surface_address = static_cast<GPUVAddr>(new_value);
surface_source_list->setCurrentIndex(static_cast<int>(Source::Custom));
emit Update();
@@ -383,13 +383,12 @@ void GraphicsSurfaceWidget::OnUpdate() {
// TODO: Implement a good way to visualize alpha components!
QImage decoded_image(surface_width, surface_height, QImage::Format_ARGB32);
- std::optional<VAddr> address = gpu.MemoryManager().GpuToCpuAddress(surface_address);
// TODO(bunnei): Will not work with BCn formats that swizzle 4x4 tiles.
// Needs to be fixed if we plan to use this feature more, otherwise we may remove it.
auto unswizzled_data = Tegra::Texture::UnswizzleTexture(
- *address, 1, 1, Tegra::Texture::BytesPerPixel(surface_format), surface_width,
- surface_height, 1U);
+ gpu.MemoryManager().GetPointer(surface_address), 1, 1,
+ Tegra::Texture::BytesPerPixel(surface_format), surface_width, surface_height, 1U);
auto texture_data = Tegra::Texture::DecodeTexture(unswizzled_data, surface_format,
surface_width, surface_height);
@@ -398,7 +397,7 @@ void GraphicsSurfaceWidget::OnUpdate() {
for (unsigned int y = 0; y < surface_height; ++y) {
for (unsigned int x = 0; x < surface_width; ++x) {
- Math::Vec4<u8> color;
+ Common::Vec4<u8> color;
color[0] = texture_data[x + y * surface_width + 0];
color[1] = texture_data[x + y * surface_width + 1];
color[2] = texture_data[x + y * surface_width + 2];
diff --git a/src/yuzu/debugger/graphics/graphics_surface.h b/src/yuzu/debugger/graphics/graphics_surface.h
index 323e39d94..89445b18f 100644
--- a/src/yuzu/debugger/graphics/graphics_surface.h
+++ b/src/yuzu/debugger/graphics/graphics_surface.h
@@ -87,7 +87,7 @@ private:
QPushButton* save_surface;
Source surface_source;
- Tegra::GPUVAddr surface_address;
+ GPUVAddr surface_address;
unsigned surface_width;
unsigned surface_height;
Tegra::Texture::TextureFormat surface_format;
diff --git a/src/yuzu/debugger/profiler.cpp b/src/yuzu/debugger/profiler.cpp
index 8b30e0a85..86e03e46d 100644
--- a/src/yuzu/debugger/profiler.cpp
+++ b/src/yuzu/debugger/profiler.cpp
@@ -7,6 +7,7 @@
#include <QMouseEvent>
#include <QPainter>
#include <QString>
+#include <QTimer>
#include "common/common_types.h"
#include "common/microprofile.h"
#include "yuzu/debugger/profiler.h"
diff --git a/src/yuzu/debugger/profiler.h b/src/yuzu/debugger/profiler.h
index eae1e9e3c..8e69fdb06 100644
--- a/src/yuzu/debugger/profiler.h
+++ b/src/yuzu/debugger/profiler.h
@@ -4,10 +4,11 @@
#pragma once
-#include <QAbstractItemModel>
-#include <QDockWidget>
-#include <QTimer>
-#include "common/microprofile.h"
+#include <QWidget>
+
+class QAction;
+class QHideEvent;
+class QShowEvent;
class MicroProfileDialog : public QWidget {
Q_OBJECT
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp
index f50225d5f..593bb681f 100644
--- a/src/yuzu/debugger/wait_tree.cpp
+++ b/src/yuzu/debugger/wait_tree.cpp
@@ -81,9 +81,8 @@ QString WaitTreeText::GetText() const {
return text;
}
-WaitTreeMutexInfo::WaitTreeMutexInfo(VAddr mutex_address) : mutex_address(mutex_address) {
- const auto& handle_table = Core::CurrentProcess()->GetHandleTable();
-
+WaitTreeMutexInfo::WaitTreeMutexInfo(VAddr mutex_address, const Kernel::HandleTable& handle_table)
+ : mutex_address(mutex_address) {
mutex_value = Memory::Read32(mutex_address);
owner_handle = static_cast<Kernel::Handle>(mutex_value & Kernel::Mutex::MutexOwnerMask);
owner = handle_table.Get<Kernel::Thread>(owner_handle);
@@ -235,6 +234,9 @@ QString WaitTreeThread::GetText() const {
case Kernel::ThreadStatus::WaitMutex:
status = tr("waiting for mutex");
break;
+ case Kernel::ThreadStatus::WaitCondVar:
+ status = tr("waiting for condition variable");
+ break;
case Kernel::ThreadStatus::WaitArb:
status = tr("waiting for address arbiter");
break;
@@ -270,6 +272,7 @@ QColor WaitTreeThread::GetColor() const {
case Kernel::ThreadStatus::WaitSynchAll:
case Kernel::ThreadStatus::WaitSynchAny:
case Kernel::ThreadStatus::WaitMutex:
+ case Kernel::ThreadStatus::WaitCondVar:
case Kernel::ThreadStatus::WaitArb:
return QColor(Qt::GlobalColor::red);
case Kernel::ThreadStatus::Dormant:
@@ -316,7 +319,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {
const VAddr mutex_wait_address = thread.GetMutexWaitAddress();
if (mutex_wait_address != 0) {
- list.push_back(std::make_unique<WaitTreeMutexInfo>(mutex_wait_address));
+ const auto& handle_table = thread.GetOwnerProcess()->GetHandleTable();
+ list.push_back(std::make_unique<WaitTreeMutexInfo>(mutex_wait_address, handle_table));
} else {
list.push_back(std::make_unique<WaitTreeText>(tr("not waiting for mutex")));
}
diff --git a/src/yuzu/debugger/wait_tree.h b/src/yuzu/debugger/wait_tree.h
index 365c3dbfe..62886609d 100644
--- a/src/yuzu/debugger/wait_tree.h
+++ b/src/yuzu/debugger/wait_tree.h
@@ -17,6 +17,7 @@
class EmuThread;
namespace Kernel {
+class HandleTable;
class ReadableEvent;
class WaitObject;
class Thread;
@@ -72,7 +73,7 @@ public:
class WaitTreeMutexInfo : public WaitTreeExpandableItem {
Q_OBJECT
public:
- explicit WaitTreeMutexInfo(VAddr mutex_address);
+ explicit WaitTreeMutexInfo(VAddr mutex_address, const Kernel::HandleTable& handle_table);
~WaitTreeMutexInfo() override;
QString GetText() const override;
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index beba519b4..9efe626d0 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -11,6 +11,7 @@
#include "applets/profile_select.h"
#include "applets/software_keyboard.h"
#include "applets/web_browser.h"
+#include "configuration/configure_input.h"
#include "configuration/configure_per_general.h"
#include "core/file_sys/vfs.h"
#include "core/file_sys/vfs_real.h"
@@ -339,6 +340,11 @@ void GMainWindow::WebBrowserOpenPage(std::string_view filename, std::string_view
.arg(QString::fromStdString(std::to_string(key_code))));
};
+ QMessageBox::information(
+ this, tr("Exit"),
+ tr("To exit the web application, use the game provided controls to select exit, select the "
+ "'Exit Web Applet' option in the menu bar, or press the 'Enter' key."));
+
bool running_exit_check = false;
while (!finished) {
QApplication::processEvents();
@@ -522,6 +528,7 @@ void GMainWindow::InitializeHotkeys() {
Qt::ApplicationShortcut);
hotkey_registry.RegisterHotkey("Main Window", "Capture Screenshot",
QKeySequence(QKeySequence::Print));
+ hotkey_registry.RegisterHotkey("Main Window", "Change Docked Mode", QKeySequence(Qt::Key_F10));
hotkey_registry.LoadHotkeys();
@@ -561,7 +568,10 @@ void GMainWindow::InitializeHotkeys() {
Settings::values.use_frame_limit = !Settings::values.use_frame_limit;
UpdateStatusBar();
});
- constexpr u16 SPEED_LIMIT_STEP = 5;
+ // TODO: Remove this comment/static whenever the next major release of
+ // MSVC occurs and we make it a requirement (see:
+ // https://developercommunity.visualstudio.com/content/problem/93922/constexprs-are-trying-to-be-captured-in-lambda-fun.html)
+ static constexpr u16 SPEED_LIMIT_STEP = 5;
connect(hotkey_registry.GetHotkey("Main Window", "Increase Speed Limit", this),
&QShortcut::activated, this, [&] {
if (Settings::values.frame_limit < 9999 - SPEED_LIMIT_STEP) {
@@ -588,6 +598,12 @@ void GMainWindow::InitializeHotkeys() {
OnCaptureScreenshot();
}
});
+ connect(hotkey_registry.GetHotkey("Main Window", "Change Docked Mode", this),
+ &QShortcut::activated, this, [&] {
+ Settings::values.use_docked_mode = !Settings::values.use_docked_mode;
+ OnDockedModeChanged(!Settings::values.use_docked_mode,
+ Settings::values.use_docked_mode);
+ });
}
void GMainWindow::SetDefaultUIGeometry() {
@@ -848,7 +864,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
}
game_path = filename;
- Core::Telemetry().AddField(Telemetry::FieldType::App, "Frontend", "Qt");
+ system.TelemetrySession().AddField(Telemetry::FieldType::App, "Frontend", "Qt");
return true;
}