diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
index da606274eb..50143a449e 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
@@ -306,6 +306,7 @@ abstract class SettingsItem(
SingleChoiceSetting(
IntSetting.RENDERER_ACCURACY,
titleId = R.string.renderer_accuracy,
+ descriptionId = R.string.renderer_accuracy_description,
choicesId = R.array.rendererAccuracyNames,
valuesId = R.array.rendererAccuracyValues
)
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 117e7397e0..35f2489223 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -473,7 +473,8 @@
Advanced
- Accuracy level
+ GPU Mode
+ Controls the GPU emulation mode. Most games render fine with Fast or Balanced modes, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode.
DMA Accuracy
Controls the DMA precision accuracy. Safe precision can fix issues in some games, but it can also impact performance in some cases. If unsure, leave this on Default.
Anisotropic filtering
@@ -721,18 +722,12 @@
Save Data Directory
Set a custom path for save data storage
- Select Directory
- Choose an action for the save directory:
- Set Custom Path
Reset to Default
Migrate Save Data
Do you want to migrate existing save data to the new location?
- This will copy your save files from the old location to the new one.
- Migrating save data…
Save data migrated successfully
Save data migration failed
Save directory set
- Save directory reset to default
The destination already contains data. Do you want to overwrite it?
All Files Access permission is required for custom paths
Grant Permission
@@ -970,7 +965,7 @@
None
- Performance
+ Fast
Balanced
Accurate
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index e961e1d2d7..b7c2d3c9a9 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -231,6 +231,7 @@ const char* TranslateCategory(Category category) {
return "Overlay";
case Category::Renderer:
case Category::RendererAdvanced:
+ case Category::RendererHacks:
case Category::RendererDebug:
case Category::RendererExtensions:
return "Renderer";
diff --git a/src/common/settings.h b/src/common/settings.h
index 44cdb24f17..b523fb673b 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -492,13 +492,13 @@ struct Values {
SwitchableSetting fast_gpu_time{linkage,
GpuOverclock::Medium,
"fast_gpu_time",
- Category::RendererAdvanced,
+ Category::RendererHacks,
Specialization::Default};
SwitchableSetting skip_cpu_inner_invalidation{linkage,
false,
"skip_cpu_inner_invalidation",
- Category::RendererAdvanced,
+ Category::RendererHacks,
Specialization::Default,
true,
true};
@@ -508,10 +508,10 @@ struct Values {
#else
false,
#endif
- "async_presentation", Category::RendererAdvanced};
+ "async_presentation", Category::RendererHacks};
SwitchableSetting use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders",
- Category::RendererAdvanced};
+ Category::RendererHacks};
SwitchableSetting dyna_state{linkage,
#if defined (_WIN32)
diff --git a/src/common/settings_common.h b/src/common/settings_common.h
index 0107895c8c..653ce17b89 100644
--- a/src/common/settings_common.h
+++ b/src/common/settings_common.h
@@ -24,6 +24,7 @@ enum class Category : u32 {
Overlay,
Renderer,
RendererAdvanced,
+ RendererHacks,
RendererExtensions,
RendererDebug,
System,
diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp
index 669e578b33..fdb7ac0833 100644
--- a/src/frontend_common/config.cpp
+++ b/src/frontend_common/config.cpp
@@ -368,6 +368,7 @@ void Config::ReadRendererValues() {
ReadCategory(Settings::Category::Renderer);
ReadCategory(Settings::Category::RendererAdvanced);
+ ReadCategory(Settings::Category::RendererHacks);
ReadCategory(Settings::Category::RendererExtensions);
ReadCategory(Settings::Category::RendererDebug);
@@ -671,6 +672,7 @@ void Config::SaveRendererValues() {
WriteCategory(Settings::Category::Renderer);
WriteCategory(Settings::Category::RendererAdvanced);
+ WriteCategory(Settings::Category::RendererHacks);
WriteCategory(Settings::Category::RendererExtensions);
WriteCategory(Settings::Category::RendererDebug);
diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp
index 90e8c81f32..a3a720db8e 100644
--- a/src/qt_common/config/shared_translation.cpp
+++ b/src/qt_common/config/shared_translation.cpp
@@ -272,8 +272,8 @@ std::unique_ptr InitializeTranslations(QObject* parent)
tr("Controls the quality of texture rendering at oblique angles.\nSafe to set at 16x on most GPUs."));
INSERT(Settings,
gpu_accuracy,
- tr("GPU Accuracy:"),
- tr("Controls the GPU emulation accuracy.\nMost games render fine with Performance or Balanced modes, but Accurate is still "
+ tr("GPU Mode:"),
+ tr("Controls the GPU emulation mode.\nMost games render fine with Fast or Balanced modes, but Accurate is still "
"required for some.\nParticles tend to only render correctly with Accurate mode."));
INSERT(Settings,
dma_accuracy,
@@ -321,7 +321,7 @@ std::unique_ptr InitializeTranslations(QObject* parent)
// Renderer (Extensions)
INSERT(Settings, dyna_state, tr("Extended Dynamic State"),
tr("Controls the number of features that can be used in Extended Dynamic State.\n"
- "Higher numbers allow for more features and can increase performance, but may cause "
+ "Higher states allow for more features and can increase performance, but may cause "
"additional graphical issues."));
INSERT(Settings,
@@ -499,7 +499,7 @@ std::unique_ptr ComboboxEnumeration(QObject* parent)
}});
translations->insert({Settings::EnumMetadata::Index(),
{
- PAIR(GpuAccuracy, Low, tr("Performance")),
+ PAIR(GpuAccuracy, Low, tr("Fast")),
PAIR(GpuAccuracy, Medium, tr("Balanced")),
PAIR(GpuAccuracy, High, tr("Accurate")),
}});
diff --git a/src/qt_common/config/shared_translation.h b/src/qt_common/config/shared_translation.h
index 299c31eaf8..e12b93ea6d 100644
--- a/src/qt_common/config/shared_translation.h
+++ b/src/qt_common/config/shared_translation.h
@@ -61,7 +61,7 @@ static const std::map use_docked_mode_texts_map
};
static const std::map gpu_accuracy_texts_map = {
- {Settings::GpuAccuracy::Low, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Performance"))},
+ {Settings::GpuAccuracy::Low, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Fast"))},
{Settings::GpuAccuracy::Medium, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Balanced"))},
{Settings::GpuAccuracy::High, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Accurate"))},
};
diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h
index c5a7d0b483..d139f43871 100644
--- a/src/qt_common/config/uisettings.h
+++ b/src/qt_common/config/uisettings.h
@@ -253,7 +253,7 @@ const std::array default_hotkeys{{
{QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Capture Screenshot")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+P"), std::string("Screenshot"), Qt::WidgetWithChildrenShortcut, false}},
{QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Adapting Filter")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F8"), std::string("Home+L"), Qt::ApplicationShortcut, false}},
{QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change Docked Mode")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F10"), std::string("Home+X"), Qt::ApplicationShortcut, false}},
- {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change GPU Accuracy")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F9"), std::string("Home+R"), Qt::ApplicationShortcut, false}},
+ {QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Change GPU Mode")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F9"), std::string("Home+R"), Qt::ApplicationShortcut, false}},
{QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Configure")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+,"), std::string(""), Qt::WidgetWithChildrenShortcut, false}},
{QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Configure Current Game")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("Ctrl+."), std::string(""), Qt::WidgetWithChildrenShortcut, false}},
{QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Continue/Pause Emulation")).toStdString(), QStringLiteral(QT_TRANSLATE_NOOP("Hotkeys", "Main Window")).toStdString(), {std::string("F4"), std::string("Home+Plus"), Qt::WindowShortcut, false}},
diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp
index 239e78a4d8..c247c53493 100644
--- a/src/yuzu/configuration/configure_dialog.cpp
+++ b/src/yuzu/configuration/configure_dialog.cpp
@@ -74,7 +74,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,
ui->tabWidget->addTab(general_tab.get(), tr("General"));
ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics"));
ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("GraphicsAdvanced"));
- ui->tabWidget->addTab(graphics_extensions_tab.get(), tr("GraphicsExtensions"));
+ ui->tabWidget->addTab(graphics_extensions_tab.get(), tr("GraphicsExtra"));
ui->tabWidget->addTab(hotkeys_tab.get(), tr("Hotkeys"));
ui->tabWidget->addTab(input_tab.get(), tr("Controls"));
ui->tabWidget->addTab(profile_tab.get(), tr("Profiles"));
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp
index efcf7eabdf..9096e3252d 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.cpp
+++ b/src/yuzu/configuration/configure_graphics_advanced.cpp
@@ -35,17 +35,9 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {}
void ConfigureGraphicsAdvanced::Setup(const ConfigurationShared::Builder& builder) {
auto& normal_layout = *ui->normal_target->layout();
- auto& hacks_layout = *ui->hacks_target->layout();
// A map will sort the data for us
std::map normal_hold{};
- std::map hacks_hold{};
-
- // These options are hacks and should probably be changed with caution.
- // TODO(crueter) maybe make a separate category RendererHacks?
- QList hacks = {
- Settings::values.skip_cpu_inner_invalidation.Id(), Settings::values.async_presentation.Id(),
- Settings::values.use_asynchronous_shaders.Id(), Settings::values.fast_gpu_time.Id()};
for (auto setting :
Settings::values.linkage.by_category[Settings::Category::RendererAdvanced]) {
@@ -61,11 +53,7 @@ void ConfigureGraphicsAdvanced::Setup(const ConfigurationShared::Builder& builde
const auto id = setting->Id();
- if (hacks.contains(id)) {
- hacks_hold.emplace(id, widget);
- } else {
- normal_hold.emplace(id, widget);
- }
+ normal_hold.emplace(id, widget);
// Keep track of enable_compute_pipelines so we can display it when needed
if (setting->Id() == Settings::values.enable_compute_pipelines.Id()) {
@@ -76,10 +64,6 @@ void ConfigureGraphicsAdvanced::Setup(const ConfigurationShared::Builder& builde
for (const auto& [id, widget] : normal_hold) {
normal_layout.addWidget(widget);
}
-
- for (const auto& [id, widget] : hacks_hold) {
- hacks_layout.addWidget(widget);
- }
}
void ConfigureGraphicsAdvanced::ApplyConfiguration() {
diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui
index 8c9ab1873b..bc8a9b2731 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.ui
+++ b/src/yuzu/configuration/configure_graphics_advanced.ui
@@ -6,7 +6,7 @@
0
0
- 404
+ 465
376
@@ -44,43 +44,6 @@
- -
-
-
- Hacks
-
-
-
-
-
-
- Changing these options from their default may cause issues. Novitii cavete!
-
-
-
- -
-
-
-
- 6
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
-
-
-
diff --git a/src/yuzu/configuration/configure_graphics_extensions.cpp b/src/yuzu/configuration/configure_graphics_extensions.cpp
index 71a428059e..7334eccc97 100644
--- a/src/yuzu/configuration/configure_graphics_extensions.cpp
+++ b/src/yuzu/configuration/configure_graphics_extensions.cpp
@@ -35,6 +35,7 @@ void ConfigureGraphicsExtensions::SetConfiguration() {}
void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& builder) {
auto& layout = *ui->populate_target->layout();
+
std::map hold{}; // A map will sort the data for us
for (auto setting :
@@ -71,6 +72,28 @@ void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& buil
for (const auto& [id, widget] : hold) {
layout.addWidget(widget);
}
+
+ auto& hacks = *ui->hacks_target->layout();
+ std::map hacks_hold{}; // A map will sort the data for us
+
+ for (auto setting : Settings::values.linkage.by_category[Settings::Category::RendererHacks]) {
+ auto* widget = builder.BuildWidget(setting, apply_funcs);
+
+ if (widget == nullptr) {
+ continue;
+ }
+
+ if (!widget->Valid()) {
+ widget->deleteLater();
+ continue;
+ }
+
+ hacks_hold.emplace(setting->Id(), widget);
+ }
+
+ for (const auto& [id, widget] : hacks_hold) {
+ hacks.addWidget(widget);
+ }
}
void ConfigureGraphicsExtensions::ApplyConfiguration() {
diff --git a/src/yuzu/configuration/configure_graphics_extensions.ui b/src/yuzu/configuration/configure_graphics_extensions.ui
index 7906b8318d..79a2107cc9 100644
--- a/src/yuzu/configuration/configure_graphics_extensions.ui
+++ b/src/yuzu/configuration/configure_graphics_extensions.ui
@@ -6,7 +6,7 @@
0
0
- 404
+ 465
376
@@ -14,15 +14,52 @@
Form
- Extensions
+ Extras
-
+
+
-
+
+
+ Hacks
+
+
+
-
+
+
+ Changing these options from their default may cause issues. Novitii cavete!
+
+
+
+ -
+
+
+
+ 6
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+
+
+
+
-
-
- Vulkan Extensions Settings
+ Vulkan Extensions
-
diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp
index 691fc766ae..e49978414c 100644
--- a/src/yuzu/configuration/configure_per_game.cpp
+++ b/src/yuzu/configuration/configure_per_game.cpp
@@ -77,7 +77,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st
ui->tabWidget->addTab(cpu_tab.get(), tr("CPU"));
ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics"));
ui->tabWidget->addTab(graphics_advanced_tab.get(), tr("Adv. Graphics"));
- ui->tabWidget->addTab(graphics_extensions_tab.get(), tr("GPU Extensions"));
+ ui->tabWidget->addTab(graphics_extensions_tab.get(), tr("Ext. Graphics"));
ui->tabWidget->addTab(audio_tab.get(), tr("Audio"));
ui->tabWidget->addTab(input_tab.get(), tr("Input Profiles"));
ui->tabWidget->addTab(network_tab.get(), tr("Network"));
diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp
index 6d5d6fc03e..c246923fcc 100644
--- a/src/yuzu/main_window.cpp
+++ b/src/yuzu/main_window.cpp
@@ -1421,7 +1421,7 @@ void MainWindow::InitializeHotkeys() {
connect_shortcut(QStringLiteral("Change Adapting Filter"),
&MainWindow::OnToggleAdaptingFilter);
connect_shortcut(QStringLiteral("Change Docked Mode"), &MainWindow::OnToggleDockedMode);
- connect_shortcut(QStringLiteral("Change GPU Accuracy"), &MainWindow::OnToggleGpuAccuracy);
+ connect_shortcut(QStringLiteral("Change GPU Mode"), &MainWindow::OnToggleGpuAccuracy);
connect_shortcut(QStringLiteral("Audio Mute/Unmute"), &MainWindow::OnMute);
connect_shortcut(QStringLiteral("Audio Volume Down"), &MainWindow::OnDecreaseVolume);
connect_shortcut(QStringLiteral("Audio Volume Up"), &MainWindow::OnIncreaseVolume);
diff --git a/tools/find-unused-strings.sh b/tools/find-unused-strings.sh
deleted file mode 100755
index 62c8852435..0000000000
--- a/tools/find-unused-strings.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh -e
-
-# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-# TODO: rewrite this to get a list of every string used in $ANDROID
-# then search strings.xml
-#
-ANDROID=src/android/app/src/main
-STRINGS=$ANDROID/res/values/strings.xml
-
-SRC=$(mktemp)
-
-# We start out by getting the list of source strings...
-grep -e "string name" $STRINGS | cut -d'"' -f2 > "$SRC"
-
-# ... then search for each string as R.string. or @string/
-while IFS= read -r str; do
- grep -qre "R.string.$str\|@string/$str" "$ANDROID" && continue
-
- echo "-- Removing unused string $str"
- sed "/string name=\"$str\"/d" "$STRINGS" > "$STRINGS.new"
- mv "$STRINGS.new" "$STRINGS"
-done < "$SRC"
-
-rm -rf "$TMP_DIR"
-
-tools/stale-translations.sh