From dfc4855058dd1fa1dc7cf347077914e4d8e5af6f Mon Sep 17 00:00:00 2001 From: Maufeat Date: Thu, 18 Dec 2025 12:35:17 +0100 Subject: [PATCH 001/170] [cheat] add dmnt, indiviual cheats, etc. --- .../yuzu/yuzu_emu/adapters/AddonAdapter.kt | 91 +- .../org/yuzu/yuzu_emu/model/AddonViewModel.kt | 30 +- .../java/org/yuzu/yuzu_emu/model/Patch.kt | 23 +- .../java/org/yuzu/yuzu_emu/model/PatchType.kt | 3 +- src/android/app/src/main/jni/native.cpp | 8 +- src/common/android/id_cache.cpp | 2 +- src/core/CMakeLists.txt | 17 +- src/core/core.h | 12 +- src/core/file_sys/patch_manager.cpp | 235 ++- src/core/file_sys/patch_manager.h | 17 +- src/core/hle/service/dmnt/cheat_interface.cpp | 238 ++++ src/core/hle/service/dmnt/cheat_interface.h | 88 ++ src/core/hle/service/dmnt/cheat_parser.cpp | 120 ++ src/core/hle/service/dmnt/cheat_parser.h | 26 + .../service/dmnt/cheat_process_manager.cpp | 599 ++++++++ .../hle/service/dmnt/cheat_process_manager.h | 126 ++ .../service/dmnt/cheat_virtual_machine.cpp | 1269 +++++++++++++++++ .../hle/service/dmnt/cheat_virtual_machine.h | 323 +++++ src/core/hle/service/dmnt/dmnt.cpp | 26 + src/core/hle/service/dmnt/dmnt.h | 15 + src/core/hle/service/dmnt/dmnt_results.h | 26 + src/core/hle/service/dmnt/dmnt_types.h | 55 + src/core/hle/service/services.cpp | 2 + src/core/memory/cheat_engine.cpp | 288 ---- src/core/memory/cheat_engine.h | 88 -- src/core/memory/dmnt_cheat_types.h | 37 - src/core/memory/dmnt_cheat_vm.cpp | 1268 ---------------- src/core/memory/dmnt_cheat_vm.h | 330 ----- .../vulkan_common/vulkan_instance.cpp | 4 +- .../configure_per_game_addons.cpp | 79 +- 30 files changed, 3338 insertions(+), 2107 deletions(-) create mode 100644 src/core/hle/service/dmnt/cheat_interface.cpp create mode 100644 src/core/hle/service/dmnt/cheat_interface.h create mode 100644 src/core/hle/service/dmnt/cheat_parser.cpp create mode 100644 src/core/hle/service/dmnt/cheat_parser.h create mode 100644 src/core/hle/service/dmnt/cheat_process_manager.cpp create mode 100644 src/core/hle/service/dmnt/cheat_process_manager.h create mode 100644 src/core/hle/service/dmnt/cheat_virtual_machine.cpp create mode 100644 src/core/hle/service/dmnt/cheat_virtual_machine.h create mode 100644 src/core/hle/service/dmnt/dmnt.cpp create mode 100644 src/core/hle/service/dmnt/dmnt.h create mode 100644 src/core/hle/service/dmnt/dmnt_results.h create mode 100644 src/core/hle/service/dmnt/dmnt_types.h delete mode 100644 src/core/memory/cheat_engine.cpp delete mode 100644 src/core/memory/cheat_engine.h delete mode 100644 src/core/memory/dmnt_cheat_types.h delete mode 100644 src/core/memory/dmnt_cheat_vm.cpp delete mode 100644 src/core/memory/dmnt_cheat_vm.h diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt index 2be91ba46a..47ccca556c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt @@ -6,10 +6,15 @@ package org.yuzu.yuzu_emu.adapters +import android.view.Gravity import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.constraintlayout.widget.ConstraintLayout +import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding import org.yuzu.yuzu_emu.model.Patch +import org.yuzu.yuzu_emu.model.PatchType import org.yuzu.yuzu_emu.model.AddonViewModel import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder @@ -27,18 +32,94 @@ class AddonAdapter(val addonViewModel: AddonViewModel) : binding.addonSwitch.performClick() } binding.title.text = model.name - binding.version.text = model.version binding.addonSwitch.isChecked = model.enabled binding.addonSwitch.setOnCheckedChangeListener { _, checked -> model.enabled = checked } - val deleteAction = { - addonViewModel.setAddonToDelete(model) + val isCheat = model.isCheat() + val indentPx = if (isCheat) { + binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_large) + } else { + 0 + } + (binding.addonCard.layoutParams as? ViewGroup.MarginLayoutParams)?.let { + it.marginStart = indentPx + binding.addonCard.layoutParams = it + } + + if (isCheat) { + binding.version.visibility = View.GONE + binding.deleteCard.visibility = View.GONE + binding.buttonDelete.visibility = View.GONE + + binding.addonSwitch.scaleX = 0.7f + binding.addonSwitch.scaleY = 0.7f + + val compactPaddingVertical = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_small) + binding.root.setPadding( + binding.root.paddingLeft, + compactPaddingVertical / 2, + binding.root.paddingRight, + compactPaddingVertical / 2 + ) + + val innerLayout = binding.addonCard.getChildAt(0) as? ViewGroup + innerLayout?.let { + val leftPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_large) + val smallPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_med) + it.setPadding(leftPadding, smallPadding, smallPadding, smallPadding) + } + + binding.title.textSize = 14f + binding.title.gravity = Gravity.CENTER_VERTICAL + + (binding.title.layoutParams as? ConstraintLayout.LayoutParams)?.let { params -> + params.topToTop = ConstraintLayout.LayoutParams.PARENT_ID + params.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID + params.topMargin = 0 + binding.title.layoutParams = params + } + } else { + binding.version.visibility = View.VISIBLE + binding.version.text = model.version + binding.deleteCard.visibility = View.VISIBLE + binding.buttonDelete.visibility = View.VISIBLE + + binding.addonSwitch.scaleX = 1.0f + binding.addonSwitch.scaleY = 1.0f + + val normalPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_med) + binding.root.setPadding( + binding.root.paddingLeft, + normalPadding, + binding.root.paddingRight, + normalPadding + ) + + val innerLayout = binding.addonCard.getChildAt(0) as? ViewGroup + innerLayout?.let { + val normalInnerPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_medlarge) + it.setPadding(normalInnerPadding, normalInnerPadding, normalInnerPadding, normalInnerPadding) + } + + binding.title.textSize = 16f + binding.title.gravity = Gravity.START + + (binding.title.layoutParams as? ConstraintLayout.LayoutParams)?.let { params -> + params.topToTop = ConstraintLayout.LayoutParams.PARENT_ID + params.bottomToBottom = ConstraintLayout.LayoutParams.UNSET + params.topMargin = 0 + binding.title.layoutParams = params + } + + val deleteAction = { + addonViewModel.setAddonToDelete(model) + } + binding.deleteCard.setOnClickListener { deleteAction() } + binding.buttonDelete.setOnClickListener { deleteAction() } } - binding.deleteCard.setOnClickListener { deleteAction() } - binding.buttonDelete.setOnClickListener { deleteAction() } } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt index b9c8e49ca4..90938870ca 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt @@ -47,8 +47,7 @@ class AddonViewModel : ViewModel() { NativeLibrary.getPatchesForFile(game!!.path, game!!.programId) ?: emptyArray() ).toMutableList() - patchList.sortBy { it.name } - _patchList.value = patchList + _patchList.value = sortPatchesWithCheatsGrouped(patchList) isRefreshing.set(false) } } @@ -63,6 +62,7 @@ class AddonViewModel : ViewModel() { PatchType.Update -> NativeLibrary.removeUpdate(patch.programId) PatchType.DLC -> NativeLibrary.removeDLC(patch.programId) PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name) + PatchType.Cheat -> {} } refreshAddons() } @@ -78,7 +78,7 @@ class AddonViewModel : ViewModel() { if (it.enabled) { null } else { - it.name + it.getStorageKey() // Use storage key for proper cheat identification } }.toTypedArray() ) @@ -94,4 +94,28 @@ class AddonViewModel : ViewModel() { fun showModNoticeDialog(show: Boolean) { _showModNoticeDialog.value = show } + + private fun sortPatchesWithCheatsGrouped(patches: MutableList): MutableList { + val individualCheats = patches.filter { it.isCheat() } + val nonCheats = patches.filter { !it.isCheat() }.sortedBy { it.name } + + val cheatsByParent = individualCheats.groupBy { it.parentName } + + val result = mutableListOf() + for (patch in nonCheats) { + result.add(patch) + cheatsByParent[patch.name]?.sortedBy { it.name }?.let { childCheats -> + result.addAll(childCheats) + } + } + + val knownParents = nonCheats.map { it.name }.toSet() + for ((parentName, orphanCheats) in cheatsByParent) { + if (parentName !in knownParents) { + result.addAll(orphanCheats.sortedBy { it.name }) + } + } + + return result + } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt index 25cb9e3654..9c2ad80eae 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt @@ -12,5 +12,24 @@ data class Patch( val version: String, val type: Int, val programId: String, - val titleId: String -) + val titleId: String, + val parentName: String = "" // For cheats: name of the mod folder containing them +) { + /** + * Returns the storage key used for saving enabled/disabled state. + * For cheats with a parent, returns "ParentName::CheatName". + */ + fun getStorageKey(): String { + return if (parentName.isNotEmpty()) { + "$parentName::$name" + } else { + name + } + } + + /** + * Returns true if this patch is an individual cheat entry (not a cheat mod). + * Individual cheats have type=Cheat and a parent mod name. + */ + fun isCheat(): Boolean = type == PatchType.Cheat.int && parentName.isNotEmpty() +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt index e9a54162b0..271d3b869b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt @@ -6,7 +6,8 @@ package org.yuzu.yuzu_emu.model enum class PatchType(val int: Int) { Update(0), DLC(1), - Mod(2); + Mod(2), + Cheat(3); companion object { fun from(int: Int): PatchType = entries.firstOrNull { it.int == int } ?: Update diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index ac1a189e75..08ee045d70 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1323,7 +1323,10 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env FileSys::VirtualFile update_raw; loader->ReadUpdateRaw(update_raw); - auto patches = pm.GetPatches(update_raw); + // Get build ID for individual cheat enumeration + const auto build_id = pm.GetBuildID(update_raw); + + auto patches = pm.GetPatches(update_raw, build_id); jobjectArray jpatchArray = env->NewObjectArray(patches.size(), Common::Android::GetPatchClass(), nullptr); int i = 0; @@ -1333,7 +1336,8 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env Common::Android::ToJString(env, patch.name), Common::Android::ToJString(env, patch.version), static_cast(patch.type), Common::Android::ToJString(env, std::to_string(patch.program_id)), - Common::Android::ToJString(env, std::to_string(patch.title_id))); + Common::Android::ToJString(env, std::to_string(patch.title_id)), + Common::Android::ToJString(env, patch.parent_name)); env->SetObjectArrayElement(jpatchArray, i, jpatch); ++i; } diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index eb43f4e213..230d249ed3 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -516,7 +516,7 @@ namespace Common::Android { s_patch_class = reinterpret_cast(env->NewGlobalRef(patch_class)); s_patch_constructor = env->GetMethodID( patch_class, "", - "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V"); + "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z"); s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;"); s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;"); diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 14eb331d24..460d121fa6 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -617,6 +617,18 @@ add_library(core STATIC hle/service/caps/caps_u.h hle/service/cmif_serialization.h hle/service/cmif_types.h + hle/service/dmnt/cheat_interface.cpp + hle/service/dmnt/cheat_interface.h + hle/service/dmnt/cheat_parser.cpp + hle/service/dmnt/cheat_parser.h + hle/service/dmnt/cheat_process_manager.cpp + hle/service/dmnt/cheat_process_manager.h + hle/service/dmnt/cheat_virtual_machine.cpp + hle/service/dmnt/cheat_virtual_machine.h + hle/service/dmnt/dmnt.cpp + hle/service/dmnt/dmnt.h + hle/service/dmnt/dmnt_results.h + hle/service/dmnt/dmnt_types.h hle/service/erpt/erpt.cpp hle/service/erpt/erpt.h hle/service/es/es.cpp @@ -1155,11 +1167,6 @@ add_library(core STATIC loader/xci.h memory.cpp memory.h - memory/cheat_engine.cpp - memory/cheat_engine.h - memory/dmnt_cheat_types.h - memory/dmnt_cheat_vm.cpp - memory/dmnt_cheat_vm.h perf_stats.cpp perf_stats.h reporter.cpp diff --git a/src/core/core.h b/src/core/core.h index 702c5cc81b..8a23420ae8 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -17,6 +17,7 @@ #include "common/common_types.h" #include "core/file_sys/vfs/vfs_types.h" +#include "core/hle/service/dmnt/dmnt_types.h" #include "core/hle/service/os/event.h" #include "core/hle/service/kernel_helpers.h" @@ -45,10 +46,14 @@ enum class ResultStatus : u16; } // namespace Loader namespace Core::Memory { -struct CheatEntry; class Memory; } // namespace Core::Memory +namespace Service::DMNT { + class CheatProcessManager; + struct CheatEntry; +} + namespace Service { namespace Account { @@ -335,7 +340,7 @@ public: [[nodiscard]] FileSys::VirtualFilesystem GetFilesystem() const; - void RegisterCheatList(const std::vector& list, + void RegisterCheatList(const std::vector& list, const std::array& build_id, u64 main_region_begin, u64 main_region_size); @@ -379,6 +384,9 @@ public: [[nodiscard]] Tools::RenderdocAPI& GetRenderdocAPI(); + [[nodiscard]] Service::DMNT::CheatProcessManager& GetCheatManager(); + [[nodiscard]] const Service::DMNT::CheatProcessManager& GetCheatManager() const; + void SetExitLocked(bool locked); bool GetExitLocked() const; diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 657172fb4d..adbb611c1c 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -27,12 +27,13 @@ #include "core/file_sys/vfs/vfs_cached.h" #include "core/file_sys/vfs/vfs_layered.h" #include "core/file_sys/vfs/vfs_vector.h" +#include "core/hle/service/dmnt/cheat_parser.h" +#include "core/hle/service/dmnt/dmnt_types.h" #include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/ns/language.h" #include "core/hle/service/set/settings_server.h" #include "core/loader/loader.h" #include "core/loader/nso.h" -#include "core/memory/cheat_engine.h" namespace FileSys { namespace { @@ -64,16 +65,15 @@ std::string FormatTitleVersion(u32 version, return fmt::format("v{}.{}.{}", bytes[3], bytes[2], bytes[1]); } -// Returns a directory with name matching name case-insensitive. Returns nullptr if directory -// doesn't have a directory with name. -VirtualDir FindSubdirectoryCaseless(const VirtualDir dir, std::string_view name) { +// Returns a directory with name matching case-insensitively. +// Returns nullptr if directory doesn't contain a subdirectory with the given name. +VirtualDir FindSubdirectoryCaseless(const VirtualDir& dir, std::string_view name) { #ifdef _WIN32 return dir->GetSubdirectory(name); #else - const auto subdirs = dir->GetSubdirectories(); - for (const auto& subdir : subdirs) { - std::string dir_name = Common::ToLower(subdir->GetName()); - if (dir_name == name) { + const auto target = Common::ToLower(std::string(name)); + for (const auto& subdir : dir->GetSubdirectories()) { + if (Common::ToLower(subdir->GetName()) == target) { return subdir; } } @@ -82,10 +82,11 @@ VirtualDir FindSubdirectoryCaseless(const VirtualDir dir, std::string_view name) #endif } -std::optional> ReadCheatFileFromFolder( +std::optional> ReadCheatFileFromFolder( u64 title_id, const PatchManager::BuildID& build_id_, const VirtualDir& base_path, bool upper) { + const auto build_id_raw = Common::HexToString(build_id_, upper); - const auto build_id = build_id_raw.substr(0, sizeof(u64) * 2); + const auto build_id = build_id_raw.substr(0, std::min(build_id_raw.size(), sizeof(u64) * 2)); const auto file = base_path->GetFile(fmt::format("{}.txt", build_id)); if (file == nullptr) { @@ -101,17 +102,15 @@ std::optional> ReadCheatFileFromFolder( return std::nullopt; } - const Core::Memory::TextCheatParser parser; + const Service::DMNT::CheatParser parser; return parser.Parse(std::string_view(reinterpret_cast(data.data()), data.size())); } void AppendCommaIfNotEmpty(std::string& to, std::string_view with) { - if (to.empty()) { - to += with; - } else { + if (!to.empty()) { to += ", "; - to += with; } + to += with; } bool IsDirValidAndNonEmpty(const VirtualDir& dir) { @@ -316,7 +315,7 @@ bool PatchManager::HasNSOPatch(const BuildID& build_id_, std::string_view name) return !CollectPatches(patch_dirs, build_id).empty(); } -std::vector PatchManager::CreateCheatList(const BuildID& build_id_) const { +std::vector PatchManager::CreateCheatList(const BuildID& build_id_) const { const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); if (load_dir == nullptr) { LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); @@ -325,35 +324,71 @@ std::vector PatchManager::CreateCheatList(const BuildI const auto& disabled = Settings::values.disabled_addons[title_id]; auto patch_dirs = load_dir->GetSubdirectories(); - std::sort(patch_dirs.begin(), patch_dirs.end(), [](auto const& l, auto const& r) { return l->GetName() < r->GetName(); }); + std::sort(patch_dirs.begin(), patch_dirs.end(), + [](const VirtualDir& l, const VirtualDir& r) { return l->GetName() < r->GetName(); }); - // / / cheats / .txt - std::vector out; + std::vector out; + + // Load cheats from: //cheats/.txt for (const auto& subdir : patch_dirs) { - if (std::find(disabled.cbegin(), disabled.cend(), subdir->GetName()) == disabled.cend()) { - if (auto cheats_dir = FindSubdirectoryCaseless(subdir, "cheats"); cheats_dir != nullptr) { - if (auto const res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, true)) - std::copy(res->begin(), res->end(), std::back_inserter(out)); - if (auto const res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, false)) - std::copy(res->begin(), res->end(), std::back_inserter(out)); + const auto mod_name = subdir->GetName(); + + // Skip entirely disabled mods + if (std::find(disabled.cbegin(), disabled.cend(), mod_name) != disabled.cend()) { + continue; + } + + auto cheats_dir = FindSubdirectoryCaseless(subdir, "cheats"); + if (cheats_dir == nullptr) { + continue; + } + + // Try uppercase build_id first, then lowercase + std::optional> cheat_entries; + if (auto res = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, true)) { + cheat_entries = std::move(res); + } else if (auto res_lower = ReadCheatFileFromFolder(title_id, build_id_, cheats_dir, false)) { + cheat_entries = std::move(res_lower); + } + + if (cheat_entries) { + for (auto& entry : *cheat_entries) { + // Check if this individual cheat is disabled + const std::string cheat_name = entry.definition.readable_name.data(); + const std::string cheat_key = mod_name + "::" + cheat_name; + + if (std::find(disabled.cbegin(), disabled.cend(), cheat_key) != disabled.cend()) { + // Individual cheat is disabled - mark it as disabled but still include it + entry.enabled = false; + } + + out.push_back(entry); } } } - // Uncareless user-friendly loading of patches (must start with 'cheat_') - // / .txt - for (auto const& f : load_dir->GetFiles()) { - auto const name = f->GetName(); - if (name.starts_with("cheat_") && std::find(disabled.cbegin(), disabled.cend(), name) == disabled.cend()) { - std::vector data(f->GetSize()); - if (f->Read(data.data(), data.size()) == data.size()) { - const Core::Memory::TextCheatParser parser; - auto const res = parser.Parse(std::string_view(reinterpret_cast(data.data()), data.size())); - std::copy(res.begin(), res.end(), std::back_inserter(out)); - } else { - LOG_INFO(Common_Filesystem, "Failed to read cheats file for title_id={:016X}", title_id); - } + + // User-friendly cheat loading from: /cheat_*.txt + for (const auto& file : load_dir->GetFiles()) { + const auto& name = file->GetName(); + if (!name.starts_with("cheat_")) { + continue; } + if (std::find(disabled.cbegin(), disabled.cend(), name) != disabled.cend()) { + continue; + } + + std::vector data(file->GetSize()); + if (file->Read(data.data(), data.size()) != static_cast(data.size())) { + LOG_WARNING(Common_Filesystem, "Failed to read cheat file '{}' for title_id={:016X}", + name, title_id); + continue; + } + + const Service::DMNT::CheatParser parser; + auto entries = parser.Parse(std::string_view(reinterpret_cast(data.data()), data.size())); + out.insert(out.end(), entries.begin(), entries.end()); } + return out; } @@ -480,7 +515,53 @@ VirtualFile PatchManager::PatchRomFS(const NCA* base_nca, VirtualFile base_romfs return romfs; } -std::vector PatchManager::GetPatches(VirtualFile update_raw) const { +PatchManager::BuildID PatchManager::GetBuildID(VirtualFile update_raw) const { + BuildID build_id{}; + + // Get the base NCA + const auto base_nca = content_provider.GetEntry(title_id, ContentRecordType::Program); + if (base_nca == nullptr) { + return build_id; + } + + // Try to get ExeFS from update first, then base + VirtualDir exefs; + const auto update_tid = GetUpdateTitleID(title_id); + const auto update = content_provider.GetEntry(update_tid, ContentRecordType::Program); + + if (update != nullptr && update->GetExeFS() != nullptr) { + exefs = update->GetExeFS(); + } else if (update_raw != nullptr) { + const auto new_nca = std::make_shared(update_raw, base_nca.get()); + if (new_nca->GetStatus() == Loader::ResultStatus::Success && + new_nca->GetExeFS() != nullptr) { + exefs = new_nca->GetExeFS(); + } + } + + if (exefs == nullptr) { + exefs = base_nca->GetExeFS(); + } + + if (exefs == nullptr) { + return build_id; + } + + // Try to read the main NSO header + const auto main_file = exefs->GetFile("main"); + if (main_file == nullptr || main_file->GetSize() < sizeof(Loader::NSOHeader)) { + return build_id; + } + + Loader::NSOHeader header{}; + if (main_file->Read(reinterpret_cast(&header), sizeof(header)) == sizeof(header)) { + build_id = header.build_id; + } + + return build_id; +} + +std::vector PatchManager::GetPatches(VirtualFile update_raw, const BuildID& build_id) const { if (title_id == 0) { return {}; } @@ -501,7 +582,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = "", .type = PatchType::Update, .program_id = title_id, - .title_id = title_id}; + .title_id = title_id, + .parent_name = ""}; if (nacp != nullptr) { update_patch.version = nacp->GetVersionString(); @@ -521,24 +603,15 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { } } + // Check if we have a valid build_id for cheat enumeration + const bool has_build_id = std::any_of(build_id.begin(), build_id.end(), [](u8 b) { return b != 0; }); + // General Mods (LayeredFS and IPS) const auto mod_dir = fs_controller.GetModificationLoadRoot(title_id); if (mod_dir != nullptr) { - for (auto const& f : mod_dir->GetFiles()) - if (auto const name = f->GetName(); name.starts_with("cheat_")) { - auto const mod_disabled = std::find(disabled.begin(), disabled.end(), name) != disabled.end(); - out.push_back({ - .enabled = !mod_disabled, - .name = name, - .version = "Cheats", - .type = PatchType::Mod, - .program_id = title_id, - .title_id = title_id - }); - } - for (const auto& mod : mod_dir->GetSubdirectories()) { std::string types; + bool has_cheats = false; const auto exefs_dir = FindSubdirectoryCaseless(mod, "exefs"); if (IsDirValidAndNonEmpty(exefs_dir)) { @@ -567,19 +640,63 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { if (IsDirValidAndNonEmpty(FindSubdirectoryCaseless(mod, "romfs")) || IsDirValidAndNonEmpty(FindSubdirectoryCaseless(mod, "romfslite"))) AppendCommaIfNotEmpty(types, "LayeredFS"); - if (IsDirValidAndNonEmpty(FindSubdirectoryCaseless(mod, "cheats"))) + + const auto cheats_dir = FindSubdirectoryCaseless(mod, "cheats"); + if (IsDirValidAndNonEmpty(cheats_dir)) { + has_cheats = true; AppendCommaIfNotEmpty(types, "Cheats"); + } if (types.empty()) continue; - const auto mod_disabled = std::find(disabled.begin(), disabled.end(), mod->GetName()) != disabled.end(); + const auto mod_disabled = + std::find(disabled.begin(), disabled.end(), mod->GetName()) != disabled.end(); out.push_back({.enabled = !mod_disabled, .name = mod->GetName(), .version = types, .type = PatchType::Mod, .program_id = title_id, - .title_id = title_id}); + .title_id = title_id, + .parent_name = ""}); + + // Add individual cheats as sub-entries if we have a build_id + if (has_cheats && has_build_id && !mod_disabled) { + // Try to read cheat file (uppercase first, then lowercase) + std::optional> cheat_entries; + if (auto res = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, true)) { + cheat_entries = std::move(res); + } else if (auto res_lower = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, false)) { + cheat_entries = std::move(res_lower); + } + + if (cheat_entries) { + for (const auto& cheat : *cheat_entries) { + // Skip master cheat (id 0) with no readable name + if (cheat.cheat_id == 0 && cheat.definition.readable_name[0] == '\0') { + continue; + } + + const std::string cheat_name = cheat.definition.readable_name.data(); + if (cheat_name.empty()) { + continue; + } + + // Create unique key for this cheat: "ModName::CheatName" + const std::string cheat_key = mod->GetName() + "::" + cheat_name; + const auto cheat_disabled = + std::find(disabled.begin(), disabled.end(), cheat_key) != disabled.end(); + + out.push_back({.enabled = !cheat_disabled, + .name = cheat_name, + .version = types, + .type = PatchType::Cheat, + .program_id = title_id, + .title_id = title_id, + .parent_name = mod->GetName()}); + } + } + } } } @@ -603,7 +720,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = types, .type = PatchType::Mod, .program_id = title_id, - .title_id = title_id}); + .title_id = title_id, + .parent_name = ""}); } } @@ -635,7 +753,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = std::move(list), .type = PatchType::DLC, .program_id = title_id, - .title_id = dlc_match.back().title_id}); + .title_id = dlc_match.back().title_id, + .parent_name = ""}); } return out; diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 552c0fbe23..f2e226a71b 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -10,7 +10,6 @@ #include "common/common_types.h" #include "core/file_sys/nca_metadata.h" #include "core/file_sys/vfs/vfs_types.h" -#include "core/memory/dmnt_cheat_types.h" namespace Core { class System; @@ -20,13 +19,17 @@ namespace Service::FileSystem { class FileSystemController; } +namespace Service::DMNT { +struct CheatEntry; +} + namespace FileSys { class ContentProvider; class NCA; class NACP; -enum class PatchType { Update, DLC, Mod }; +enum class PatchType { Update, DLC, Mod, Cheat }; struct Patch { bool enabled; @@ -35,6 +38,7 @@ struct Patch { PatchType type; u64 program_id; u64 title_id; + std::string parent_name; }; // A centralized class to manage patches to games. @@ -65,7 +69,7 @@ public: [[nodiscard]] bool HasNSOPatch(const BuildID& build_id, std::string_view name) const; // Creates a CheatList object with all - [[nodiscard]] std::vector CreateCheatList( + [[nodiscard]] std::vector CreateCheatList( const BuildID& build_id) const; // Currently tracked RomFS patches: @@ -76,8 +80,11 @@ public: VirtualFile packed_update_raw = nullptr, bool apply_layeredfs = true) const; - // Returns a vector of patches - [[nodiscard]] std::vector GetPatches(VirtualFile update_raw = nullptr) const; + // Returns a vector of patches including individual cheats + [[nodiscard]] std::vector GetPatches(VirtualFile update_raw = nullptr, + const BuildID& build_id = {}) const; + + [[nodiscard]] BuildID GetBuildID(VirtualFile update_raw = nullptr) const; // If the game update exists, returns the u32 version field in its Meta-type NCA. If that fails, // it will fallback to the Meta-type NCA of the base game. If that fails, the result will be diff --git a/src/core/hle/service/dmnt/cheat_interface.cpp b/src/core/hle/service/dmnt/cheat_interface.cpp new file mode 100644 index 0000000000..2e566814c7 --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_interface.cpp @@ -0,0 +1,238 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/dmnt/cheat_interface.h" +#include "core/hle/service/dmnt/cheat_process_manager.h" +#include "core/hle/service/dmnt/dmnt_results.h" +#include "core/hle/service/dmnt/dmnt_types.h" + +namespace Service::DMNT { + ICheatInterface::ICheatInterface(Core::System& system_, CheatProcessManager& manager) + : ServiceFramework{system_, "dmnt:cht"}, cheat_process_manager{manager} { + // clang-format off + static const FunctionInfo functions[] = { + {65000, C<&ICheatInterface::HasCheatProcess>, "HasCheatProcess"}, + {65001, C<&ICheatInterface::GetCheatProcessEvent>, "GetCheatProcessEvent"}, + {65002, C<&ICheatInterface::GetCheatProcessMetadata>, "GetCheatProcessMetadata"}, + {65003, C<&ICheatInterface::ForceOpenCheatProcess>, "ForceOpenCheatProcess"}, + {65004, C<&ICheatInterface::PauseCheatProcess>, "PauseCheatProcess"}, + {65005, C<&ICheatInterface::ResumeCheatProcess>, "ResumeCheatProcess"}, + {65006, C<&ICheatInterface::ForceCloseCheatProcess>, "ForceCloseCheatProcess"}, + {65100, C<&ICheatInterface::GetCheatProcessMappingCount>, "GetCheatProcessMappingCount"}, + {65101, C<&ICheatInterface::GetCheatProcessMappings>, "GetCheatProcessMappings"}, + {65102, C<&ICheatInterface::ReadCheatProcessMemory>, "ReadCheatProcessMemory"}, + {65103, C<&ICheatInterface::WriteCheatProcessMemory>, "WriteCheatProcessMemory"}, + {65104, C<&ICheatInterface::QueryCheatProcessMemory>, "QueryCheatProcessMemory"}, + {65200, C<&ICheatInterface::GetCheatCount>, "GetCheatCount"}, + {65201, C<&ICheatInterface::GetCheats>, "GetCheats"}, + {65202, C<&ICheatInterface::GetCheatById>, "GetCheatById"}, + {65203, C<&ICheatInterface::ToggleCheat>, "ToggleCheat"}, + {65204, C<&ICheatInterface::AddCheat>, "AddCheat"}, + {65205, C<&ICheatInterface::RemoveCheat>, "RemoveCheat"}, + {65206, C<&ICheatInterface::ReadStaticRegister>, "ReadStaticRegister"}, + {65207, C<&ICheatInterface::WriteStaticRegister>, "WriteStaticRegister"}, + {65208, C<&ICheatInterface::ResetStaticRegisters>, "ResetStaticRegisters"}, + {65209, C<&ICheatInterface::SetMasterCheat>, "SetMasterCheat"}, + {65300, C<&ICheatInterface::GetFrozenAddressCount>, "GetFrozenAddressCount"}, + {65301, C<&ICheatInterface::GetFrozenAddresses>, "GetFrozenAddresses"}, + {65302, C<&ICheatInterface::GetFrozenAddress>, "GetFrozenAddress"}, + {65303, C<&ICheatInterface::EnableFrozenAddress>, "EnableFrozenAddress"}, + {65304, C<&ICheatInterface::DisableFrozenAddress>, "DisableFrozenAddress"}, + }; + // clang-format on + + RegisterHandlers(functions); + } + + ICheatInterface::~ICheatInterface() = default; + + Result ICheatInterface::HasCheatProcess(Out out_has_cheat) { + LOG_INFO(CheatEngine, "called"); + *out_has_cheat = cheat_process_manager.HasCheatProcess(); + R_SUCCEED(); + } + + Result ICheatInterface::GetCheatProcessEvent(OutCopyHandle out_event) { + LOG_INFO(CheatEngine, "called"); + *out_event = &cheat_process_manager.GetCheatProcessEvent(); + R_SUCCEED(); + } + + Result ICheatInterface::GetCheatProcessMetadata(Out out_metadata) { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.GetCheatProcessMetadata(*out_metadata)); + } + + Result ICheatInterface::ForceOpenCheatProcess() { + LOG_INFO(CheatEngine, "called"); + R_UNLESS(R_SUCCEEDED(cheat_process_manager.ForceOpenCheatProcess()), ResultCheatNotAttached); + R_SUCCEED(); + } + + Result ICheatInterface::PauseCheatProcess() { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.PauseCheatProcess()); + } + + Result ICheatInterface::ResumeCheatProcess() { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.ResumeCheatProcess()); + } + + Result ICheatInterface::ForceCloseCheatProcess() { + LOG_WARNING(CheatEngine, "(STUBBED) called"); + R_RETURN(cheat_process_manager.ForceCloseCheatProcess()); + } + + Result ICheatInterface::GetCheatProcessMappingCount(Out out_count) { + LOG_WARNING(CheatEngine, "(STUBBED) called"); + R_RETURN(cheat_process_manager.GetCheatProcessMappingCount(*out_count)); + } + + Result ICheatInterface::GetCheatProcessMappings( + Out out_count, u64 offset, + OutArray out_mappings) { + LOG_INFO(CheatEngine, "called, offset={}", offset); + R_UNLESS(!out_mappings.empty(), ResultCheatNullBuffer); + R_RETURN(cheat_process_manager.GetCheatProcessMappings(*out_count, offset, out_mappings)); + } + + Result ICheatInterface::ReadCheatProcessMemory(u64 address, u64 size, + OutBuffer out_buffer) { + LOG_DEBUG(CheatEngine, "called, address={}, size={}", address, size); + R_UNLESS(!out_buffer.empty(), ResultCheatNullBuffer); + R_RETURN(cheat_process_manager.ReadCheatProcessMemory(address, size, out_buffer)); + } + + Result ICheatInterface::WriteCheatProcessMemory(u64 address, u64 size, + InBuffer buffer) { + LOG_DEBUG(CheatEngine, "called, address={}, size={}", address, size); + R_UNLESS(!buffer.empty(), ResultCheatNullBuffer); + R_RETURN(cheat_process_manager.WriteCheatProcessMemory(address, size, buffer)); + } + + Result ICheatInterface::QueryCheatProcessMemory(Out out_mapping, + u64 address) { + LOG_WARNING(CheatEngine, "(STUBBED) called, address={}", address); + R_RETURN(cheat_process_manager.QueryCheatProcessMemory(out_mapping, address)); + } + + Result ICheatInterface::GetCheatCount(Out out_count) { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.GetCheatCount(*out_count)); + } + + Result ICheatInterface::GetCheats(Out out_count, u64 offset, + OutArray out_cheats) { + LOG_INFO(CheatEngine, "called, offset={}", offset); + R_UNLESS(!out_cheats.empty(), ResultCheatNullBuffer); + R_RETURN(cheat_process_manager.GetCheats(*out_count, offset, out_cheats)); + } + + Result ICheatInterface::GetCheatById(OutLargeData out_cheat, + u32 cheat_id) { + LOG_INFO(CheatEngine, "called, cheat_id={}", cheat_id); + R_RETURN(cheat_process_manager.GetCheatById(out_cheat, cheat_id)); + } + + Result ICheatInterface::ToggleCheat(u32 cheat_id) { + LOG_INFO(CheatEngine, "called, cheat_id={}", cheat_id); + R_RETURN(cheat_process_manager.ToggleCheat(cheat_id)); + } + + Result ICheatInterface::AddCheat( + Out out_cheat_id, bool is_enabled, + InLargeData cheat_definition) { + LOG_INFO(CheatEngine, "called, is_enabled={}", is_enabled); + R_RETURN(cheat_process_manager.AddCheat(*out_cheat_id, is_enabled, *cheat_definition)); + } + + Result ICheatInterface::RemoveCheat(u32 cheat_id) { + LOG_INFO(CheatEngine, "called, cheat_id={}", cheat_id); + R_RETURN(cheat_process_manager.RemoveCheat(cheat_id)); + } + + Result ICheatInterface::ReadStaticRegister(Out out_value, u8 register_index) { + LOG_DEBUG(CheatEngine, "called, register_index={}", register_index); + R_RETURN(cheat_process_manager.ReadStaticRegister(*out_value, register_index)); + } + + Result ICheatInterface::WriteStaticRegister(u8 register_index, u64 value) { + LOG_DEBUG(CheatEngine, "called, register_index={}, value={}", register_index, value); + R_RETURN(cheat_process_manager.WriteStaticRegister(register_index, value)); + } + + Result ICheatInterface::ResetStaticRegisters() { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.ResetStaticRegisters()); + } + + Result ICheatInterface::SetMasterCheat( + InLargeData cheat_definition) { + LOG_INFO(CheatEngine, "called, name={}, num_opcodes={}", cheat_definition->readable_name.data(), + cheat_definition->num_opcodes); + R_RETURN(cheat_process_manager.SetMasterCheat(*cheat_definition)); + } + + Result ICheatInterface::GetFrozenAddressCount(Out out_count) { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.GetFrozenAddressCount(*out_count)); + } + + Result ICheatInterface::GetFrozenAddresses( + Out out_count, u64 offset, + OutArray out_frozen_address) { + LOG_INFO(CheatEngine, "called, offset={}", offset); + R_UNLESS(!out_frozen_address.empty(), ResultCheatNullBuffer); + R_RETURN(cheat_process_manager.GetFrozenAddresses(*out_count, offset, out_frozen_address)); + } + + Result ICheatInterface::GetFrozenAddress(Out out_frozen_address_entry, + u64 address) { + LOG_INFO(CheatEngine, "called, address={}", address); + R_RETURN(cheat_process_manager.GetFrozenAddress(*out_frozen_address_entry, address)); + } + + Result ICheatInterface::EnableFrozenAddress(Out out_value, u64 address, u64 width) { + LOG_INFO(CheatEngine, "called, address={}, width={}", address, width); + R_UNLESS(width > 0, ResultFrozenAddressInvalidWidth); + R_UNLESS(width <= sizeof(u64), ResultFrozenAddressInvalidWidth); + R_UNLESS((width & (width - 1)) == 0, ResultFrozenAddressInvalidWidth); + R_RETURN(cheat_process_manager.EnableFrozenAddress(*out_value, address, width)); + } + + Result ICheatInterface::DisableFrozenAddress(u64 address) { + LOG_INFO(CheatEngine, "called, address={}", address); + R_RETURN(cheat_process_manager.DisableFrozenAddress(address)); + } + + void ICheatInterface::InitializeCheatManager() { + LOG_INFO(CheatEngine, "called"); + } + + Result ICheatInterface::ReadCheatProcessMemoryUnsafe(u64 process_addr, std::span out_data, + size_t size) { + LOG_DEBUG(CheatEngine, "called, process_addr={}, size={}", process_addr, size); + R_RETURN(cheat_process_manager.ReadCheatProcessMemoryUnsafe(process_addr, &out_data, size)); + } + + Result ICheatInterface::WriteCheatProcessMemoryUnsafe(u64 process_addr, std::span data, + size_t size) { + LOG_DEBUG(CheatEngine, "called, process_addr={}, size={}", process_addr, size); + R_RETURN(cheat_process_manager.WriteCheatProcessMemoryUnsafe(process_addr, &data, size)); + } + + Result ICheatInterface::PauseCheatProcessUnsafe() { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.PauseCheatProcessUnsafe()); + } + + Result ICheatInterface::ResumeCheatProcessUnsafe() { + LOG_INFO(CheatEngine, "called"); + R_RETURN(cheat_process_manager.ResumeCheatProcessUnsafe()); + } +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_interface.h b/src/core/hle/service/dmnt/cheat_interface.h new file mode 100644 index 0000000000..91bf1a7960 --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_interface.h @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/service.h" + +namespace Core { + class System; +} + +namespace Kernel { + class KEvent; + class KReadableEvent; +} // namespace Kernel + +namespace Kernel::Svc { + struct MemoryInfo; +} + +namespace Service::DMNT { + struct CheatDefinition; + struct CheatEntry; + struct CheatProcessMetadata; + struct FrozenAddressEntry; + class CheatProcessManager; + + class ICheatInterface final : public ServiceFramework { + public: + explicit ICheatInterface(Core::System& system_, CheatProcessManager& manager); + ~ICheatInterface() override; + + private: + Result HasCheatProcess(Out out_has_cheat); + Result GetCheatProcessEvent(OutCopyHandle out_event); + Result GetCheatProcessMetadata(Out out_metadata); + Result ForceOpenCheatProcess(); + Result PauseCheatProcess(); + Result ResumeCheatProcess(); + Result ForceCloseCheatProcess(); + + Result GetCheatProcessMappingCount(Out out_count); + Result GetCheatProcessMappings( + Out out_count, u64 offset, + OutArray out_mappings); + Result ReadCheatProcessMemory(u64 address, u64 size, + OutBuffer out_buffer); + Result WriteCheatProcessMemory(u64 address, u64 size, InBuffer buffer); + + Result QueryCheatProcessMemory(Out out_mapping, u64 address); + Result GetCheatCount(Out out_count); + Result GetCheats(Out out_count, u64 offset, + OutArray out_cheats); + Result GetCheatById(OutLargeData out_cheat, u32 cheat_id); + Result ToggleCheat(u32 cheat_id); + + Result AddCheat(Out out_cheat_id, bool enabled, + InLargeData cheat_definition); + Result RemoveCheat(u32 cheat_id); + Result ReadStaticRegister(Out out_value, u8 register_index); + Result WriteStaticRegister(u8 register_index, u64 value); + Result ResetStaticRegisters(); + Result SetMasterCheat(InLargeData cheat_definition); + Result GetFrozenAddressCount(Out out_count); + Result GetFrozenAddresses( + Out out_count, u64 offset, + OutArray out_frozen_address); + Result GetFrozenAddress(Out out_frozen_address_entry, u64 address); + Result EnableFrozenAddress(Out out_value, u64 address, u64 width); + Result DisableFrozenAddress(u64 address); + + private: + void InitializeCheatManager(); + + Result ReadCheatProcessMemoryUnsafe(u64 process_addr, std::span out_data, size_t size); + Result WriteCheatProcessMemoryUnsafe(u64 process_addr, std::span data, size_t size); + + Result PauseCheatProcessUnsafe(); + Result ResumeCheatProcessUnsafe(); + + CheatProcessManager& cheat_process_manager; + }; +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_parser.cpp b/src/core/hle/service/dmnt/cheat_parser.cpp new file mode 100644 index 0000000000..eb8f298fa4 --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_parser.cpp @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include +#include + +#include "core/hle/service/dmnt/cheat_parser.h" + +#include "core/hle/service/dmnt/dmnt_types.h" + +namespace Service::DMNT { + CheatParser::CheatParser() {} + + CheatParser::~CheatParser() = default; + + std::vector CheatParser::Parse(std::string_view data) const { + std::vector out(1); + std::optional current_entry; + + for (std::size_t i = 0; i < data.size(); ++i) { + if (std::isspace(data[i])) { + continue; + } + + if (data[i] == '{') { + current_entry = 0; + + if (out[*current_entry].definition.num_opcodes > 0) { + return {}; + } + + std::size_t name_size{}; + const auto name = ExtractName(name_size, data, i + 1, '}'); + if (name.empty()) { + return {}; + } + + std::memcpy(out[*current_entry].definition.readable_name.data(), name.data(), + std::min(out[*current_entry].definition.readable_name.size(), + name.size())); + out[*current_entry] + .definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] = + '\0'; + + i += name_size + 1; + } else if (data[i] == '[') { + current_entry = out.size(); + out.emplace_back(); + + std::size_t name_size{}; + const auto name = ExtractName(name_size, data, i + 1, ']'); + if (name.empty()) { + return {}; + } + + std::memcpy(out[*current_entry].definition.readable_name.data(), name.data(), + std::min(out[*current_entry].definition.readable_name.size(), + name.size())); + out[*current_entry] + .definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] = + '\0'; + + i += name_size + 1; + } else if (std::isxdigit(data[i])) { + if (!current_entry || out[*current_entry].definition.num_opcodes >= + out[*current_entry].definition.opcodes.size()) { + return {}; + } + + const auto hex = std::string(data.substr(i, 8)); + if (!std::all_of(hex.begin(), hex.end(), ::isxdigit)) { + return {}; + } + + const auto value = static_cast(std::strtoul(hex.c_str(), nullptr, 0x10)); + out[*current_entry].definition.opcodes[out[*current_entry].definition.num_opcodes++] = + value; + + i += 7; // 7 because the for loop will increment by 1 more + } else { + return {}; + } + } + + out[0].enabled = out[0].definition.num_opcodes > 0; + out[0].cheat_id = 0; + + for (u32 i = 1; i < out.size(); ++i) { + out[i].enabled = out[i].definition.num_opcodes > 0; + out[i].cheat_id = i; + } + + return out; + } + + std::string_view CheatParser::ExtractName(std::size_t& out_name_size, std::string_view data, + std::size_t start_index, char match) const { + auto end_index = start_index; + while (data[end_index] != match) { + ++end_index; + if (end_index > data.size()) { + return {}; + } + } + + out_name_size = end_index - start_index; + + // Clamp name if it's too big + if (out_name_size > sizeof(CheatDefinition::readable_name)) { + end_index = start_index + sizeof(CheatDefinition::readable_name); + } + + return data.substr(start_index, end_index - start_index); + } +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_parser.h b/src/core/hle/service/dmnt/cheat_parser.h new file mode 100644 index 0000000000..9ff248a1e4 --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_parser.h @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +namespace Service::DMNT { + struct CheatEntry; + + class CheatParser final { + public: + CheatParser(); + ~CheatParser(); + + std::vector Parse(std::string_view data) const; + + private: + std::string_view ExtractName(std::size_t& out_name_size, std::string_view data, + std::size_t start_index, char match) const; + }; +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_process_manager.cpp b/src/core/hle/service/dmnt/cheat_process_manager.cpp new file mode 100644 index 0000000000..5fcb5df16f --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_process_manager.cpp @@ -0,0 +1,599 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/arm/debug.h" +#include "core/core.h" +#include "core/core_timing.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/dmnt/cheat_process_manager.h" +#include "core/hle/service/dmnt/cheat_virtual_machine.h" +#include "core/hle/service/dmnt/dmnt_results.h" +#include "core/hle/service/hid/hid_server.h" +#include "core/hle/service/sm/sm.h" +#include "hid_core/resource_manager.h" +#include "hid_core/resources/npad/npad.h" + +namespace Service::DMNT { + constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12}; + + CheatProcessManager::CheatProcessManager(Core::System& system_) + : system{system_}, service_context{system_, "dmnt:cht"}, core_timing{system_.CoreTiming()} { + update_event = Core::Timing::CreateEvent("CheatEngine::FrameCallback", + [this](s64 time, std::chrono::nanoseconds ns_late) + -> std::optional { + FrameCallback(ns_late); + return std::nullopt; + }); + + for (size_t i = 0; i < MaxCheatCount; i++) { + ResetCheatEntry(i); + } + + cheat_vm = std::make_unique(*this); + + cheat_process_event = service_context.CreateEvent("CheatProcessManager::ProcessEvent"); + unsafe_break_event = service_context.CreateEvent("CheatProcessManager::ProcessEvent"); + } + + CheatProcessManager::~CheatProcessManager() { + service_context.CloseEvent(cheat_process_event); + service_context.CloseEvent(unsafe_break_event); + core_timing.UnscheduleEvent(update_event); + } + + void CheatProcessManager::SetVirtualMachine(std::unique_ptr vm) { + if (vm) { + cheat_vm = std::move(vm); + SetNeedsReloadVm(true); + } + } + + bool CheatProcessManager::HasActiveCheatProcess() { + // Note: This function *MUST* be called only with the cheat lock held. + bool has_cheat_process = + cheat_process_debug_handle != InvalidHandle && + system.ApplicationProcess()->GetProcessId() == cheat_process_metadata.process_id; + + if (!has_cheat_process) { + CloseActiveCheatProcess(); + } + + return has_cheat_process; + } + + void CheatProcessManager::CloseActiveCheatProcess() { + if (cheat_process_debug_handle != InvalidHandle) { + broken_unsafe = false; + unsafe_break_event->Signal(); + core_timing.UnscheduleEvent(update_event); + + // Close resources. + cheat_process_debug_handle = InvalidHandle; + + // Save cheat toggles. + if (always_save_cheat_toggles || should_save_cheat_toggles) { + // TODO: save cheat toggles + should_save_cheat_toggles = false; + } + + cheat_process_metadata = {}; + + ResetAllCheatEntries(); + + { + auto it = frozen_addresses_map.begin(); + while (it != frozen_addresses_map.end()) { + it = frozen_addresses_map.erase(it); + } + } + + cheat_process_event->Signal(); + } + } + + Result CheatProcessManager::EnsureCheatProcess() { + R_UNLESS(HasActiveCheatProcess(), ResultCheatNotAttached); + R_SUCCEED(); + } + + void CheatProcessManager::SetNeedsReloadVm(bool reload) { + needs_reload_vm = reload; + } + + void CheatProcessManager::ResetCheatEntry(size_t i) { + if (i < MaxCheatCount) { + cheat_entries[i] = {}; + cheat_entries[i].cheat_id = static_cast(i); + + SetNeedsReloadVm(true); + } + } + + void CheatProcessManager::ResetAllCheatEntries() { + for (size_t i = 0; i < MaxCheatCount; i++) { + ResetCheatEntry(i); + } + + cheat_vm->ResetStaticRegisters(); + } + + CheatEntry* CheatProcessManager::GetCheatEntryById(size_t i) { + if (i < MaxCheatCount) { + return cheat_entries.data() + i; + } + + return nullptr; + } + + CheatEntry* CheatProcessManager::GetCheatEntryByReadableName(const char* readable_name) { + for (size_t i = 1; i < MaxCheatCount; i++) { + if (std::strncmp(cheat_entries[i].definition.readable_name.data(), readable_name, + sizeof(cheat_entries[i].definition.readable_name)) == 0) { + return cheat_entries.data() + i; + } + } + return nullptr; + } + + CheatEntry* CheatProcessManager::GetFreeCheatEntry() { + // Check all non-master cheats for availability. + for (size_t i = 1; i < MaxCheatCount; i++) { + if (cheat_entries[i].definition.num_opcodes == 0) { + return cheat_entries.data() + i; + } + } + + return nullptr; + } + + bool CheatProcessManager::HasCheatProcess() { + std::scoped_lock lk(cheat_lock); + return HasActiveCheatProcess(); + } + + Kernel::KReadableEvent& CheatProcessManager::GetCheatProcessEvent() const { + return cheat_process_event->GetReadableEvent(); + } + + Result CheatProcessManager::AttachToApplicationProcess(const std::array& build_id, + VAddr main_region_begin, + u64 main_region_size) { + std::scoped_lock lk(cheat_lock); + + { + if (this->HasActiveCheatProcess()) { + this->CloseActiveCheatProcess(); + } + } + + cheat_process_metadata.process_id = system.ApplicationProcess()->GetProcessId(); + + { + const auto& page_table = system.ApplicationProcess()->GetPageTable(); + cheat_process_metadata.program_id = system.GetApplicationProcessProgramID(); + cheat_process_metadata.heap_extents = { + .base = GetInteger(page_table.GetHeapRegionStart()), + .size = page_table.GetHeapRegionSize(), + }; + cheat_process_metadata.aslr_extents = { + .base = GetInteger(page_table.GetAliasCodeRegionStart()), + .size = page_table.GetAliasCodeRegionSize(), + }; + cheat_process_metadata.alias_extents = { + .base = GetInteger(page_table.GetAliasRegionStart()), + .size = page_table.GetAliasRegionSize(), + }; + } + + { + cheat_process_metadata.main_nso_extents = { + .base = main_region_begin, + .size = main_region_size, + }; + cheat_process_metadata.main_nso_build_id = build_id; + } + + cheat_process_debug_handle = cheat_process_metadata.process_id; + + broken_unsafe = false; + unsafe_break_event->Signal(); + + core_timing.ScheduleLoopingEvent(CHEAT_ENGINE_NS, CHEAT_ENGINE_NS, update_event); + LOG_INFO(CheatEngine, "Cheat engine started"); + + // Signal to our fans. + cheat_process_event->Signal(); + + R_SUCCEED(); + } + + Result CheatProcessManager::GetCheatProcessMetadata(CheatProcessMetadata& out_metadata) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + out_metadata = cheat_process_metadata; + R_SUCCEED(); + } + + Result CheatProcessManager::ForceOpenCheatProcess() { + // R_RETURN(AttachToApplicationProcess(false)); + R_SUCCEED(); + } + + Result CheatProcessManager::PauseCheatProcess() { + std::scoped_lock lk(cheat_lock); + + R_TRY(EnsureCheatProcess()); + R_RETURN(PauseCheatProcessUnsafe()); + } + + Result CheatProcessManager::PauseCheatProcessUnsafe() { + broken_unsafe = true; + unsafe_break_event->Clear(); + if (system.ApplicationProcess()->IsSuspended()) { + R_SUCCEED(); + } + R_RETURN(system.ApplicationProcess()->SetActivity(Kernel::Svc::ProcessActivity::Paused)); + } + + Result CheatProcessManager::ResumeCheatProcess() { + std::scoped_lock lk(cheat_lock); + + R_TRY(EnsureCheatProcess()); + R_RETURN(ResumeCheatProcessUnsafe()); + } + + Result CheatProcessManager::ResumeCheatProcessUnsafe() { + broken_unsafe = true; + unsafe_break_event->Clear(); + if (!system.ApplicationProcess()->IsSuspended()) { + R_SUCCEED(); + } + system.ApplicationProcess()->SetActivity(Kernel::Svc::ProcessActivity::Runnable); + R_SUCCEED(); + } + + Result CheatProcessManager::ForceCloseCheatProcess() { + CloseActiveCheatProcess(); + R_SUCCEED(); + } + + Result CheatProcessManager::GetCheatProcessMappingCount(u64& out_count) { + std::scoped_lock lk(cheat_lock); + R_TRY(this->EnsureCheatProcess()); + + // TODO: Call svc::QueryDebugProcessMemory + + out_count = 0; + R_SUCCEED(); + } + + Result CheatProcessManager::GetCheatProcessMappings( + u64& out_count, u64 offset, std::span out_mappings) { + std::scoped_lock lk(cheat_lock); + R_TRY(this->EnsureCheatProcess()); + + // TODO: Call svc::QueryDebugProcessMemory + + out_count = 0; + R_SUCCEED(); + } + + Result CheatProcessManager::ReadCheatProcessMemory(u64 process_address, u64 size, + std::span out_data) { + std::scoped_lock lk(cheat_lock); + + R_TRY(EnsureCheatProcess()); + R_RETURN(ReadCheatProcessMemoryUnsafe(process_address, &out_data, size)); + } + + Result CheatProcessManager::ReadCheatProcessMemoryUnsafe(u64 process_address, void* out_data, + size_t size) { + if (!system.ApplicationMemory().IsValidVirtualAddress(process_address)) { + std::memset(out_data, 0, size); + R_SUCCEED(); + } + + system.ApplicationMemory().ReadBlock(process_address, out_data, size); + R_SUCCEED(); + } + + Result CheatProcessManager::WriteCheatProcessMemory(u64 process_address, u64 size, + std::span data) { + std::scoped_lock lk(cheat_lock); + + R_TRY(EnsureCheatProcess()); + R_RETURN(WriteCheatProcessMemoryUnsafe(process_address, &data, size)); + } + + Result CheatProcessManager::WriteCheatProcessMemoryUnsafe(u64 process_address, const void* data, + size_t size) { + if (!system.ApplicationMemory().IsValidVirtualAddress(process_address)) { + R_SUCCEED(); + } + + if (system.ApplicationMemory().WriteBlock(process_address, data, size)) { + Core::InvalidateInstructionCacheRange(system.ApplicationProcess(), process_address, size); + } + + R_SUCCEED(); + } + + Result CheatProcessManager::QueryCheatProcessMemory(Out mapping, + u64 address) { + std::scoped_lock lk(cheat_lock); + R_TRY(this->EnsureCheatProcess()); + + // TODO: Call svc::QueryDebugProcessMemory + R_SUCCEED(); + } + + Result CheatProcessManager::GetCheatCount(u64& out_count) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + out_count = std::count_if(cheat_entries.begin(), cheat_entries.end(), + [](const auto& entry) { return entry.definition.num_opcodes != 0; }); + R_SUCCEED(); + } + + Result CheatProcessManager::GetCheats(u64& out_count, u64 offset, + std::span out_cheats) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + size_t count = 0, total_count = 0; + for (size_t i = 0; i < MaxCheatCount && count < out_cheats.size(); i++) { + if (cheat_entries[i].definition.num_opcodes) { + total_count++; + if (total_count > offset) { + out_cheats[count++] = cheat_entries[i]; + } + } + } + + out_count = count; + R_SUCCEED(); + } + + Result CheatProcessManager::GetCheatById(CheatEntry* out_cheat, u32 cheat_id) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + const CheatEntry* entry = GetCheatEntryById(cheat_id); + R_UNLESS(entry != nullptr, ResultCheatUnknownId); + R_UNLESS(entry->definition.num_opcodes != 0, ResultCheatUnknownId); + + *out_cheat = *entry; + R_SUCCEED(); + } + + Result CheatProcessManager::ToggleCheat(u32 cheat_id) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + CheatEntry* entry = GetCheatEntryById(cheat_id); + R_UNLESS(entry != nullptr, ResultCheatUnknownId); + R_UNLESS(entry->definition.num_opcodes != 0, ResultCheatUnknownId); + + R_UNLESS(cheat_id != 0, ResultCheatCannotDisable); + + entry->enabled = !entry->enabled; + + SetNeedsReloadVm(true); + + R_SUCCEED(); + } + + Result CheatProcessManager::AddCheat(u32& out_cheat_id, bool enabled, + const CheatDefinition& cheat_definition) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + R_UNLESS(cheat_definition.num_opcodes != 0, ResultCheatInvalid); + R_UNLESS(cheat_definition.num_opcodes <= cheat_definition.opcodes.size(), ResultCheatInvalid); + + CheatEntry* new_entry = GetFreeCheatEntry(); + R_UNLESS(new_entry != nullptr, ResultCheatOutOfResource); + + new_entry->enabled = enabled; + new_entry->definition = cheat_definition; + + SetNeedsReloadVm(true); + + out_cheat_id = new_entry->cheat_id; + + R_SUCCEED(); + } + + Result CheatProcessManager::RemoveCheat(u32 cheat_id) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + R_UNLESS(cheat_id < MaxCheatCount, ResultCheatUnknownId); + + ResetCheatEntry(cheat_id); + SetNeedsReloadVm(true); + R_SUCCEED(); + } + + Result CheatProcessManager::ReadStaticRegister(u64& out_value, u64 register_index) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + R_UNLESS(register_index < CheatVirtualMachine::NumStaticRegisters, ResultCheatInvalid); + + out_value = cheat_vm->GetStaticRegister(register_index); + R_SUCCEED(); + } + + Result CheatProcessManager::WriteStaticRegister(u64 register_index, u64 value) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + R_UNLESS(register_index < CheatVirtualMachine::NumStaticRegisters, ResultCheatInvalid); + + cheat_vm->SetStaticRegister(register_index, value); + R_SUCCEED(); + } + + Result CheatProcessManager::ResetStaticRegisters() { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + cheat_vm->ResetStaticRegisters(); + R_SUCCEED(); + } + + Result CheatProcessManager::SetMasterCheat(const CheatDefinition& cheat_definition) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + R_UNLESS(cheat_definition.num_opcodes != 0, ResultCheatInvalid); + R_UNLESS(cheat_definition.num_opcodes <= cheat_definition.opcodes.size(), ResultCheatInvalid); + + cheat_entries[0] = { + .enabled = true, + .definition = cheat_definition, + }; + + SetNeedsReloadVm(true); + + R_SUCCEED(); + } + + Result CheatProcessManager::GetFrozenAddressCount(u64& out_count) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + out_count = std::distance(frozen_addresses_map.begin(), frozen_addresses_map.end()); + R_SUCCEED(); + } + + Result CheatProcessManager::GetFrozenAddresses(u64& out_count, u64 offset, + std::span out_frozen_address) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + u64 total_count = 0, written_count = 0; + for (const auto& [address, value] : frozen_addresses_map) { + if (written_count >= out_frozen_address.size()) { + break; + } + + if (offset <= total_count) { + out_frozen_address[written_count].address = address; + out_frozen_address[written_count].value = value; + written_count++; + } + total_count++; + } + + out_count = written_count; + R_SUCCEED(); + } + + Result CheatProcessManager::GetFrozenAddress(FrozenAddressEntry& out_frozen_address_entry, + u64 address) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + const auto it = frozen_addresses_map.find(address); + R_UNLESS(it != frozen_addresses_map.end(), ResultFrozenAddressNotFound); + + out_frozen_address_entry = { + .address = it->first, + .value = it->second, + }; + R_SUCCEED(); + } + + Result CheatProcessManager::EnableFrozenAddress(u64& out_value, u64 address, u64 width) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + const auto it = frozen_addresses_map.find(address); + R_UNLESS(it == frozen_addresses_map.end(), ResultFrozenAddressAlreadyExists); + + FrozenAddressValue value{}; + value.width = static_cast(width); + R_TRY(ReadCheatProcessMemoryUnsafe(address, &value.value, width)); + + frozen_addresses_map.insert({address, value}); + out_value = value.value; + R_SUCCEED(); + } + + Result CheatProcessManager::DisableFrozenAddress(u64 address) { + std::scoped_lock lk(cheat_lock); + R_TRY(EnsureCheatProcess()); + + const auto it = frozen_addresses_map.find(address); + R_UNLESS(it != frozen_addresses_map.end(), ResultFrozenAddressNotFound); + + frozen_addresses_map.erase(it); + + R_SUCCEED(); + } + + u64 CheatProcessManager::HidKeysDown() const { + const auto hid = system.ServiceManager().GetService("hid"); + if (hid == nullptr) { + LOG_WARNING(CheatEngine, "Attempted to read input state, but hid is not initialized!"); + return 0; + } + + const auto applet_resource = hid->GetResourceManager(); + if (applet_resource == nullptr || applet_resource->GetNpad() == nullptr) { + LOG_WARNING(CheatEngine, + "Attempted to read input state, but applet resource is not initialized!"); + return 0; + } + + const auto press_state = applet_resource->GetNpad()->GetAndResetPressState(); + return static_cast(press_state & Core::HID::NpadButton::All); + } + + void CheatProcessManager::DebugLog(u8 id, u64 value) const { + LOG_INFO(CheatEngine, "Cheat triggered DebugLog: ID '{:01X}' Value '{:016X}'", id, value); + } + + void CheatProcessManager::CommandLog(std::string_view data) const { + LOG_DEBUG(CheatEngine, "[DmntCheatVm]: {}", + data.back() == '\n' ? data.substr(0, data.size() - 1) : data); + } + + void CheatProcessManager::FrameCallback(std::chrono::nanoseconds ns_late) { + std::scoped_lock lk(cheat_lock); + + if (cheat_vm == nullptr) { + LOG_DEBUG(CheatEngine, "FrameCallback: VM is null"); + return; + } + + if (needs_reload_vm) { + LOG_INFO(CheatEngine, "Reloading cheat VM with {} entries", cheat_entries.size()); + + size_t enabled_count = 0; + for (const auto& entry : cheat_entries) { + if (entry.enabled && entry.definition.num_opcodes > 0) { + enabled_count++; + LOG_INFO(CheatEngine, " Cheat '{}': {} opcodes, enabled={}", + entry.definition.readable_name.data(), + entry.definition.num_opcodes, entry.enabled); + } + } + LOG_INFO(CheatEngine, "Total enabled cheats: {}", enabled_count); + + cheat_vm->LoadProgram(cheat_entries); + LOG_INFO(CheatEngine, "Cheat VM loaded, program size: {}", cheat_vm->GetProgramSize()); + needs_reload_vm = false; + } + + if (cheat_vm->GetProgramSize() == 0) { + return; + } + + cheat_vm->Execute(cheat_process_metadata); + } +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_process_manager.h b/src/core/hle/service/dmnt/cheat_process_manager.h new file mode 100644 index 0000000000..bbf0782921 --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_process_manager.h @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/dmnt/dmnt_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/service.h" + +#include "common/intrusive_red_black_tree.h" + +namespace Core { + class System; +} + +namespace Kernel { + class KEvent; + class KReadableEvent; +} // namespace Kernel + +namespace Kernel::Svc { + struct MemoryInfo; +} + +namespace Service::DMNT { + class CheatVirtualMachine; + + class CheatProcessManager final { + public: + static constexpr size_t MaxCheatCount = 0x80; + static constexpr size_t MaxFrozenAddressCount = 0x80; + + CheatProcessManager(Core::System& system_); + ~CheatProcessManager(); + + void SetVirtualMachine(std::unique_ptr vm); + + bool HasCheatProcess(); + Kernel::KReadableEvent& GetCheatProcessEvent() const; + Result GetCheatProcessMetadata(CheatProcessMetadata& out_metadata); + Result AttachToApplicationProcess(const std::array& build_id, VAddr main_region_begin, + u64 main_region_size); + Result ForceOpenCheatProcess(); + Result PauseCheatProcess(); + Result PauseCheatProcessUnsafe(); + Result ResumeCheatProcess(); + Result ResumeCheatProcessUnsafe(); + Result ForceCloseCheatProcess(); + + Result GetCheatProcessMappingCount(u64& out_count); + Result GetCheatProcessMappings(u64& out_count, u64 offset, + std::span out_mappings); + Result ReadCheatProcessMemory(u64 process_address, u64 size, std::span out_data); + Result ReadCheatProcessMemoryUnsafe(u64 process_address, void* out_data, size_t size); + Result WriteCheatProcessMemory(u64 process_address, u64 size, std::span data); + Result WriteCheatProcessMemoryUnsafe(u64 process_address, const void* data, size_t size); + + Result QueryCheatProcessMemory(Out mapping, u64 address); + Result GetCheatCount(u64& out_count); + Result GetCheats(u64& out_count, u64 offset, std::span out_cheats); + Result GetCheatById(CheatEntry* out_cheat, u32 cheat_id); + Result ToggleCheat(u32 cheat_id); + + Result AddCheat(u32& out_cheat_id, bool enabled, const CheatDefinition& cheat_definition); + Result RemoveCheat(u32 cheat_id); + Result ReadStaticRegister(u64& out_value, u64 register_index); + Result WriteStaticRegister(u64 register_index, u64 value); + Result ResetStaticRegisters(); + Result SetMasterCheat(const CheatDefinition& cheat_definition); + Result GetFrozenAddressCount(u64& out_count); + Result GetFrozenAddresses(u64& out_count, u64 offset, + std::span out_frozen_address); + Result GetFrozenAddress(FrozenAddressEntry& out_frozen_address_entry, u64 address); + Result EnableFrozenAddress(u64& out_value, u64 address, u64 width); + Result DisableFrozenAddress(u64 address); + + u64 HidKeysDown() const; + void DebugLog(u8 id, u64 value) const; + void CommandLog(std::string_view data) const; + + private: + bool HasActiveCheatProcess(); + void CloseActiveCheatProcess(); + Result EnsureCheatProcess(); + void SetNeedsReloadVm(bool reload); + void ResetCheatEntry(size_t i); + void ResetAllCheatEntries(); + CheatEntry* GetCheatEntryById(size_t i); + CheatEntry* GetCheatEntryByReadableName(const char* readable_name); + CheatEntry* GetFreeCheatEntry(); + + void FrameCallback(std::chrono::nanoseconds ns_late); + + static constexpr u64 InvalidHandle = 0; + + mutable std::mutex cheat_lock; + Kernel::KEvent* unsafe_break_event; + + Kernel::KEvent* cheat_process_event; + u64 cheat_process_debug_handle = InvalidHandle; + CheatProcessMetadata cheat_process_metadata = {}; + + bool broken_unsafe = false; + bool needs_reload_vm = false; + std::unique_ptr cheat_vm; + + bool enable_cheats_by_default = true; + bool always_save_cheat_toggles = false; + bool should_save_cheat_toggles = false; + std::array cheat_entries = {}; + // TODO: Replace with IntrusiveRedBlackTree + std::map frozen_addresses_map = {}; + + Core::System& system; + KernelHelpers::ServiceContext service_context; + std::shared_ptr update_event; + Core::Timing::CoreTiming& core_timing; + }; +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_virtual_machine.cpp b/src/core/hle/service/dmnt/cheat_virtual_machine.cpp new file mode 100644 index 0000000000..6d78f1115f --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_virtual_machine.cpp @@ -0,0 +1,1269 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include "common/assert.h" +#include "common/scope_exit.h" +#include "core/hle/service/dmnt/cheat_process_manager.h" +#include "core/hle/service/dmnt/cheat_virtual_machine.h" + +namespace Service::DMNT { + CheatVirtualMachine::CheatVirtualMachine(CheatProcessManager& cheat_manager) + : manager(cheat_manager) {} + + CheatVirtualMachine::~CheatVirtualMachine() = default; + + void CheatVirtualMachine::DebugLog(u32 log_id, u64 value) const { + manager.DebugLog(static_cast(log_id), value); + } + + void CheatVirtualMachine::LogOpcode(const CheatVmOpcode& opcode) const { + if (auto store_static = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Store Static"); + manager.CommandLog(fmt::format("Bit Width: {:X}", store_static->bit_width)); + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(store_static->mem_type))); + manager.CommandLog(fmt::format("Reg Idx: {:X}", store_static->offset_register)); + manager.CommandLog(fmt::format("Rel Addr: {:X}", store_static->rel_address)); + manager.CommandLog(fmt::format("Value: {:X}", store_static->value.bit64)); + } else if (auto begin_cond = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Begin Conditional"); + manager.CommandLog(fmt::format("Bit Width: {:X}", begin_cond->bit_width)); + manager.CommandLog(fmt::format("Mem Type: {:X}", static_cast(begin_cond->mem_type))); + manager.CommandLog(fmt::format("Cond Type: {:X}", static_cast(begin_cond->cond_type))); + manager.CommandLog(fmt::format("Rel Addr: {:X}", begin_cond->rel_address)); + manager.CommandLog(fmt::format("Value: {:X}", begin_cond->value.bit64)); + } else if (std::holds_alternative(opcode.opcode)) { + manager.CommandLog("Opcode: End Conditional"); + } else if (auto ctrl_loop = std::get_if(&opcode.opcode)) { + if (ctrl_loop->start_loop) { + manager.CommandLog("Opcode: Start Loop"); + manager.CommandLog(fmt::format("Reg Idx: {:X}", ctrl_loop->reg_index)); + manager.CommandLog(fmt::format("Num Iters: {:X}", ctrl_loop->num_iters)); + } else { + manager.CommandLog("Opcode: End Loop"); + manager.CommandLog(fmt::format("Reg Idx: {:X}", ctrl_loop->reg_index)); + } + } else if (auto ldr_static = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Load Register Static"); + manager.CommandLog(fmt::format("Reg Idx: {:X}", ldr_static->reg_index)); + manager.CommandLog(fmt::format("Value: {:X}", ldr_static->value)); + } else if (auto ldr_memory = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Load Register Memory"); + manager.CommandLog(fmt::format("Bit Width: {:X}", ldr_memory->bit_width)); + manager.CommandLog(fmt::format("Reg Idx: {:X}", ldr_memory->reg_index)); + manager.CommandLog(fmt::format("Mem Type: {:X}", static_cast(ldr_memory->mem_type))); + manager.CommandLog(fmt::format("From Reg: {:d}", ldr_memory->load_from_reg)); + manager.CommandLog(fmt::format("Rel Addr: {:X}", ldr_memory->rel_address)); + } else if (auto str_static = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Store Static to Address"); + manager.CommandLog(fmt::format("Bit Width: {:X}", str_static->bit_width)); + manager.CommandLog(fmt::format("Reg Idx: {:X}", str_static->reg_index)); + if (str_static->add_offset_reg) { + manager.CommandLog(fmt::format("O Reg Idx: {:X}", str_static->offset_reg_index)); + } + manager.CommandLog(fmt::format("Incr Reg: {:d}", str_static->increment_reg)); + manager.CommandLog(fmt::format("Value: {:X}", str_static->value)); + } else if (auto perform_math_static = + std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Perform Static Arithmetic"); + manager.CommandLog(fmt::format("Bit Width: {:X}", perform_math_static->bit_width)); + manager.CommandLog(fmt::format("Reg Idx: {:X}", perform_math_static->reg_index)); + manager.CommandLog( + fmt::format("Math Type: {:X}", static_cast(perform_math_static->math_type))); + manager.CommandLog(fmt::format("Value: {:X}", perform_math_static->value)); + } else if (auto begin_keypress_cond = + std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Begin Keypress Conditional"); + manager.CommandLog(fmt::format("Key Mask: {:X}", begin_keypress_cond->key_mask)); + } else if (auto perform_math_reg = + std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Perform Register Arithmetic"); + manager.CommandLog(fmt::format("Bit Width: {:X}", perform_math_reg->bit_width)); + manager.CommandLog(fmt::format("Dst Idx: {:X}", perform_math_reg->dst_reg_index)); + manager.CommandLog(fmt::format("Src1 Idx: {:X}", perform_math_reg->src_reg_1_index)); + if (perform_math_reg->has_immediate) { + manager.CommandLog(fmt::format("Value: {:X}", perform_math_reg->value.bit64)); + } else { + manager.CommandLog(fmt::format("Src2 Idx: {:X}", perform_math_reg->src_reg_2_index)); + } + } else if (auto str_register = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Store Register to Address"); + manager.CommandLog(fmt::format("Bit Width: {:X}", str_register->bit_width)); + manager.CommandLog(fmt::format("S Reg Idx: {:X}", str_register->str_reg_index)); + manager.CommandLog(fmt::format("A Reg Idx: {:X}", str_register->addr_reg_index)); + manager.CommandLog(fmt::format("Incr Reg: {:d}", str_register->increment_reg)); + switch (str_register->ofs_type) { + case StoreRegisterOffsetType::None: + break; + case StoreRegisterOffsetType::Reg: + manager.CommandLog(fmt::format("O Reg Idx: {:X}", str_register->ofs_reg_index)); + break; + case StoreRegisterOffsetType::Imm: + manager.CommandLog(fmt::format("Rel Addr: {:X}", str_register->rel_address)); + break; + case StoreRegisterOffsetType::MemReg: + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(str_register->mem_type))); + break; + case StoreRegisterOffsetType::MemImm: + case StoreRegisterOffsetType::MemImmReg: + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(str_register->mem_type))); + manager.CommandLog(fmt::format("Rel Addr: {:X}", str_register->rel_address)); + break; + } + } else if (auto begin_reg_cond = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Begin Register Conditional"); + manager.CommandLog(fmt::format("Bit Width: {:X}", begin_reg_cond->bit_width)); + manager.CommandLog( + fmt::format("Cond Type: {:X}", static_cast(begin_reg_cond->cond_type))); + manager.CommandLog(fmt::format("V Reg Idx: {:X}", begin_reg_cond->val_reg_index)); + switch (begin_reg_cond->comp_type) { + case CompareRegisterValueType::StaticValue: + manager.CommandLog("Comp Type: Static Value"); + manager.CommandLog(fmt::format("Value: {:X}", begin_reg_cond->value.bit64)); + break; + case CompareRegisterValueType::OtherRegister: + manager.CommandLog("Comp Type: Other Register"); + manager.CommandLog(fmt::format("X Reg Idx: {:X}", begin_reg_cond->other_reg_index)); + break; + case CompareRegisterValueType::MemoryRelAddr: + manager.CommandLog("Comp Type: Memory Relative Address"); + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(begin_reg_cond->mem_type))); + manager.CommandLog(fmt::format("Rel Addr: {:X}", begin_reg_cond->rel_address)); + break; + case CompareRegisterValueType::MemoryOfsReg: + manager.CommandLog("Comp Type: Memory Offset Register"); + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(begin_reg_cond->mem_type))); + manager.CommandLog(fmt::format("O Reg Idx: {:X}", begin_reg_cond->ofs_reg_index)); + break; + case CompareRegisterValueType::RegisterRelAddr: + manager.CommandLog("Comp Type: Register Relative Address"); + manager.CommandLog(fmt::format("A Reg Idx: {:X}", begin_reg_cond->addr_reg_index)); + manager.CommandLog(fmt::format("Rel Addr: {:X}", begin_reg_cond->rel_address)); + break; + case CompareRegisterValueType::RegisterOfsReg: + manager.CommandLog("Comp Type: Register Offset Register"); + manager.CommandLog(fmt::format("A Reg Idx: {:X}", begin_reg_cond->addr_reg_index)); + manager.CommandLog(fmt::format("O Reg Idx: {:X}", begin_reg_cond->ofs_reg_index)); + break; + } + } else if (auto save_restore_reg = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Save or Restore Register"); + manager.CommandLog(fmt::format("Dst Idx: {:X}", save_restore_reg->dst_index)); + manager.CommandLog(fmt::format("Src Idx: {:X}", save_restore_reg->src_index)); + manager.CommandLog( + fmt::format("Op Type: {:d}", static_cast(save_restore_reg->op_type))); + } else if (auto save_restore_regmask = + std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Save or Restore Register Mask"); + manager.CommandLog( + fmt::format("Op Type: {:d}", static_cast(save_restore_regmask->op_type))); + for (std::size_t i = 0; i < NumRegisters; i++) { + manager.CommandLog( + fmt::format("Act[{:02X}]: {:d}", i, save_restore_regmask->should_operate[i])); + } + } else if (auto rw_static_reg = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Read/Write Static Register"); + if (rw_static_reg->static_idx < NumReadableStaticRegisters) { + manager.CommandLog("Op Type: ReadStaticRegister"); + } else { + manager.CommandLog("Op Type: WriteStaticRegister"); + } + manager.CommandLog(fmt::format("Reg Idx {:X}", rw_static_reg->idx)); + manager.CommandLog(fmt::format("Stc Idx {:X}", rw_static_reg->static_idx)); + } else if (auto debug_log = std::get_if(&opcode.opcode)) { + manager.CommandLog("Opcode: Debug Log"); + manager.CommandLog(fmt::format("Bit Width: {:X}", debug_log->bit_width)); + manager.CommandLog(fmt::format("Log ID: {:X}", debug_log->log_id)); + manager.CommandLog(fmt::format("Val Type: {:X}", static_cast(debug_log->val_type))); + switch (debug_log->val_type) { + case DebugLogValueType::RegisterValue: + manager.CommandLog("Val Type: Register Value"); + manager.CommandLog(fmt::format("X Reg Idx: {:X}", debug_log->val_reg_index)); + break; + case DebugLogValueType::MemoryRelAddr: + manager.CommandLog("Val Type: Memory Relative Address"); + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(debug_log->mem_type))); + manager.CommandLog(fmt::format("Rel Addr: {:X}", debug_log->rel_address)); + break; + case DebugLogValueType::MemoryOfsReg: + manager.CommandLog("Val Type: Memory Offset Register"); + manager.CommandLog( + fmt::format("Mem Type: {:X}", static_cast(debug_log->mem_type))); + manager.CommandLog(fmt::format("O Reg Idx: {:X}", debug_log->ofs_reg_index)); + break; + case DebugLogValueType::RegisterRelAddr: + manager.CommandLog("Val Type: Register Relative Address"); + manager.CommandLog(fmt::format("A Reg Idx: {:X}", debug_log->addr_reg_index)); + manager.CommandLog(fmt::format("Rel Addr: {:X}", debug_log->rel_address)); + break; + case DebugLogValueType::RegisterOfsReg: + manager.CommandLog("Val Type: Register Offset Register"); + manager.CommandLog(fmt::format("A Reg Idx: {:X}", debug_log->addr_reg_index)); + manager.CommandLog(fmt::format("O Reg Idx: {:X}", debug_log->ofs_reg_index)); + break; + } + } else if (auto instr = std::get_if(&opcode.opcode)) { + manager.CommandLog(fmt::format("Unknown opcode: {:X}", static_cast(instr->opcode))); + } + } + + bool CheatVirtualMachine::DecodeNextOpcode(CheatVmOpcode& out) { + // If we've ever seen a decode failure, return false. + bool valid = decode_success; + CheatVmOpcode opcode = {}; + SCOPE_EXIT { + decode_success &= valid; + if (valid) { + out = opcode; + } + }; + + // Helper function for getting instruction dwords. + const auto GetNextDword = [&] { + if (instruction_ptr >= num_opcodes) { + valid = false; + return static_cast(0); + } + return program[instruction_ptr++]; + }; + + // Helper function for parsing a VmInt. + const auto GetNextVmInt = [&](const u32 bit_width) { + VmInt val{}; + + const u32 first_dword = GetNextDword(); + switch (bit_width) { + case 1: + val.bit8 = static_cast(first_dword); + break; + case 2: + val.bit16 = static_cast(first_dword); + break; + case 4: + val.bit32 = first_dword; + break; + case 8: + val.bit64 = (static_cast(first_dword) << 32ul) | static_cast(GetNextDword()); + break; + } + + return val; + }; + + // Read opcode. + const u32 first_dword = GetNextDword(); + if (!valid) { + return valid; + } + + auto opcode_type = static_cast(((first_dword >> 28) & 0xF)); + if (opcode_type >= CheatVmOpcodeType::ExtendedWidth) { + opcode_type = static_cast((static_cast(opcode_type) << 4) | + ((first_dword >> 24) & 0xF)); + } + if (opcode_type >= CheatVmOpcodeType::DoubleExtendedWidth) { + opcode_type = static_cast((static_cast(opcode_type) << 4) | + ((first_dword >> 20) & 0xF)); + } + + // detect condition start. + switch (opcode_type) { + case CheatVmOpcodeType::BeginConditionalBlock: + case CheatVmOpcodeType::BeginKeypressConditionalBlock: + case CheatVmOpcodeType::BeginRegisterConditionalBlock: + opcode.begin_conditional_block = true; + break; + default: + opcode.begin_conditional_block = false; + break; + } + + switch (opcode_type) { + case CheatVmOpcodeType::StoreStatic: { + // 0TMR00AA AAAAAAAA YYYYYYYY (YYYYYYYY) + // Read additional words. + const u32 second_dword = GetNextDword(); + const u32 bit_width = (first_dword >> 24) & 0xF; + + opcode.opcode = StoreStaticOpcode{ + .bit_width = bit_width, + .mem_type = static_cast((first_dword >> 20) & 0xF), + .offset_register = (first_dword >> 16) & 0xF, + .rel_address = (static_cast(first_dword & 0xFF) << 32) | second_dword, + .value = GetNextVmInt(bit_width), + }; + } break; + case CheatVmOpcodeType::BeginConditionalBlock: { + // 1TMC00AA AAAAAAAA YYYYYYYY (YYYYYYYY) + // Read additional words. + const u32 second_dword = GetNextDword(); + const u32 bit_width = (first_dword >> 24) & 0xF; + + opcode.opcode = BeginConditionalOpcode{ + .bit_width = bit_width, + .mem_type = static_cast((first_dword >> 20) & 0xF), + .cond_type = static_cast((first_dword >> 16) & 0xF), + .rel_address = (static_cast(first_dword & 0xFF) << 32) | second_dword, + .value = GetNextVmInt(bit_width), + }; + } break; + case CheatVmOpcodeType::EndConditionalBlock: { + // 20000000 + opcode.opcode = EndConditionalOpcode{ + .is_else = ((first_dword >> 24) & 0xf) == 1, + }; + } break; + case CheatVmOpcodeType::ControlLoop: { + // 300R0000 VVVVVVVV + // 310R0000 + // Parse register, whether loop start or loop end. + ControlLoopOpcode ctrl_loop{ + .start_loop = ((first_dword >> 24) & 0xF) == 0, + .reg_index = (first_dword >> 20) & 0xF, + .num_iters = 0, + }; + + // Read number of iters if loop start. + if (ctrl_loop.start_loop) { + ctrl_loop.num_iters = GetNextDword(); + } + opcode.opcode = ctrl_loop; + } break; + case CheatVmOpcodeType::LoadRegisterStatic: { + // 400R0000 VVVVVVVV VVVVVVVV + // Read additional words. + opcode.opcode = LoadRegisterStaticOpcode{ + .reg_index = (first_dword >> 16) & 0xF, + .value = (static_cast(GetNextDword()) << 32) | GetNextDword(), + }; + } break; + case CheatVmOpcodeType::LoadRegisterMemory: { + // 5TMRI0AA AAAAAAAA + // Read additional words. + const u32 second_dword = GetNextDword(); + opcode.opcode = LoadRegisterMemoryOpcode{ + .bit_width = (first_dword >> 24) & 0xF, + .mem_type = static_cast((first_dword >> 20) & 0xF), + .reg_index = ((first_dword >> 16) & 0xF), + .load_from_reg = ((first_dword >> 12) & 0xF) != 0, + .rel_address = (static_cast(first_dword & 0xFF) << 32) | second_dword, + }; + } break; + case CheatVmOpcodeType::StoreStaticToAddress: { + // 6T0RIor0 VVVVVVVV VVVVVVVV + // Read additional words. + opcode.opcode = StoreStaticToAddressOpcode{ + .bit_width = (first_dword >> 24) & 0xF, + .reg_index = (first_dword >> 16) & 0xF, + .increment_reg = ((first_dword >> 12) & 0xF) != 0, + .add_offset_reg = ((first_dword >> 8) & 0xF) != 0, + .offset_reg_index = (first_dword >> 4) & 0xF, + .value = (static_cast(GetNextDword()) << 32) | GetNextDword(), + }; + } break; + case CheatVmOpcodeType::PerformArithmeticStatic: { + // 7T0RC000 VVVVVVVV + // Read additional words. + opcode.opcode = PerformArithmeticStaticOpcode{ + .bit_width = (first_dword >> 24) & 0xF, + .reg_index = ((first_dword >> 16) & 0xF), + .math_type = static_cast((first_dword >> 12) & 0xF), + .value = GetNextDword(), + }; + } break; + case CheatVmOpcodeType::BeginKeypressConditionalBlock: { + // 8kkkkkkk + // Just parse the mask. + opcode.opcode = BeginKeypressConditionalOpcode{ + .key_mask = first_dword & 0x0FFFFFFF, + }; + } break; + case CheatVmOpcodeType::PerformArithmeticRegister: { + // 9TCRSIs0 (VVVVVVVV (VVVVVVVV)) + PerformArithmeticRegisterOpcode perform_math_reg{ + .bit_width = (first_dword >> 24) & 0xF, + .math_type = static_cast((first_dword >> 20) & 0xF), + .dst_reg_index = (first_dword >> 16) & 0xF, + .src_reg_1_index = (first_dword >> 12) & 0xF, + .src_reg_2_index = 0, + .has_immediate = ((first_dword >> 8) & 0xF) != 0, + .value = {}, + }; + if (perform_math_reg.has_immediate) { + perform_math_reg.src_reg_2_index = 0; + perform_math_reg.value = GetNextVmInt(perform_math_reg.bit_width); + } else { + perform_math_reg.src_reg_2_index = ((first_dword >> 4) & 0xF); + } + opcode.opcode = perform_math_reg; + } break; + case CheatVmOpcodeType::StoreRegisterToAddress: { + // ATSRIOxa (aaaaaaaa) + // A = opcode 10 + // T = bit width + // S = src register index + // R = address register index + // I = 1 if increment address register, 0 if not increment address register + // O = offset type, 0 = None, 1 = Register, 2 = Immediate, 3 = Memory Region, + // 4 = Memory Region + Relative Address (ignore address register), 5 = Memory Region + + // Relative Address + // x = offset register (for offset type 1), memory type (for offset type 3) + // a = relative address (for offset type 2+3) + StoreRegisterToAddressOpcode str_register{ + .bit_width = (first_dword >> 24) & 0xF, + .str_reg_index = (first_dword >> 20) & 0xF, + .addr_reg_index = (first_dword >> 16) & 0xF, + .increment_reg = ((first_dword >> 12) & 0xF) != 0, + .ofs_type = static_cast(((first_dword >> 8) & 0xF)), + .mem_type = MemoryAccessType::MainNso, + .ofs_reg_index = (first_dword >> 4) & 0xF, + .rel_address = 0, + }; + switch (str_register.ofs_type) { + case StoreRegisterOffsetType::None: + case StoreRegisterOffsetType::Reg: + // Nothing more to do + break; + case StoreRegisterOffsetType::Imm: + str_register.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); + break; + case StoreRegisterOffsetType::MemReg: + str_register.mem_type = static_cast((first_dword >> 4) & 0xF); + break; + case StoreRegisterOffsetType::MemImm: + case StoreRegisterOffsetType::MemImmReg: + str_register.mem_type = static_cast((first_dword >> 4) & 0xF); + str_register.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); + break; + default: + str_register.ofs_type = StoreRegisterOffsetType::None; + break; + } + opcode.opcode = str_register; + } break; + case CheatVmOpcodeType::BeginRegisterConditionalBlock: { + // C0TcSX## + // C0TcS0Ma aaaaaaaa + // C0TcS1Mr + // C0TcS2Ra aaaaaaaa + // C0TcS3Rr + // C0TcS400 VVVVVVVV (VVVVVVVV) + // C0TcS5X0 + // C0 = opcode 0xC0 + // T = bit width + // c = condition type. + // S = source register. + // X = value operand type, 0 = main/heap with relative offset, 1 = main/heap with offset + // register, + // 2 = register with relative offset, 3 = register with offset register, 4 = static + // value, 5 = other register. + // M = memory type. + // R = address register. + // a = relative address. + // r = offset register. + // X = other register. + // V = value. + + BeginRegisterConditionalOpcode begin_reg_cond{ + .bit_width = (first_dword >> 20) & 0xF, + .cond_type = static_cast((first_dword >> 16) & 0xF), + .val_reg_index = (first_dword >> 12) & 0xF, + .comp_type = static_cast((first_dword >> 8) & 0xF), + .mem_type = MemoryAccessType::MainNso, + .addr_reg_index = 0, + .other_reg_index = 0, + .ofs_reg_index = 0, + .rel_address = 0, + .value = {}, + }; + + switch (begin_reg_cond.comp_type) { + case CompareRegisterValueType::StaticValue: + begin_reg_cond.value = GetNextVmInt(begin_reg_cond.bit_width); + break; + case CompareRegisterValueType::OtherRegister: + begin_reg_cond.other_reg_index = ((first_dword >> 4) & 0xF); + break; + case CompareRegisterValueType::MemoryRelAddr: + begin_reg_cond.mem_type = static_cast((first_dword >> 4) & 0xF); + begin_reg_cond.rel_address = + (static_cast(first_dword & 0xF) << 32) | GetNextDword(); + break; + case CompareRegisterValueType::MemoryOfsReg: + begin_reg_cond.mem_type = static_cast((first_dword >> 4) & 0xF); + begin_reg_cond.ofs_reg_index = (first_dword & 0xF); + break; + case CompareRegisterValueType::RegisterRelAddr: + begin_reg_cond.addr_reg_index = (first_dword >> 4) & 0xF; + begin_reg_cond.rel_address = + (static_cast(first_dword & 0xF) << 32) | GetNextDword(); + break; + case CompareRegisterValueType::RegisterOfsReg: + begin_reg_cond.addr_reg_index = (first_dword >> 4) & 0xF; + begin_reg_cond.ofs_reg_index = first_dword & 0xF; + break; + } + opcode.opcode = begin_reg_cond; + } break; + case CheatVmOpcodeType::SaveRestoreRegister: { + // C10D0Sx0 + // C1 = opcode 0xC1 + // D = destination index. + // S = source index. + // x = 3 if clearing reg, 2 if clearing saved value, 1 if saving a register, 0 if restoring + // a register. + // NOTE: If we add more save slots later, current encoding is backwards compatible. + opcode.opcode = SaveRestoreRegisterOpcode{ + .dst_index = (first_dword >> 16) & 0xF, + .src_index = (first_dword >> 8) & 0xF, + .op_type = static_cast((first_dword >> 4) & 0xF), + }; + } break; + case CheatVmOpcodeType::SaveRestoreRegisterMask: { + // C2x0XXXX + // C2 = opcode 0xC2 + // x = 3 if clearing reg, 2 if clearing saved value, 1 if saving, 0 if restoring. + // X = 16-bit bitmask, bit i --> save or restore register i. + SaveRestoreRegisterMaskOpcode save_restore_regmask{ + .op_type = static_cast((first_dword >> 20) & 0xF), + .should_operate = {}, + }; + for (std::size_t i = 0; i < NumRegisters; i++) { + save_restore_regmask.should_operate[i] = (first_dword & (1U << i)) != 0; + } + opcode.opcode = save_restore_regmask; + } break; + case CheatVmOpcodeType::ReadWriteStaticRegister: { + // C3000XXx + // C3 = opcode 0xC3. + // XX = static register index. + // x = register index. + opcode.opcode = ReadWriteStaticRegisterOpcode{ + .static_idx = (first_dword >> 4) & 0xFF, + .idx = first_dword & 0xF, + }; + } break; + case CheatVmOpcodeType::PauseProcess: { + /* FF0????? */ + /* FF0 = opcode 0xFF0 */ + /* Pauses the current process. */ + opcode.opcode = PauseProcessOpcode{}; + } break; + case CheatVmOpcodeType::ResumeProcess: { + /* FF0????? */ + /* FF0 = opcode 0xFF0 */ + /* Pauses the current process. */ + opcode.opcode = ResumeProcessOpcode{}; + } break; + case CheatVmOpcodeType::DebugLog: { + // FFFTIX## + // FFFTI0Ma aaaaaaaa + // FFFTI1Mr + // FFFTI2Ra aaaaaaaa + // FFFTI3Rr + // FFFTI4X0 + // FFF = opcode 0xFFF + // T = bit width. + // I = log id. + // X = value operand type, 0 = main/heap with relative offset, 1 = main/heap with offset + // register, + // 2 = register with relative offset, 3 = register with offset register, 4 = register + // value. + // M = memory type. + // R = address register. + // a = relative address. + // r = offset register. + // X = value register. + DebugLogOpcode debug_log{ + .bit_width = (first_dword >> 16) & 0xF, + .log_id = (first_dword >> 12) & 0xF, + .val_type = static_cast((first_dword >> 8) & 0xF), + .mem_type = MemoryAccessType::MainNso, + .addr_reg_index = 0, + .val_reg_index = 0, + .ofs_reg_index = 0, + .rel_address = 0, + }; + + switch (debug_log.val_type) { + case DebugLogValueType::RegisterValue: + debug_log.val_reg_index = (first_dword >> 4) & 0xF; + break; + case DebugLogValueType::MemoryRelAddr: + debug_log.mem_type = static_cast((first_dword >> 4) & 0xF); + debug_log.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); + break; + case DebugLogValueType::MemoryOfsReg: + debug_log.mem_type = static_cast((first_dword >> 4) & 0xF); + debug_log.ofs_reg_index = first_dword & 0xF; + break; + case DebugLogValueType::RegisterRelAddr: + debug_log.addr_reg_index = (first_dword >> 4) & 0xF; + debug_log.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); + break; + case DebugLogValueType::RegisterOfsReg: + debug_log.addr_reg_index = (first_dword >> 4) & 0xF; + debug_log.ofs_reg_index = first_dword & 0xF; + break; + } + opcode.opcode = debug_log; + } break; + case CheatVmOpcodeType::ExtendedWidth: + case CheatVmOpcodeType::DoubleExtendedWidth: + default: + // Unrecognized instruction cannot be decoded. + valid = false; + opcode.opcode = UnrecognizedInstruction{opcode_type}; + break; + } + + // End decoding. + return valid; + } + + void CheatVirtualMachine::SkipConditionalBlock(bool is_if) { + if (condition_depth > 0) { + // We want to continue until we're out of the current block. + const std::size_t desired_depth = condition_depth - 1; + + CheatVmOpcode skip_opcode{}; + while (condition_depth > desired_depth && DecodeNextOpcode(skip_opcode)) { + // Decode instructions until we see end of the current conditional block. + // NOTE: This is broken in gateway's implementation. + // Gateway currently checks for "0x2" instead of "0x20000000" + // In addition, they do a linear scan instead of correctly decoding opcodes. + // This causes issues if "0x2" appears as an immediate in the conditional block... + + // We also support nesting of conditional blocks, and Gateway does not. + if (skip_opcode.begin_conditional_block) { + condition_depth++; + } else if (auto end_cond = std::get_if(&skip_opcode.opcode)) { + if (!end_cond->is_else) { + condition_depth--; + } else if (is_if && condition_depth - 1 == desired_depth) { + break; + } + } + } + } else { + // Skipping, but condition_depth = 0. + // This is an error condition. + // However, I don't actually believe it is possible for this to happen. + // I guess we'll throw a fatal error here, so as to encourage me to fix the VM + // in the event that someone triggers it? I don't know how you'd do that. + UNREACHABLE_MSG("Invalid condition depth in DMNT Cheat VM"); + } + } + + u64 CheatVirtualMachine::GetVmInt(VmInt value, u32 bit_width) { + switch (bit_width) { + case 1: + return value.bit8; + case 2: + return value.bit16; + case 4: + return value.bit32; + case 8: + return value.bit64; + default: + // Invalid bit width -> return 0. + return 0; + } + } + + u64 CheatVirtualMachine::GetCheatProcessAddress(const CheatProcessMetadata& metadata, + MemoryAccessType mem_type, u64 rel_address) { + switch (mem_type) { + case MemoryAccessType::MainNso: + default: + return metadata.main_nso_extents.base + rel_address; + case MemoryAccessType::Heap: + return metadata.heap_extents.base + rel_address; + case MemoryAccessType::Alias: + return metadata.alias_extents.base + rel_address; + case MemoryAccessType::Aslr: + return metadata.aslr_extents.base + rel_address; + } + } + + void CheatVirtualMachine::ResetState() { + registers.fill(0); + saved_values.fill(0); + loop_tops.fill(0); + instruction_ptr = 0; + condition_depth = 0; + decode_success = true; + } + + bool CheatVirtualMachine::LoadProgram(std::span entries) { + // Reset opcode count. + num_opcodes = 0; + + for (std::size_t i = 0; i < entries.size(); i++) { + if (entries[i].enabled) { + // Bounds check. + if (entries[i].definition.num_opcodes + num_opcodes > MaximumProgramOpcodeCount) { + num_opcodes = 0; + return false; + } + + for (std::size_t n = 0; n < entries[i].definition.num_opcodes; n++) { + program[num_opcodes++] = entries[i].definition.opcodes[n]; + } + } + } + + return true; + } + + void CheatVirtualMachine::Execute(const CheatProcessMetadata& metadata) { + CheatVmOpcode cur_opcode{}; + + // Get Keys down. + u64 kDown = manager.HidKeysDown(); + + manager.CommandLog("Started VM execution."); + manager.CommandLog(fmt::format("Main NSO: {:012X}", metadata.main_nso_extents.base)); + manager.CommandLog(fmt::format("Heap: {:012X}", metadata.main_nso_extents.base)); + manager.CommandLog(fmt::format("Keys Down: {:08X}", static_cast(kDown & 0x0FFFFFFF))); + + // Clear VM state. + ResetState(); + + // Loop until program finishes. + while (DecodeNextOpcode(cur_opcode)) { + manager.CommandLog( + fmt::format("Instruction Ptr: {:04X}", static_cast(instruction_ptr))); + + for (std::size_t i = 0; i < NumRegisters; i++) { + manager.CommandLog(fmt::format("Registers[{:02X}]: {:016X}", i, registers[i])); + } + + for (std::size_t i = 0; i < NumRegisters; i++) { + manager.CommandLog(fmt::format("SavedRegs[{:02X}]: {:016X}", i, saved_values[i])); + } + LogOpcode(cur_opcode); + + // Increment conditional depth, if relevant. + if (cur_opcode.begin_conditional_block) { + condition_depth++; + } + + if (auto store_static = std::get_if(&cur_opcode.opcode)) { + // Calculate address, write value to memory. + u64 dst_address = GetCheatProcessAddress(metadata, store_static->mem_type, + store_static->rel_address + + registers[store_static->offset_register]); + u64 dst_value = GetVmInt(store_static->value, store_static->bit_width); + switch (store_static->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.WriteCheatProcessMemoryUnsafe(dst_address, &dst_value, + store_static->bit_width); + break; + } + } else if (auto begin_cond = std::get_if(&cur_opcode.opcode)) { + // Read value from memory. + u64 src_address = + GetCheatProcessAddress(metadata, begin_cond->mem_type, begin_cond->rel_address); + u64 src_value = 0; + switch (begin_cond->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.ReadCheatProcessMemoryUnsafe(src_address, &src_value, + begin_cond->bit_width); + break; + } + // Check against condition. + u64 cond_value = GetVmInt(begin_cond->value, begin_cond->bit_width); + bool cond_met = false; + switch (begin_cond->cond_type) { + case ConditionalComparisonType::GT: + cond_met = src_value > cond_value; + break; + case ConditionalComparisonType::GE: + cond_met = src_value >= cond_value; + break; + case ConditionalComparisonType::LT: + cond_met = src_value < cond_value; + break; + case ConditionalComparisonType::LE: + cond_met = src_value <= cond_value; + break; + case ConditionalComparisonType::EQ: + cond_met = src_value == cond_value; + break; + case ConditionalComparisonType::NE: + cond_met = src_value != cond_value; + break; + } + // Skip conditional block if condition not met. + if (!cond_met) { + SkipConditionalBlock(true); + } + } else if (auto end_cond = std::get_if(&cur_opcode.opcode)) { + if (end_cond->is_else) { + /* Skip to the end of the conditional block. */ + this->SkipConditionalBlock(false); + } else { + /* Decrement the condition depth. */ + /* We will assume, graciously, that mismatched conditional block ends are a nop. */ + if (condition_depth > 0) { + condition_depth--; + } + } + } else if (auto ctrl_loop = std::get_if(&cur_opcode.opcode)) { + if (ctrl_loop->start_loop) { + // Start a loop. + registers[ctrl_loop->reg_index] = ctrl_loop->num_iters; + loop_tops[ctrl_loop->reg_index] = instruction_ptr; + } else { + // End a loop. + registers[ctrl_loop->reg_index]--; + if (registers[ctrl_loop->reg_index] != 0) { + instruction_ptr = loop_tops[ctrl_loop->reg_index]; + } + } + } else if (auto ldr_static = std::get_if(&cur_opcode.opcode)) { + // Set a register to a static value. + registers[ldr_static->reg_index] = ldr_static->value; + } else if (auto ldr_memory = std::get_if(&cur_opcode.opcode)) { + // Choose source address. + u64 src_address; + if (ldr_memory->load_from_reg) { + src_address = registers[ldr_memory->reg_index] + ldr_memory->rel_address; + } else { + src_address = + GetCheatProcessAddress(metadata, ldr_memory->mem_type, ldr_memory->rel_address); + } + // Read into register. Gateway only reads on valid bitwidth. + switch (ldr_memory->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.ReadCheatProcessMemoryUnsafe(src_address, ®isters[ldr_memory->reg_index], + ldr_memory->bit_width); + break; + } + } else if (auto str_static = std::get_if(&cur_opcode.opcode)) { + // Calculate address. + u64 dst_address = registers[str_static->reg_index]; + u64 dst_value = str_static->value; + if (str_static->add_offset_reg) { + dst_address += registers[str_static->offset_reg_index]; + } + // Write value to memory. Gateway only writes on valid bitwidth. + switch (str_static->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.WriteCheatProcessMemoryUnsafe(dst_address, &dst_value, + str_static->bit_width); + break; + } + // Increment register if relevant. + if (str_static->increment_reg) { + registers[str_static->reg_index] += str_static->bit_width; + } + } else if (auto perform_math_static = + std::get_if(&cur_opcode.opcode)) { + // Do requested math. + switch (perform_math_static->math_type) { + case RegisterArithmeticType::Addition: + registers[perform_math_static->reg_index] += + static_cast(perform_math_static->value); + break; + case RegisterArithmeticType::Subtraction: + registers[perform_math_static->reg_index] -= + static_cast(perform_math_static->value); + break; + case RegisterArithmeticType::Multiplication: + registers[perform_math_static->reg_index] *= + static_cast(perform_math_static->value); + break; + case RegisterArithmeticType::LeftShift: + registers[perform_math_static->reg_index] <<= + static_cast(perform_math_static->value); + break; + case RegisterArithmeticType::RightShift: + registers[perform_math_static->reg_index] >>= + static_cast(perform_math_static->value); + break; + default: + // Do not handle extensions here. + break; + } + // Apply bit width. + switch (perform_math_static->bit_width) { + case 1: + registers[perform_math_static->reg_index] = + static_cast(registers[perform_math_static->reg_index]); + break; + case 2: + registers[perform_math_static->reg_index] = + static_cast(registers[perform_math_static->reg_index]); + break; + case 4: + registers[perform_math_static->reg_index] = + static_cast(registers[perform_math_static->reg_index]); + break; + case 8: + registers[perform_math_static->reg_index] = + static_cast(registers[perform_math_static->reg_index]); + break; + } + } else if (auto begin_keypress_cond = + std::get_if(&cur_opcode.opcode)) { + // Check for keypress. + if ((begin_keypress_cond->key_mask & kDown) != begin_keypress_cond->key_mask) { + // Keys not pressed. Skip conditional block. + SkipConditionalBlock(true); + } + } else if (auto perform_math_reg = + std::get_if(&cur_opcode.opcode)) { + const u64 operand_1_value = registers[perform_math_reg->src_reg_1_index]; + const u64 operand_2_value = + perform_math_reg->has_immediate + ? GetVmInt(perform_math_reg->value, perform_math_reg->bit_width) + : registers[perform_math_reg->src_reg_2_index]; + + u64 res_val = 0; + // Do requested math. + switch (perform_math_reg->math_type) { + case RegisterArithmeticType::Addition: + res_val = operand_1_value + operand_2_value; + break; + case RegisterArithmeticType::Subtraction: + res_val = operand_1_value - operand_2_value; + break; + case RegisterArithmeticType::Multiplication: + res_val = operand_1_value * operand_2_value; + break; + case RegisterArithmeticType::LeftShift: + res_val = operand_1_value << operand_2_value; + break; + case RegisterArithmeticType::RightShift: + res_val = operand_1_value >> operand_2_value; + break; + case RegisterArithmeticType::LogicalAnd: + res_val = operand_1_value & operand_2_value; + break; + case RegisterArithmeticType::LogicalOr: + res_val = operand_1_value | operand_2_value; + break; + case RegisterArithmeticType::LogicalNot: + res_val = ~operand_1_value; + break; + case RegisterArithmeticType::LogicalXor: + res_val = operand_1_value ^ operand_2_value; + break; + case RegisterArithmeticType::None: + res_val = operand_1_value; + break; + } + + // Apply bit width. + switch (perform_math_reg->bit_width) { + case 1: + res_val = static_cast(res_val); + break; + case 2: + res_val = static_cast(res_val); + break; + case 4: + res_val = static_cast(res_val); + break; + case 8: + res_val = static_cast(res_val); + break; + } + + // Save to register. + registers[perform_math_reg->dst_reg_index] = res_val; + } else if (auto str_register = + std::get_if(&cur_opcode.opcode)) { + // Calculate address. + u64 dst_value = registers[str_register->str_reg_index]; + u64 dst_address = registers[str_register->addr_reg_index]; + switch (str_register->ofs_type) { + case StoreRegisterOffsetType::None: + // Nothing more to do + break; + case StoreRegisterOffsetType::Reg: + dst_address += registers[str_register->ofs_reg_index]; + break; + case StoreRegisterOffsetType::Imm: + dst_address += str_register->rel_address; + break; + case StoreRegisterOffsetType::MemReg: + dst_address = GetCheatProcessAddress(metadata, str_register->mem_type, + registers[str_register->addr_reg_index]); + break; + case StoreRegisterOffsetType::MemImm: + dst_address = GetCheatProcessAddress(metadata, str_register->mem_type, + str_register->rel_address); + break; + case StoreRegisterOffsetType::MemImmReg: + dst_address = GetCheatProcessAddress(metadata, str_register->mem_type, + registers[str_register->addr_reg_index] + + str_register->rel_address); + break; + } + + // Write value to memory. Write only on valid bitwidth. + switch (str_register->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.WriteCheatProcessMemoryUnsafe(dst_address, &dst_value, + str_register->bit_width); + break; + } + + // Increment register if relevant. + if (str_register->increment_reg) { + registers[str_register->addr_reg_index] += str_register->bit_width; + } + } else if (auto begin_reg_cond = + std::get_if(&cur_opcode.opcode)) { + // Get value from register. + u64 src_value = 0; + switch (begin_reg_cond->bit_width) { + case 1: + src_value = static_cast(registers[begin_reg_cond->val_reg_index] & 0xFFul); + break; + case 2: + src_value = static_cast(registers[begin_reg_cond->val_reg_index] & 0xFFFFul); + break; + case 4: + src_value = + static_cast(registers[begin_reg_cond->val_reg_index] & 0xFFFFFFFFul); + break; + case 8: + src_value = static_cast(registers[begin_reg_cond->val_reg_index] & + 0xFFFFFFFFFFFFFFFFul); + break; + } + + // Read value from memory. + u64 cond_value = 0; + if (begin_reg_cond->comp_type == CompareRegisterValueType::StaticValue) { + cond_value = GetVmInt(begin_reg_cond->value, begin_reg_cond->bit_width); + } else if (begin_reg_cond->comp_type == CompareRegisterValueType::OtherRegister) { + switch (begin_reg_cond->bit_width) { + case 1: + cond_value = + static_cast(registers[begin_reg_cond->other_reg_index] & 0xFFul); + break; + case 2: + cond_value = + static_cast(registers[begin_reg_cond->other_reg_index] & 0xFFFFul); + break; + case 4: + cond_value = + static_cast(registers[begin_reg_cond->other_reg_index] & 0xFFFFFFFFul); + break; + case 8: + cond_value = static_cast(registers[begin_reg_cond->other_reg_index] & + 0xFFFFFFFFFFFFFFFFul); + break; + } + } else { + u64 cond_address = 0; + switch (begin_reg_cond->comp_type) { + case CompareRegisterValueType::MemoryRelAddr: + cond_address = GetCheatProcessAddress(metadata, begin_reg_cond->mem_type, + begin_reg_cond->rel_address); + break; + case CompareRegisterValueType::MemoryOfsReg: + cond_address = GetCheatProcessAddress(metadata, begin_reg_cond->mem_type, + registers[begin_reg_cond->ofs_reg_index]); + break; + case CompareRegisterValueType::RegisterRelAddr: + cond_address = + registers[begin_reg_cond->addr_reg_index] + begin_reg_cond->rel_address; + break; + case CompareRegisterValueType::RegisterOfsReg: + cond_address = registers[begin_reg_cond->addr_reg_index] + + registers[begin_reg_cond->ofs_reg_index]; + break; + default: + break; + } + switch (begin_reg_cond->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.ReadCheatProcessMemoryUnsafe(cond_address, &cond_value, + begin_reg_cond->bit_width); + break; + } + } + + // Check against condition. + bool cond_met = false; + switch (begin_reg_cond->cond_type) { + case ConditionalComparisonType::GT: + cond_met = src_value > cond_value; + break; + case ConditionalComparisonType::GE: + cond_met = src_value >= cond_value; + break; + case ConditionalComparisonType::LT: + cond_met = src_value < cond_value; + break; + case ConditionalComparisonType::LE: + cond_met = src_value <= cond_value; + break; + case ConditionalComparisonType::EQ: + cond_met = src_value == cond_value; + break; + case ConditionalComparisonType::NE: + cond_met = src_value != cond_value; + break; + } + + // Skip conditional block if condition not met. + if (!cond_met) { + SkipConditionalBlock(true); + } + } else if (auto save_restore_reg = + std::get_if(&cur_opcode.opcode)) { + // Save or restore a register. + switch (save_restore_reg->op_type) { + case SaveRestoreRegisterOpType::ClearRegs: + registers[save_restore_reg->dst_index] = 0ul; + break; + case SaveRestoreRegisterOpType::ClearSaved: + saved_values[save_restore_reg->dst_index] = 0ul; + break; + case SaveRestoreRegisterOpType::Save: + saved_values[save_restore_reg->dst_index] = registers[save_restore_reg->src_index]; + break; + case SaveRestoreRegisterOpType::Restore: + default: + registers[save_restore_reg->dst_index] = saved_values[save_restore_reg->src_index]; + break; + } + } else if (auto save_restore_regmask = + std::get_if(&cur_opcode.opcode)) { + // Save or restore register mask. + u64* src; + u64* dst; + switch (save_restore_regmask->op_type) { + case SaveRestoreRegisterOpType::ClearSaved: + case SaveRestoreRegisterOpType::Save: + src = registers.data(); + dst = saved_values.data(); + break; + case SaveRestoreRegisterOpType::ClearRegs: + case SaveRestoreRegisterOpType::Restore: + default: + src = saved_values.data(); + dst = registers.data(); + break; + } + for (std::size_t i = 0; i < NumRegisters; i++) { + if (save_restore_regmask->should_operate[i]) { + switch (save_restore_regmask->op_type) { + case SaveRestoreRegisterOpType::ClearSaved: + case SaveRestoreRegisterOpType::ClearRegs: + dst[i] = 0ul; + break; + case SaveRestoreRegisterOpType::Save: + case SaveRestoreRegisterOpType::Restore: + default: + dst[i] = src[i]; + break; + } + } + } + } else if (auto rw_static_reg = + std::get_if(&cur_opcode.opcode)) { + if (rw_static_reg->static_idx < NumReadableStaticRegisters) { + // Load a register with a static register. + registers[rw_static_reg->idx] = static_registers[rw_static_reg->static_idx]; + } else { + // Store a register to a static register. + static_registers[rw_static_reg->static_idx] = registers[rw_static_reg->idx]; + } + } else if (std::holds_alternative(cur_opcode.opcode)) { + manager.PauseCheatProcessUnsafe(); + } else if (std::holds_alternative(cur_opcode.opcode)) { + manager.ResumeCheatProcessUnsafe(); + } else if (auto debug_log = std::get_if(&cur_opcode.opcode)) { + // Read value from memory. + u64 log_value = 0; + if (debug_log->val_type == DebugLogValueType::RegisterValue) { + switch (debug_log->bit_width) { + case 1: + log_value = static_cast(registers[debug_log->val_reg_index] & 0xFFul); + break; + case 2: + log_value = static_cast(registers[debug_log->val_reg_index] & 0xFFFFul); + break; + case 4: + log_value = + static_cast(registers[debug_log->val_reg_index] & 0xFFFFFFFFul); + break; + case 8: + log_value = static_cast(registers[debug_log->val_reg_index] & + 0xFFFFFFFFFFFFFFFFul); + break; + } + } else { + u64 val_address = 0; + switch (debug_log->val_type) { + case DebugLogValueType::MemoryRelAddr: + val_address = GetCheatProcessAddress(metadata, debug_log->mem_type, + debug_log->rel_address); + break; + case DebugLogValueType::MemoryOfsReg: + val_address = GetCheatProcessAddress(metadata, debug_log->mem_type, + registers[debug_log->ofs_reg_index]); + break; + case DebugLogValueType::RegisterRelAddr: + val_address = registers[debug_log->addr_reg_index] + debug_log->rel_address; + break; + case DebugLogValueType::RegisterOfsReg: + val_address = + registers[debug_log->addr_reg_index] + registers[debug_log->ofs_reg_index]; + break; + default: + break; + } + switch (debug_log->bit_width) { + case 1: + case 2: + case 4: + case 8: + manager.ReadCheatProcessMemoryUnsafe(val_address, &log_value, + debug_log->bit_width); + break; + } + } + + // Log value. + DebugLog(debug_log->log_id, log_value); + } + } + } +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/cheat_virtual_machine.h b/src/core/hle/service/dmnt/cheat_virtual_machine.h new file mode 100644 index 0000000000..8860764701 --- /dev/null +++ b/src/core/hle/service/dmnt/cheat_virtual_machine.h @@ -0,0 +1,323 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +#include "common/common_types.h" +#include "core/hle/service/dmnt/dmnt_types.h" + +namespace Service::DMNT { + class CheatProcessManager; + + enum class CheatVmOpcodeType : u32 { + StoreStatic = 0, + BeginConditionalBlock = 1, + EndConditionalBlock = 2, + ControlLoop = 3, + LoadRegisterStatic = 4, + LoadRegisterMemory = 5, + StoreStaticToAddress = 6, + PerformArithmeticStatic = 7, + BeginKeypressConditionalBlock = 8, + + // These are not implemented by Gateway's VM. + PerformArithmeticRegister = 9, + StoreRegisterToAddress = 10, + Reserved11 = 11, + + // This is a meta entry, and not a real opcode. + // This is to facilitate multi-nybble instruction decoding. + ExtendedWidth = 12, + + // Extended width opcodes. + BeginRegisterConditionalBlock = 0xC0, + SaveRestoreRegister = 0xC1, + SaveRestoreRegisterMask = 0xC2, + ReadWriteStaticRegister = 0xC3, + + // This is a meta entry, and not a real opcode. + // This is to facilitate multi-nybble instruction decoding. + DoubleExtendedWidth = 0xF0, + + // Double-extended width opcodes. + PauseProcess = 0xFF0, + ResumeProcess = 0xFF1, + DebugLog = 0xFFF, + }; + + enum class MemoryAccessType : u32 { + MainNso = 0, + Heap = 1, + Alias = 2, + Aslr = 3, + }; + + enum class ConditionalComparisonType : u32 { + GT = 1, + GE = 2, + LT = 3, + LE = 4, + EQ = 5, + NE = 6, + }; + + enum class RegisterArithmeticType : u32 { + Addition = 0, + Subtraction = 1, + Multiplication = 2, + LeftShift = 3, + RightShift = 4, + + // These are not supported by Gateway's VM. + LogicalAnd = 5, + LogicalOr = 6, + LogicalNot = 7, + LogicalXor = 8, + + None = 9, + }; + + enum class StoreRegisterOffsetType : u32 { + None = 0, + Reg = 1, + Imm = 2, + MemReg = 3, + MemImm = 4, + MemImmReg = 5, + }; + + enum class CompareRegisterValueType : u32 { + MemoryRelAddr = 0, + MemoryOfsReg = 1, + RegisterRelAddr = 2, + RegisterOfsReg = 3, + StaticValue = 4, + OtherRegister = 5, + }; + + enum class SaveRestoreRegisterOpType : u32 { + Restore = 0, + Save = 1, + ClearSaved = 2, + ClearRegs = 3, + }; + + enum class DebugLogValueType : u32 { + MemoryRelAddr = 0, + MemoryOfsReg = 1, + RegisterRelAddr = 2, + RegisterOfsReg = 3, + RegisterValue = 4, + }; + + union VmInt { + u8 bit8; + u16 bit16; + u32 bit32; + u64 bit64; + }; + + struct StoreStaticOpcode { + u32 bit_width{}; + MemoryAccessType mem_type{}; + u32 offset_register{}; + u64 rel_address{}; + VmInt value{}; + }; + + struct BeginConditionalOpcode { + u32 bit_width{}; + MemoryAccessType mem_type{}; + ConditionalComparisonType cond_type{}; + u64 rel_address{}; + VmInt value{}; + }; + + struct EndConditionalOpcode { + bool is_else; + }; + + struct ControlLoopOpcode { + bool start_loop{}; + u32 reg_index{}; + u32 num_iters{}; + }; + + struct LoadRegisterStaticOpcode { + u32 reg_index{}; + u64 value{}; + }; + + struct LoadRegisterMemoryOpcode { + u32 bit_width{}; + MemoryAccessType mem_type{}; + u32 reg_index{}; + bool load_from_reg{}; + u64 rel_address{}; + }; + + struct StoreStaticToAddressOpcode { + u32 bit_width{}; + u32 reg_index{}; + bool increment_reg{}; + bool add_offset_reg{}; + u32 offset_reg_index{}; + u64 value{}; + }; + + struct PerformArithmeticStaticOpcode { + u32 bit_width{}; + u32 reg_index{}; + RegisterArithmeticType math_type{}; + u32 value{}; + }; + + struct BeginKeypressConditionalOpcode { + u32 key_mask{}; + }; + + struct PerformArithmeticRegisterOpcode { + u32 bit_width{}; + RegisterArithmeticType math_type{}; + u32 dst_reg_index{}; + u32 src_reg_1_index{}; + u32 src_reg_2_index{}; + bool has_immediate{}; + VmInt value{}; + }; + + struct StoreRegisterToAddressOpcode { + u32 bit_width{}; + u32 str_reg_index{}; + u32 addr_reg_index{}; + bool increment_reg{}; + StoreRegisterOffsetType ofs_type{}; + MemoryAccessType mem_type{}; + u32 ofs_reg_index{}; + u64 rel_address{}; + }; + + struct BeginRegisterConditionalOpcode { + u32 bit_width{}; + ConditionalComparisonType cond_type{}; + u32 val_reg_index{}; + CompareRegisterValueType comp_type{}; + MemoryAccessType mem_type{}; + u32 addr_reg_index{}; + u32 other_reg_index{}; + u32 ofs_reg_index{}; + u64 rel_address{}; + VmInt value{}; + }; + + struct SaveRestoreRegisterOpcode { + u32 dst_index{}; + u32 src_index{}; + SaveRestoreRegisterOpType op_type{}; + }; + + struct SaveRestoreRegisterMaskOpcode { + SaveRestoreRegisterOpType op_type{}; + std::array should_operate{}; + }; + + struct ReadWriteStaticRegisterOpcode { + u32 static_idx{}; + u32 idx{}; + }; + + struct PauseProcessOpcode {}; + + struct ResumeProcessOpcode {}; + + struct DebugLogOpcode { + u32 bit_width{}; + u32 log_id{}; + DebugLogValueType val_type{}; + MemoryAccessType mem_type{}; + u32 addr_reg_index{}; + u32 val_reg_index{}; + u32 ofs_reg_index{}; + u64 rel_address{}; + }; + + struct UnrecognizedInstruction { + CheatVmOpcodeType opcode{}; + }; + + struct CheatVmOpcode { + bool begin_conditional_block{}; + std::variant + opcode{}; + }; + + class CheatVirtualMachine { + public: + static constexpr std::size_t MaximumProgramOpcodeCount = 0x400; + static constexpr std::size_t NumRegisters = 0x10; + static constexpr std::size_t NumReadableStaticRegisters = 0x80; + static constexpr std::size_t NumWritableStaticRegisters = 0x80; + static constexpr std::size_t NumStaticRegisters = + NumReadableStaticRegisters + NumWritableStaticRegisters; + + explicit CheatVirtualMachine(CheatProcessManager& cheat_manager); + ~CheatVirtualMachine(); + + std::size_t GetProgramSize() const { + return this->num_opcodes; + } + + bool LoadProgram(std::span cheats); + void Execute(const CheatProcessMetadata& metadata); + + u64 GetStaticRegister(std::size_t register_index) const { + return static_registers[register_index]; + } + + void SetStaticRegister(std::size_t register_index, u64 value) { + static_registers[register_index] = value; + } + + void ResetStaticRegisters() { + static_registers = {}; + } + + private: + bool DecodeNextOpcode(CheatVmOpcode& out); + void SkipConditionalBlock(bool is_if); + void ResetState(); + + // For implementing the DebugLog opcode. + void DebugLog(u32 log_id, u64 value) const; + + void LogOpcode(const CheatVmOpcode& opcode) const; + + static u64 GetVmInt(VmInt value, u32 bit_width); + static u64 GetCheatProcessAddress(const CheatProcessMetadata& metadata, + MemoryAccessType mem_type, u64 rel_address); + + CheatProcessManager& manager; + + std::size_t num_opcodes = 0; + std::size_t instruction_ptr = 0; + std::size_t condition_depth = 0; + bool decode_success = false; + std::array program{}; + std::array registers{}; + std::array saved_values{}; + std::array static_registers{}; + std::array loop_tops{}; + }; +}// namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/dmnt.cpp b/src/core/hle/service/dmnt/dmnt.cpp new file mode 100644 index 0000000000..373ef83b9e --- /dev/null +++ b/src/core/hle/service/dmnt/dmnt.cpp @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/core.h" +#include "core/hle/service/dmnt/cheat_interface.h" +#include "core/hle/service/dmnt/cheat_process_manager.h" +#include "core/hle/service/dmnt/cheat_virtual_machine.h" +#include "core/hle/service/dmnt/dmnt.h" +#include "core/hle/service/server_manager.h" + +namespace Service::DMNT { + void LoopProcess(Core::System& system) { + auto server_manager = std::make_unique(system); + + auto& cheat_manager = system.GetCheatManager(); + auto cheat_vm = std::make_unique(cheat_manager); + cheat_manager.SetVirtualMachine(std::move(cheat_vm)); + + server_manager->RegisterNamedService("dmnt:cht", + std::make_shared(system, cheat_manager)); + ServerManager::RunServer(std::move(server_manager)); + } +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/dmnt.h b/src/core/hle/service/dmnt/dmnt.h new file mode 100644 index 0000000000..4c98a5fc0f --- /dev/null +++ b/src/core/hle/service/dmnt/dmnt.h @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +namespace Core { + class System; +}; + +namespace Service::DMNT { + void LoopProcess(Core::System& system); +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/dmnt_results.h b/src/core/hle/service/dmnt/dmnt_results.h new file mode 100644 index 0000000000..ec3859c936 --- /dev/null +++ b/src/core/hle/service/dmnt/dmnt_results.h @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/result.h" + +namespace Service::DMNT { + constexpr Result ResultDebuggingDisabled(ErrorModule::DMNT, 2); + + constexpr Result ResultCheatNotAttached(ErrorModule::DMNT, 6500); + constexpr Result ResultCheatNullBuffer(ErrorModule::DMNT, 6501); + constexpr Result ResultCheatInvalidBuffer(ErrorModule::DMNT, 6502); + constexpr Result ResultCheatUnknownId(ErrorModule::DMNT, 6503); + constexpr Result ResultCheatOutOfResource(ErrorModule::DMNT, 6504); + constexpr Result ResultCheatInvalid(ErrorModule::DMNT, 6505); + constexpr Result ResultCheatCannotDisable(ErrorModule::DMNT, 6506); + constexpr Result ResultFrozenAddressInvalidWidth(ErrorModule::DMNT, 6600); + constexpr Result ResultFrozenAddressAlreadyExists(ErrorModule::DMNT, 6601); + constexpr Result ResultFrozenAddressNotFound(ErrorModule::DMNT, 6602); + constexpr Result ResultFrozenAddressOutOfResource(ErrorModule::DMNT, 6603); + constexpr Result ResultVirtualMachineInvalidConditionDepth(ErrorModule::DMNT, 6700); +} // namespace Service::DMNT diff --git a/src/core/hle/service/dmnt/dmnt_types.h b/src/core/hle/service/dmnt/dmnt_types.h new file mode 100644 index 0000000000..60a118200a --- /dev/null +++ b/src/core/hle/service/dmnt/dmnt_types.h @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/common_types.h" + +namespace Service::DMNT { + struct MemoryRegionExtents { + u64 base{}; + u64 size{}; + }; + static_assert(sizeof(MemoryRegionExtents) == 0x10, "MemoryRegionExtents is an invalid size"); + + struct CheatProcessMetadata { + u64 process_id{}; + u64 program_id{}; + MemoryRegionExtents main_nso_extents{}; + MemoryRegionExtents heap_extents{}; + MemoryRegionExtents alias_extents{}; + MemoryRegionExtents aslr_extents{}; + std::array main_nso_build_id{}; + }; + static_assert(sizeof(CheatProcessMetadata) == 0x70, "CheatProcessMetadata is an invalid size"); + + struct CheatDefinition { + std::array readable_name; + u32 num_opcodes; + std::array opcodes; + }; + static_assert(sizeof(CheatDefinition) == 0x444, "CheatDefinition is an invalid size"); + + struct CheatEntry { + bool enabled; + u32 cheat_id; + CheatDefinition definition; + }; + static_assert(sizeof(CheatEntry) == 0x44C, "CheatEntry is an invalid size"); + static_assert(std::is_trivial_v, "CheatEntry type must be trivially copyable."); + + struct FrozenAddressValue { + u64 value; + u8 width; + }; + static_assert(sizeof(FrozenAddressValue) == 0x10, "FrozenAddressValue is an invalid size"); + + struct FrozenAddressEntry { + u64 address; + FrozenAddressValue value; + }; + static_assert(sizeof(FrozenAddressEntry) == 0x18, "FrozenAddressEntry is an invalid size"); +} // namespace Service::DMNT diff --git a/src/core/hle/service/services.cpp b/src/core/hle/service/services.cpp index 636f54ad49..14a19d376c 100644 --- a/src/core/hle/service/services.cpp +++ b/src/core/hle/service/services.cpp @@ -16,6 +16,7 @@ #include "core/hle/service/btdrv/btdrv.h" #include "core/hle/service/btm/btm.h" #include "core/hle/service/caps/caps.h" +#include "core/hle/service/dmnt/dmnt.h" #include "core/hle/service/erpt/erpt.h" #include "core/hle/service/es/es.h" #include "core/hle/service/eupld/eupld.h" @@ -107,6 +108,7 @@ Services::Services(std::shared_ptr& sm, Core::System& system {"btdrv", &BtDrv::LoopProcess}, {"btm", &BTM::LoopProcess}, {"capsrv", &Capture::LoopProcess}, + {"dmnt", &DMNT::LoopProcess}, {"erpt", &ERPT::LoopProcess}, {"es", &ES::LoopProcess}, {"eupld", &EUPLD::LoopProcess}, diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp deleted file mode 100644 index dcfd23644f..0000000000 --- a/src/core/memory/cheat_engine.cpp +++ /dev/null @@ -1,288 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include "common/hex_util.h" -#include "common/swap.h" -#include "core/arm/debug.h" -#include "core/core.h" -#include "core/core_timing.h" -#include "core/hle/kernel/k_page_table.h" -#include "core/hle/kernel/k_process.h" -#include "core/hle/kernel/k_process_page_table.h" -#include "core/hle/kernel/svc_types.h" -#include "core/hle/service/hid/hid_server.h" -#include "core/hle/service/sm/sm.h" -#include "core/memory.h" -#include "core/memory/cheat_engine.h" -#include "hid_core/resource_manager.h" -#include "hid_core/resources/npad/npad.h" - -namespace Core::Memory { -namespace { -constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12}; - -std::string_view ExtractName(std::size_t& out_name_size, std::string_view data, - std::size_t start_index, char match) { - auto end_index = start_index; - while (data[end_index] != match) { - ++end_index; - if (end_index > data.size()) { - return {}; - } - } - - out_name_size = end_index - start_index; - - // Clamp name if it's too big - if (out_name_size > sizeof(CheatDefinition::readable_name)) { - end_index = start_index + sizeof(CheatDefinition::readable_name); - } - - return data.substr(start_index, end_index - start_index); -} -} // Anonymous namespace - -StandardVmCallbacks::StandardVmCallbacks(System& system_, const CheatProcessMetadata& metadata_) - : metadata{metadata_}, system{system_} {} - -StandardVmCallbacks::~StandardVmCallbacks() = default; - -void StandardVmCallbacks::MemoryReadUnsafe(VAddr address, void* data, u64 size) { - // Return zero on invalid address - if (!IsAddressInRange(address) || !system.ApplicationMemory().IsValidVirtualAddress(address)) { - std::memset(data, 0, size); - return; - } - - system.ApplicationMemory().ReadBlock(address, data, size); -} - -void StandardVmCallbacks::MemoryWriteUnsafe(VAddr address, const void* data, u64 size) { - // Skip invalid memory write address - if (!IsAddressInRange(address) || !system.ApplicationMemory().IsValidVirtualAddress(address)) { - return; - } - - if (system.ApplicationMemory().WriteBlock(address, data, size)) { - Core::InvalidateInstructionCacheRange(system.ApplicationProcess(), address, size); - } -} - -u64 StandardVmCallbacks::HidKeysDown() { - const auto hid = system.ServiceManager().GetService("hid"); - if (hid == nullptr) { - LOG_WARNING(CheatEngine, "Attempted to read input state, but hid is not initialized!"); - return 0; - } - - const auto applet_resource = hid->GetResourceManager(); - if (applet_resource == nullptr || applet_resource->GetNpad() == nullptr) { - LOG_WARNING(CheatEngine, - "Attempted to read input state, but applet resource is not initialized!"); - return 0; - } - - const auto press_state = applet_resource->GetNpad()->GetAndResetPressState(); - return static_cast(press_state & HID::NpadButton::All); -} - -void StandardVmCallbacks::PauseProcess() { - if (system.ApplicationProcess()->IsSuspended()) { - return; - } - system.ApplicationProcess()->SetActivity(Kernel::Svc::ProcessActivity::Paused); -} - -void StandardVmCallbacks::ResumeProcess() { - if (!system.ApplicationProcess()->IsSuspended()) { - return; - } - system.ApplicationProcess()->SetActivity(Kernel::Svc::ProcessActivity::Runnable); -} - -void StandardVmCallbacks::DebugLog(u8 id, u64 value) { - LOG_INFO(CheatEngine, "Cheat triggered DebugLog: ID '{:01X}' Value '{:016X}'", id, value); -} - -void StandardVmCallbacks::CommandLog(std::string_view data) { - LOG_DEBUG(CheatEngine, "[DmntCheatVm]: {}", - data.back() == '\n' ? data.substr(0, data.size() - 1) : data); -} - -bool StandardVmCallbacks::IsAddressInRange(VAddr in) const { - if ((in < metadata.main_nso_extents.base || - in >= metadata.main_nso_extents.base + metadata.main_nso_extents.size) && - (in < metadata.heap_extents.base || - in >= metadata.heap_extents.base + metadata.heap_extents.size) && - (in < metadata.alias_extents.base || - in >= metadata.alias_extents.base + metadata.alias_extents.size) && - (in < metadata.aslr_extents.base || - in >= metadata.aslr_extents.base + metadata.aslr_extents.size)) { - LOG_DEBUG(CheatEngine, - "Cheat attempting to access memory at invalid address={:016X}, if this " - "persists, " - "the cheat may be incorrect. However, this may be normal early in execution if " - "the game has not properly set up yet.", - in); - return false; ///< Invalid addresses will hard crash - } - - return true; -} - -CheatParser::~CheatParser() = default; - -TextCheatParser::~TextCheatParser() = default; - -std::vector TextCheatParser::Parse(std::string_view data) const { - std::vector out(1); - std::optional current_entry; - - for (std::size_t i = 0; i < data.size(); ++i) { - if (::isspace(data[i])) { - continue; - } - - if (data[i] == '{') { - current_entry = 0; - - if (out[*current_entry].definition.num_opcodes > 0) { - return {}; - } - - std::size_t name_size{}; - const auto name = ExtractName(name_size, data, i + 1, '}'); - if (name.empty()) { - return {}; - } - - std::memcpy(out[*current_entry].definition.readable_name.data(), name.data(), - std::min(out[*current_entry].definition.readable_name.size(), - name.size())); - out[*current_entry] - .definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] = - '\0'; - - i += name_size + 1; - } else if (data[i] == '[') { - current_entry = out.size(); - out.emplace_back(); - - std::size_t name_size{}; - const auto name = ExtractName(name_size, data, i + 1, ']'); - if (name.empty()) { - return {}; - } - - std::memcpy(out[*current_entry].definition.readable_name.data(), name.data(), - std::min(out[*current_entry].definition.readable_name.size(), - name.size())); - out[*current_entry] - .definition.readable_name[out[*current_entry].definition.readable_name.size() - 1] = - '\0'; - - i += name_size + 1; - } else if (::isxdigit(data[i])) { - if (!current_entry || out[*current_entry].definition.num_opcodes >= - out[*current_entry].definition.opcodes.size()) { - return {}; - } - - const auto hex = std::string(data.substr(i, 8)); - if (!std::all_of(hex.begin(), hex.end(), ::isxdigit)) { - return {}; - } - - const auto value = static_cast(std::strtoul(hex.c_str(), nullptr, 0x10)); - out[*current_entry].definition.opcodes[out[*current_entry].definition.num_opcodes++] = - value; - - i += 8; - } else { - return {}; - } - } - - out[0].enabled = out[0].definition.num_opcodes > 0; - out[0].cheat_id = 0; - - for (u32 i = 1; i < out.size(); ++i) { - out[i].enabled = out[i].definition.num_opcodes > 0; - out[i].cheat_id = i; - } - - return out; -} - -CheatEngine::CheatEngine(System& system_, std::vector cheats_, - const std::array& build_id_) - : vm{std::make_unique(system_, metadata)}, - cheats(std::move(cheats_)), core_timing{system_.CoreTiming()}, system{system_} { - metadata.main_nso_build_id = build_id_; -} - -CheatEngine::~CheatEngine() { - if (event) - core_timing.UnscheduleEvent(event); - else - LOG_ERROR(CheatEngine, "~CheatEngine before event was registered"); -} - -void CheatEngine::Initialize() { - event = Core::Timing::CreateEvent( - "CheatEngine::FrameCallback::" + Common::HexToString(metadata.main_nso_build_id), - [this](s64 time, std::chrono::nanoseconds ns_late) -> std::optional { - FrameCallback(ns_late); - return std::nullopt; - }); - core_timing.ScheduleLoopingEvent(CHEAT_ENGINE_NS, CHEAT_ENGINE_NS, event); - - metadata.process_id = system.ApplicationProcess()->GetProcessId(); - metadata.title_id = system.GetApplicationProcessProgramID(); - - const auto& page_table = system.ApplicationProcess()->GetPageTable(); - metadata.heap_extents = { - .base = GetInteger(page_table.GetHeapRegionStart()), - .size = page_table.GetHeapRegionSize(), - }; - metadata.aslr_extents = { - .base = GetInteger(page_table.GetAliasCodeRegionStart()), - .size = page_table.GetAliasCodeRegionSize(), - }; - metadata.alias_extents = { - .base = GetInteger(page_table.GetAliasRegionStart()), - .size = page_table.GetAliasRegionSize(), - }; - - is_pending_reload.exchange(true); -} - -void CheatEngine::SetMainMemoryParameters(VAddr main_region_begin, u64 main_region_size) { - metadata.main_nso_extents = { - .base = main_region_begin, - .size = main_region_size, - }; -} - -void CheatEngine::Reload(std::vector reload_cheats) { - cheats = std::move(reload_cheats); - is_pending_reload.exchange(true); -} - -void CheatEngine::FrameCallback(std::chrono::nanoseconds ns_late) { - if (is_pending_reload.exchange(false)) { - vm.LoadProgram(cheats); - } - - if (vm.GetProgramSize() == 0) { - return; - } - - vm.Execute(metadata); -} - -} // namespace Core::Memory diff --git a/src/core/memory/cheat_engine.h b/src/core/memory/cheat_engine.h deleted file mode 100644 index f52f2be7c3..0000000000 --- a/src/core/memory/cheat_engine.h +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include -#include "common/common_types.h" -#include "core/memory/dmnt_cheat_types.h" -#include "core/memory/dmnt_cheat_vm.h" - -namespace Core { -class System; -} - -namespace Core::Timing { -class CoreTiming; -struct EventType; -} // namespace Core::Timing - -namespace Core::Memory { - -class StandardVmCallbacks : public DmntCheatVm::Callbacks { -public: - StandardVmCallbacks(System& system_, const CheatProcessMetadata& metadata_); - ~StandardVmCallbacks() override; - - void MemoryReadUnsafe(VAddr address, void* data, u64 size) override; - void MemoryWriteUnsafe(VAddr address, const void* data, u64 size) override; - u64 HidKeysDown() override; - void PauseProcess() override; - void ResumeProcess() override; - void DebugLog(u8 id, u64 value) override; - void CommandLog(std::string_view data) override; - -private: - bool IsAddressInRange(VAddr address) const; - - const CheatProcessMetadata& metadata; - Core::System& system; -}; - -// Intermediary class that parses a text file or other disk format for storing cheats into a -// CheatList object, that can be used for execution. -class CheatParser { -public: - virtual ~CheatParser(); - - [[nodiscard]] virtual std::vector Parse(std::string_view data) const = 0; -}; - -// CheatParser implementation that parses text files -class TextCheatParser final : public CheatParser { -public: - ~TextCheatParser() override; - - [[nodiscard]] std::vector Parse(std::string_view data) const override; -}; - -// Class that encapsulates a CheatList and manages its interaction with memory and CoreTiming -class CheatEngine final { -public: - CheatEngine(System& system_, std::vector cheats_, - const std::array& build_id_); - ~CheatEngine(); - - void Initialize(); - void SetMainMemoryParameters(VAddr main_region_begin, u64 main_region_size); - - void Reload(std::vector reload_cheats); - -private: - void FrameCallback(std::chrono::nanoseconds ns_late); - - DmntCheatVm vm; - CheatProcessMetadata metadata; - - std::vector cheats; - std::atomic_bool is_pending_reload{false}; - - std::shared_ptr event; - Core::Timing::CoreTiming& core_timing; - Core::System& system; -}; - -} // namespace Core::Memory diff --git a/src/core/memory/dmnt_cheat_types.h b/src/core/memory/dmnt_cheat_types.h deleted file mode 100644 index 64c072d3de..0000000000 --- a/src/core/memory/dmnt_cheat_types.h +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/common_types.h" - -namespace Core::Memory { - -struct MemoryRegionExtents { - u64 base{}; - u64 size{}; -}; - -struct CheatProcessMetadata { - u64 process_id{}; - u64 title_id{}; - MemoryRegionExtents main_nso_extents{}; - MemoryRegionExtents heap_extents{}; - MemoryRegionExtents alias_extents{}; - MemoryRegionExtents aslr_extents{}; - std::array main_nso_build_id{}; -}; - -struct CheatDefinition { - std::array readable_name{}; - u32 num_opcodes{}; - std::array opcodes{}; -}; - -struct CheatEntry { - bool enabled{}; - u32 cheat_id{}; - CheatDefinition definition{}; -}; - -} // namespace Core::Memory diff --git a/src/core/memory/dmnt_cheat_vm.cpp b/src/core/memory/dmnt_cheat_vm.cpp deleted file mode 100644 index caceeec4fc..0000000000 --- a/src/core/memory/dmnt_cheat_vm.cpp +++ /dev/null @@ -1,1268 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/assert.h" -#include "common/scope_exit.h" -#include "core/memory/dmnt_cheat_types.h" -#include "core/memory/dmnt_cheat_vm.h" - -namespace Core::Memory { - -DmntCheatVm::DmntCheatVm(std::unique_ptr callbacks_) - : callbacks(std::move(callbacks_)) {} - -DmntCheatVm::~DmntCheatVm() = default; - -void DmntCheatVm::DebugLog(u32 log_id, u64 value) { - callbacks->DebugLog(static_cast(log_id), value); -} - -void DmntCheatVm::LogOpcode(const CheatVmOpcode& opcode) { - if (auto store_static = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Store Static"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", store_static->bit_width)); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(store_static->mem_type))); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", store_static->offset_register)); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", store_static->rel_address)); - callbacks->CommandLog(fmt::format("Value: {:X}", store_static->value.bit64)); - } else if (auto begin_cond = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Begin Conditional"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", begin_cond->bit_width)); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(begin_cond->mem_type))); - callbacks->CommandLog( - fmt::format("Cond Type: {:X}", static_cast(begin_cond->cond_type))); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", begin_cond->rel_address)); - callbacks->CommandLog(fmt::format("Value: {:X}", begin_cond->value.bit64)); - } else if (std::holds_alternative(opcode.opcode)) { - callbacks->CommandLog("Opcode: End Conditional"); - } else if (auto ctrl_loop = std::get_if(&opcode.opcode)) { - if (ctrl_loop->start_loop) { - callbacks->CommandLog("Opcode: Start Loop"); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", ctrl_loop->reg_index)); - callbacks->CommandLog(fmt::format("Num Iters: {:X}", ctrl_loop->num_iters)); - } else { - callbacks->CommandLog("Opcode: End Loop"); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", ctrl_loop->reg_index)); - } - } else if (auto ldr_static = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Load Register Static"); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", ldr_static->reg_index)); - callbacks->CommandLog(fmt::format("Value: {:X}", ldr_static->value)); - } else if (auto ldr_memory = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Load Register Memory"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", ldr_memory->bit_width)); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", ldr_memory->reg_index)); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(ldr_memory->mem_type))); - callbacks->CommandLog(fmt::format("From Reg: {:d}", ldr_memory->load_from_reg)); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", ldr_memory->rel_address)); - } else if (auto str_static = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Store Static to Address"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", str_static->bit_width)); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", str_static->reg_index)); - if (str_static->add_offset_reg) { - callbacks->CommandLog(fmt::format("O Reg Idx: {:X}", str_static->offset_reg_index)); - } - callbacks->CommandLog(fmt::format("Incr Reg: {:d}", str_static->increment_reg)); - callbacks->CommandLog(fmt::format("Value: {:X}", str_static->value)); - } else if (auto perform_math_static = - std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Perform Static Arithmetic"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", perform_math_static->bit_width)); - callbacks->CommandLog(fmt::format("Reg Idx: {:X}", perform_math_static->reg_index)); - callbacks->CommandLog( - fmt::format("Math Type: {:X}", static_cast(perform_math_static->math_type))); - callbacks->CommandLog(fmt::format("Value: {:X}", perform_math_static->value)); - } else if (auto begin_keypress_cond = - std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Begin Keypress Conditional"); - callbacks->CommandLog(fmt::format("Key Mask: {:X}", begin_keypress_cond->key_mask)); - } else if (auto perform_math_reg = - std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Perform Register Arithmetic"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", perform_math_reg->bit_width)); - callbacks->CommandLog(fmt::format("Dst Idx: {:X}", perform_math_reg->dst_reg_index)); - callbacks->CommandLog(fmt::format("Src1 Idx: {:X}", perform_math_reg->src_reg_1_index)); - if (perform_math_reg->has_immediate) { - callbacks->CommandLog(fmt::format("Value: {:X}", perform_math_reg->value.bit64)); - } else { - callbacks->CommandLog( - fmt::format("Src2 Idx: {:X}", perform_math_reg->src_reg_2_index)); - } - } else if (auto str_register = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Store Register to Address"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", str_register->bit_width)); - callbacks->CommandLog(fmt::format("S Reg Idx: {:X}", str_register->str_reg_index)); - callbacks->CommandLog(fmt::format("A Reg Idx: {:X}", str_register->addr_reg_index)); - callbacks->CommandLog(fmt::format("Incr Reg: {:d}", str_register->increment_reg)); - switch (str_register->ofs_type) { - case StoreRegisterOffsetType::None: - break; - case StoreRegisterOffsetType::Reg: - callbacks->CommandLog(fmt::format("O Reg Idx: {:X}", str_register->ofs_reg_index)); - break; - case StoreRegisterOffsetType::Imm: - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", str_register->rel_address)); - break; - case StoreRegisterOffsetType::MemReg: - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(str_register->mem_type))); - break; - case StoreRegisterOffsetType::MemImm: - case StoreRegisterOffsetType::MemImmReg: - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(str_register->mem_type))); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", str_register->rel_address)); - break; - } - } else if (auto begin_reg_cond = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Begin Register Conditional"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", begin_reg_cond->bit_width)); - callbacks->CommandLog( - fmt::format("Cond Type: {:X}", static_cast(begin_reg_cond->cond_type))); - callbacks->CommandLog(fmt::format("V Reg Idx: {:X}", begin_reg_cond->val_reg_index)); - switch (begin_reg_cond->comp_type) { - case CompareRegisterValueType::StaticValue: - callbacks->CommandLog("Comp Type: Static Value"); - callbacks->CommandLog(fmt::format("Value: {:X}", begin_reg_cond->value.bit64)); - break; - case CompareRegisterValueType::OtherRegister: - callbacks->CommandLog("Comp Type: Other Register"); - callbacks->CommandLog(fmt::format("X Reg Idx: {:X}", begin_reg_cond->other_reg_index)); - break; - case CompareRegisterValueType::MemoryRelAddr: - callbacks->CommandLog("Comp Type: Memory Relative Address"); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(begin_reg_cond->mem_type))); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", begin_reg_cond->rel_address)); - break; - case CompareRegisterValueType::MemoryOfsReg: - callbacks->CommandLog("Comp Type: Memory Offset Register"); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(begin_reg_cond->mem_type))); - callbacks->CommandLog(fmt::format("O Reg Idx: {:X}", begin_reg_cond->ofs_reg_index)); - break; - case CompareRegisterValueType::RegisterRelAddr: - callbacks->CommandLog("Comp Type: Register Relative Address"); - callbacks->CommandLog(fmt::format("A Reg Idx: {:X}", begin_reg_cond->addr_reg_index)); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", begin_reg_cond->rel_address)); - break; - case CompareRegisterValueType::RegisterOfsReg: - callbacks->CommandLog("Comp Type: Register Offset Register"); - callbacks->CommandLog(fmt::format("A Reg Idx: {:X}", begin_reg_cond->addr_reg_index)); - callbacks->CommandLog(fmt::format("O Reg Idx: {:X}", begin_reg_cond->ofs_reg_index)); - break; - } - } else if (auto save_restore_reg = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Save or Restore Register"); - callbacks->CommandLog(fmt::format("Dst Idx: {:X}", save_restore_reg->dst_index)); - callbacks->CommandLog(fmt::format("Src Idx: {:X}", save_restore_reg->src_index)); - callbacks->CommandLog( - fmt::format("Op Type: {:d}", static_cast(save_restore_reg->op_type))); - } else if (auto save_restore_regmask = - std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Save or Restore Register Mask"); - callbacks->CommandLog( - fmt::format("Op Type: {:d}", static_cast(save_restore_regmask->op_type))); - for (std::size_t i = 0; i < NumRegisters; i++) { - callbacks->CommandLog( - fmt::format("Act[{:02X}]: {:d}", i, save_restore_regmask->should_operate[i])); - } - } else if (auto rw_static_reg = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Read/Write Static Register"); - if (rw_static_reg->static_idx < NumReadableStaticRegisters) { - callbacks->CommandLog("Op Type: ReadStaticRegister"); - } else { - callbacks->CommandLog("Op Type: WriteStaticRegister"); - } - callbacks->CommandLog(fmt::format("Reg Idx {:X}", rw_static_reg->idx)); - callbacks->CommandLog(fmt::format("Stc Idx {:X}", rw_static_reg->static_idx)); - } else if (auto debug_log = std::get_if(&opcode.opcode)) { - callbacks->CommandLog("Opcode: Debug Log"); - callbacks->CommandLog(fmt::format("Bit Width: {:X}", debug_log->bit_width)); - callbacks->CommandLog(fmt::format("Log ID: {:X}", debug_log->log_id)); - callbacks->CommandLog( - fmt::format("Val Type: {:X}", static_cast(debug_log->val_type))); - switch (debug_log->val_type) { - case DebugLogValueType::RegisterValue: - callbacks->CommandLog("Val Type: Register Value"); - callbacks->CommandLog(fmt::format("X Reg Idx: {:X}", debug_log->val_reg_index)); - break; - case DebugLogValueType::MemoryRelAddr: - callbacks->CommandLog("Val Type: Memory Relative Address"); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(debug_log->mem_type))); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", debug_log->rel_address)); - break; - case DebugLogValueType::MemoryOfsReg: - callbacks->CommandLog("Val Type: Memory Offset Register"); - callbacks->CommandLog( - fmt::format("Mem Type: {:X}", static_cast(debug_log->mem_type))); - callbacks->CommandLog(fmt::format("O Reg Idx: {:X}", debug_log->ofs_reg_index)); - break; - case DebugLogValueType::RegisterRelAddr: - callbacks->CommandLog("Val Type: Register Relative Address"); - callbacks->CommandLog(fmt::format("A Reg Idx: {:X}", debug_log->addr_reg_index)); - callbacks->CommandLog(fmt::format("Rel Addr: {:X}", debug_log->rel_address)); - break; - case DebugLogValueType::RegisterOfsReg: - callbacks->CommandLog("Val Type: Register Offset Register"); - callbacks->CommandLog(fmt::format("A Reg Idx: {:X}", debug_log->addr_reg_index)); - callbacks->CommandLog(fmt::format("O Reg Idx: {:X}", debug_log->ofs_reg_index)); - break; - } - } else if (auto instr = std::get_if(&opcode.opcode)) { - callbacks->CommandLog(fmt::format("Unknown opcode: {:X}", static_cast(instr->opcode))); - } -} - -DmntCheatVm::Callbacks::~Callbacks() = default; - -bool DmntCheatVm::DecodeNextOpcode(CheatVmOpcode& out) { - // If we've ever seen a decode failure, return false. - bool valid = decode_success; - CheatVmOpcode opcode = {}; - SCOPE_EXIT { - decode_success &= valid; - if (valid) { - out = opcode; - } - }; - - // Helper function for getting instruction dwords. - const auto GetNextDword = [&] { - if (instruction_ptr >= num_opcodes) { - valid = false; - return static_cast(0); - } - return program[instruction_ptr++]; - }; - - // Helper function for parsing a VmInt. - const auto GetNextVmInt = [&](const u32 bit_width) { - VmInt val{}; - - const u32 first_dword = GetNextDword(); - switch (bit_width) { - case 1: - val.bit8 = static_cast(first_dword); - break; - case 2: - val.bit16 = static_cast(first_dword); - break; - case 4: - val.bit32 = first_dword; - break; - case 8: - val.bit64 = (static_cast(first_dword) << 32ul) | static_cast(GetNextDword()); - break; - } - - return val; - }; - - // Read opcode. - const u32 first_dword = GetNextDword(); - if (!valid) { - return valid; - } - - auto opcode_type = static_cast(((first_dword >> 28) & 0xF)); - if (opcode_type >= CheatVmOpcodeType::ExtendedWidth) { - opcode_type = static_cast((static_cast(opcode_type) << 4) | - ((first_dword >> 24) & 0xF)); - } - if (opcode_type >= CheatVmOpcodeType::DoubleExtendedWidth) { - opcode_type = static_cast((static_cast(opcode_type) << 4) | - ((first_dword >> 20) & 0xF)); - } - - // detect condition start. - switch (opcode_type) { - case CheatVmOpcodeType::BeginConditionalBlock: - case CheatVmOpcodeType::BeginKeypressConditionalBlock: - case CheatVmOpcodeType::BeginRegisterConditionalBlock: - opcode.begin_conditional_block = true; - break; - default: - opcode.begin_conditional_block = false; - break; - } - - switch (opcode_type) { - case CheatVmOpcodeType::StoreStatic: { - // 0TMR00AA AAAAAAAA YYYYYYYY (YYYYYYYY) - // Read additional words. - const u32 second_dword = GetNextDword(); - const u32 bit_width = (first_dword >> 24) & 0xF; - - opcode.opcode = StoreStaticOpcode{ - .bit_width = bit_width, - .mem_type = static_cast((first_dword >> 20) & 0xF), - .offset_register = (first_dword >> 16) & 0xF, - .rel_address = (static_cast(first_dword & 0xFF) << 32) | second_dword, - .value = GetNextVmInt(bit_width), - }; - } break; - case CheatVmOpcodeType::BeginConditionalBlock: { - // 1TMC00AA AAAAAAAA YYYYYYYY (YYYYYYYY) - // Read additional words. - const u32 second_dword = GetNextDword(); - const u32 bit_width = (first_dword >> 24) & 0xF; - - opcode.opcode = BeginConditionalOpcode{ - .bit_width = bit_width, - .mem_type = static_cast((first_dword >> 20) & 0xF), - .cond_type = static_cast((first_dword >> 16) & 0xF), - .rel_address = (static_cast(first_dword & 0xFF) << 32) | second_dword, - .value = GetNextVmInt(bit_width), - }; - } break; - case CheatVmOpcodeType::EndConditionalBlock: { - // 20000000 - opcode.opcode = EndConditionalOpcode{ - .is_else = ((first_dword >> 24) & 0xf) == 1, - }; - } break; - case CheatVmOpcodeType::ControlLoop: { - // 300R0000 VVVVVVVV - // 310R0000 - // Parse register, whether loop start or loop end. - ControlLoopOpcode ctrl_loop{ - .start_loop = ((first_dword >> 24) & 0xF) == 0, - .reg_index = (first_dword >> 20) & 0xF, - .num_iters = 0, - }; - - // Read number of iters if loop start. - if (ctrl_loop.start_loop) { - ctrl_loop.num_iters = GetNextDword(); - } - opcode.opcode = ctrl_loop; - } break; - case CheatVmOpcodeType::LoadRegisterStatic: { - // 400R0000 VVVVVVVV VVVVVVVV - // Read additional words. - opcode.opcode = LoadRegisterStaticOpcode{ - .reg_index = (first_dword >> 16) & 0xF, - .value = (static_cast(GetNextDword()) << 32) | GetNextDword(), - }; - } break; - case CheatVmOpcodeType::LoadRegisterMemory: { - // 5TMRI0AA AAAAAAAA - // Read additional words. - const u32 second_dword = GetNextDword(); - opcode.opcode = LoadRegisterMemoryOpcode{ - .bit_width = (first_dword >> 24) & 0xF, - .mem_type = static_cast((first_dword >> 20) & 0xF), - .reg_index = ((first_dword >> 16) & 0xF), - .load_from_reg = ((first_dword >> 12) & 0xF) != 0, - .rel_address = (static_cast(first_dword & 0xFF) << 32) | second_dword, - }; - } break; - case CheatVmOpcodeType::StoreStaticToAddress: { - // 6T0RIor0 VVVVVVVV VVVVVVVV - // Read additional words. - opcode.opcode = StoreStaticToAddressOpcode{ - .bit_width = (first_dword >> 24) & 0xF, - .reg_index = (first_dword >> 16) & 0xF, - .increment_reg = ((first_dword >> 12) & 0xF) != 0, - .add_offset_reg = ((first_dword >> 8) & 0xF) != 0, - .offset_reg_index = (first_dword >> 4) & 0xF, - .value = (static_cast(GetNextDword()) << 32) | GetNextDword(), - }; - } break; - case CheatVmOpcodeType::PerformArithmeticStatic: { - // 7T0RC000 VVVVVVVV - // Read additional words. - opcode.opcode = PerformArithmeticStaticOpcode{ - .bit_width = (first_dword >> 24) & 0xF, - .reg_index = ((first_dword >> 16) & 0xF), - .math_type = static_cast((first_dword >> 12) & 0xF), - .value = GetNextDword(), - }; - } break; - case CheatVmOpcodeType::BeginKeypressConditionalBlock: { - // 8kkkkkkk - // Just parse the mask. - opcode.opcode = BeginKeypressConditionalOpcode{ - .key_mask = first_dword & 0x0FFFFFFF, - }; - } break; - case CheatVmOpcodeType::PerformArithmeticRegister: { - // 9TCRSIs0 (VVVVVVVV (VVVVVVVV)) - PerformArithmeticRegisterOpcode perform_math_reg{ - .bit_width = (first_dword >> 24) & 0xF, - .math_type = static_cast((first_dword >> 20) & 0xF), - .dst_reg_index = (first_dword >> 16) & 0xF, - .src_reg_1_index = (first_dword >> 12) & 0xF, - .src_reg_2_index = 0, - .has_immediate = ((first_dword >> 8) & 0xF) != 0, - .value = {}, - }; - if (perform_math_reg.has_immediate) { - perform_math_reg.src_reg_2_index = 0; - perform_math_reg.value = GetNextVmInt(perform_math_reg.bit_width); - } else { - perform_math_reg.src_reg_2_index = ((first_dword >> 4) & 0xF); - } - opcode.opcode = perform_math_reg; - } break; - case CheatVmOpcodeType::StoreRegisterToAddress: { - // ATSRIOxa (aaaaaaaa) - // A = opcode 10 - // T = bit width - // S = src register index - // R = address register index - // I = 1 if increment address register, 0 if not increment address register - // O = offset type, 0 = None, 1 = Register, 2 = Immediate, 3 = Memory Region, - // 4 = Memory Region + Relative Address (ignore address register), 5 = Memory Region + - // Relative Address - // x = offset register (for offset type 1), memory type (for offset type 3) - // a = relative address (for offset type 2+3) - StoreRegisterToAddressOpcode str_register{ - .bit_width = (first_dword >> 24) & 0xF, - .str_reg_index = (first_dword >> 20) & 0xF, - .addr_reg_index = (first_dword >> 16) & 0xF, - .increment_reg = ((first_dword >> 12) & 0xF) != 0, - .ofs_type = static_cast(((first_dword >> 8) & 0xF)), - .mem_type = MemoryAccessType::MainNso, - .ofs_reg_index = (first_dword >> 4) & 0xF, - .rel_address = 0, - }; - switch (str_register.ofs_type) { - case StoreRegisterOffsetType::None: - case StoreRegisterOffsetType::Reg: - // Nothing more to do - break; - case StoreRegisterOffsetType::Imm: - str_register.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); - break; - case StoreRegisterOffsetType::MemReg: - str_register.mem_type = static_cast((first_dword >> 4) & 0xF); - break; - case StoreRegisterOffsetType::MemImm: - case StoreRegisterOffsetType::MemImmReg: - str_register.mem_type = static_cast((first_dword >> 4) & 0xF); - str_register.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); - break; - default: - str_register.ofs_type = StoreRegisterOffsetType::None; - break; - } - opcode.opcode = str_register; - } break; - case CheatVmOpcodeType::BeginRegisterConditionalBlock: { - // C0TcSX## - // C0TcS0Ma aaaaaaaa - // C0TcS1Mr - // C0TcS2Ra aaaaaaaa - // C0TcS3Rr - // C0TcS400 VVVVVVVV (VVVVVVVV) - // C0TcS5X0 - // C0 = opcode 0xC0 - // T = bit width - // c = condition type. - // S = source register. - // X = value operand type, 0 = main/heap with relative offset, 1 = main/heap with offset - // register, - // 2 = register with relative offset, 3 = register with offset register, 4 = static - // value, 5 = other register. - // M = memory type. - // R = address register. - // a = relative address. - // r = offset register. - // X = other register. - // V = value. - - BeginRegisterConditionalOpcode begin_reg_cond{ - .bit_width = (first_dword >> 20) & 0xF, - .cond_type = static_cast((first_dword >> 16) & 0xF), - .val_reg_index = (first_dword >> 12) & 0xF, - .comp_type = static_cast((first_dword >> 8) & 0xF), - .mem_type = MemoryAccessType::MainNso, - .addr_reg_index = 0, - .other_reg_index = 0, - .ofs_reg_index = 0, - .rel_address = 0, - .value = {}, - }; - - switch (begin_reg_cond.comp_type) { - case CompareRegisterValueType::StaticValue: - begin_reg_cond.value = GetNextVmInt(begin_reg_cond.bit_width); - break; - case CompareRegisterValueType::OtherRegister: - begin_reg_cond.other_reg_index = ((first_dword >> 4) & 0xF); - break; - case CompareRegisterValueType::MemoryRelAddr: - begin_reg_cond.mem_type = static_cast((first_dword >> 4) & 0xF); - begin_reg_cond.rel_address = - (static_cast(first_dword & 0xF) << 32) | GetNextDword(); - break; - case CompareRegisterValueType::MemoryOfsReg: - begin_reg_cond.mem_type = static_cast((first_dword >> 4) & 0xF); - begin_reg_cond.ofs_reg_index = (first_dword & 0xF); - break; - case CompareRegisterValueType::RegisterRelAddr: - begin_reg_cond.addr_reg_index = (first_dword >> 4) & 0xF; - begin_reg_cond.rel_address = - (static_cast(first_dword & 0xF) << 32) | GetNextDword(); - break; - case CompareRegisterValueType::RegisterOfsReg: - begin_reg_cond.addr_reg_index = (first_dword >> 4) & 0xF; - begin_reg_cond.ofs_reg_index = first_dword & 0xF; - break; - } - opcode.opcode = begin_reg_cond; - } break; - case CheatVmOpcodeType::SaveRestoreRegister: { - // C10D0Sx0 - // C1 = opcode 0xC1 - // D = destination index. - // S = source index. - // x = 3 if clearing reg, 2 if clearing saved value, 1 if saving a register, 0 if restoring - // a register. - // NOTE: If we add more save slots later, current encoding is backwards compatible. - opcode.opcode = SaveRestoreRegisterOpcode{ - .dst_index = (first_dword >> 16) & 0xF, - .src_index = (first_dword >> 8) & 0xF, - .op_type = static_cast((first_dword >> 4) & 0xF), - }; - } break; - case CheatVmOpcodeType::SaveRestoreRegisterMask: { - // C2x0XXXX - // C2 = opcode 0xC2 - // x = 3 if clearing reg, 2 if clearing saved value, 1 if saving, 0 if restoring. - // X = 16-bit bitmask, bit i --> save or restore register i. - SaveRestoreRegisterMaskOpcode save_restore_regmask{ - .op_type = static_cast((first_dword >> 20) & 0xF), - .should_operate = {}, - }; - for (std::size_t i = 0; i < NumRegisters; i++) { - save_restore_regmask.should_operate[i] = (first_dword & (1U << i)) != 0; - } - opcode.opcode = save_restore_regmask; - } break; - case CheatVmOpcodeType::ReadWriteStaticRegister: { - // C3000XXx - // C3 = opcode 0xC3. - // XX = static register index. - // x = register index. - opcode.opcode = ReadWriteStaticRegisterOpcode{ - .static_idx = (first_dword >> 4) & 0xFF, - .idx = first_dword & 0xF, - }; - } break; - case CheatVmOpcodeType::PauseProcess: { - /* FF0????? */ - /* FF0 = opcode 0xFF0 */ - /* Pauses the current process. */ - opcode.opcode = PauseProcessOpcode{}; - } break; - case CheatVmOpcodeType::ResumeProcess: { - /* FF0????? */ - /* FF0 = opcode 0xFF0 */ - /* Pauses the current process. */ - opcode.opcode = ResumeProcessOpcode{}; - } break; - case CheatVmOpcodeType::DebugLog: { - // FFFTIX## - // FFFTI0Ma aaaaaaaa - // FFFTI1Mr - // FFFTI2Ra aaaaaaaa - // FFFTI3Rr - // FFFTI4X0 - // FFF = opcode 0xFFF - // T = bit width. - // I = log id. - // X = value operand type, 0 = main/heap with relative offset, 1 = main/heap with offset - // register, - // 2 = register with relative offset, 3 = register with offset register, 4 = register - // value. - // M = memory type. - // R = address register. - // a = relative address. - // r = offset register. - // X = value register. - DebugLogOpcode debug_log{ - .bit_width = (first_dword >> 16) & 0xF, - .log_id = (first_dword >> 12) & 0xF, - .val_type = static_cast((first_dword >> 8) & 0xF), - .mem_type = MemoryAccessType::MainNso, - .addr_reg_index = 0, - .val_reg_index = 0, - .ofs_reg_index = 0, - .rel_address = 0, - }; - - switch (debug_log.val_type) { - case DebugLogValueType::RegisterValue: - debug_log.val_reg_index = (first_dword >> 4) & 0xF; - break; - case DebugLogValueType::MemoryRelAddr: - debug_log.mem_type = static_cast((first_dword >> 4) & 0xF); - debug_log.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); - break; - case DebugLogValueType::MemoryOfsReg: - debug_log.mem_type = static_cast((first_dword >> 4) & 0xF); - debug_log.ofs_reg_index = first_dword & 0xF; - break; - case DebugLogValueType::RegisterRelAddr: - debug_log.addr_reg_index = (first_dword >> 4) & 0xF; - debug_log.rel_address = (static_cast(first_dword & 0xF) << 32) | GetNextDword(); - break; - case DebugLogValueType::RegisterOfsReg: - debug_log.addr_reg_index = (first_dword >> 4) & 0xF; - debug_log.ofs_reg_index = first_dword & 0xF; - break; - } - opcode.opcode = debug_log; - } break; - case CheatVmOpcodeType::ExtendedWidth: - case CheatVmOpcodeType::DoubleExtendedWidth: - default: - // Unrecognized instruction cannot be decoded. - valid = false; - opcode.opcode = UnrecognizedInstruction{opcode_type}; - break; - } - - // End decoding. - return valid; -} - -void DmntCheatVm::SkipConditionalBlock(bool is_if) { - if (condition_depth > 0) { - // We want to continue until we're out of the current block. - const std::size_t desired_depth = condition_depth - 1; - - CheatVmOpcode skip_opcode{}; - while (condition_depth > desired_depth && DecodeNextOpcode(skip_opcode)) { - // Decode instructions until we see end of the current conditional block. - // NOTE: This is broken in gateway's implementation. - // Gateway currently checks for "0x2" instead of "0x20000000" - // In addition, they do a linear scan instead of correctly decoding opcodes. - // This causes issues if "0x2" appears as an immediate in the conditional block... - - // We also support nesting of conditional blocks, and Gateway does not. - if (skip_opcode.begin_conditional_block) { - condition_depth++; - } else if (auto end_cond = std::get_if(&skip_opcode.opcode)) { - if (!end_cond->is_else) { - condition_depth--; - } else if (is_if && condition_depth - 1 == desired_depth) { - break; - } - } - } - } else { - // Skipping, but condition_depth = 0. - // This is an error condition. - // However, I don't actually believe it is possible for this to happen. - // I guess we'll throw a fatal error here, so as to encourage me to fix the VM - // in the event that someone triggers it? I don't know how you'd do that. - UNREACHABLE_MSG("Invalid condition depth in DMNT Cheat VM"); - } -} - -u64 DmntCheatVm::GetVmInt(VmInt value, u32 bit_width) { - switch (bit_width) { - case 1: - return value.bit8; - case 2: - return value.bit16; - case 4: - return value.bit32; - case 8: - return value.bit64; - default: - // Invalid bit width -> return 0. - return 0; - } -} - -u64 DmntCheatVm::GetCheatProcessAddress(const CheatProcessMetadata& metadata, - MemoryAccessType mem_type, u64 rel_address) { - switch (mem_type) { - case MemoryAccessType::MainNso: - default: - return metadata.main_nso_extents.base + rel_address; - case MemoryAccessType::Heap: - return metadata.heap_extents.base + rel_address; - case MemoryAccessType::Alias: - return metadata.alias_extents.base + rel_address; - case MemoryAccessType::Aslr: - return metadata.aslr_extents.base + rel_address; - } -} - -void DmntCheatVm::ResetState() { - registers.fill(0); - saved_values.fill(0); - loop_tops.fill(0); - instruction_ptr = 0; - condition_depth = 0; - decode_success = true; -} - -bool DmntCheatVm::LoadProgram(const std::vector& entries) { - // Reset opcode count. - num_opcodes = 0; - - for (std::size_t i = 0; i < entries.size(); i++) { - if (entries[i].enabled) { - // Bounds check. - if (entries[i].definition.num_opcodes + num_opcodes > MaximumProgramOpcodeCount) { - num_opcodes = 0; - return false; - } - - for (std::size_t n = 0; n < entries[i].definition.num_opcodes; n++) { - program[num_opcodes++] = entries[i].definition.opcodes[n]; - } - } - } - - return true; -} - -void DmntCheatVm::Execute(const CheatProcessMetadata& metadata) { - CheatVmOpcode cur_opcode{}; - - // Get Keys down. - u64 kDown = callbacks->HidKeysDown(); - - callbacks->CommandLog("Started VM execution."); - callbacks->CommandLog(fmt::format("Main NSO: {:012X}", metadata.main_nso_extents.base)); - callbacks->CommandLog(fmt::format("Heap: {:012X}", metadata.main_nso_extents.base)); - callbacks->CommandLog(fmt::format("Keys Down: {:08X}", static_cast(kDown & 0x0FFFFFFF))); - - // Clear VM state. - ResetState(); - - // Loop until program finishes. - while (DecodeNextOpcode(cur_opcode)) { - callbacks->CommandLog( - fmt::format("Instruction Ptr: {:04X}", static_cast(instruction_ptr))); - - for (std::size_t i = 0; i < NumRegisters; i++) { - callbacks->CommandLog(fmt::format("Registers[{:02X}]: {:016X}", i, registers[i])); - } - - for (std::size_t i = 0; i < NumRegisters; i++) { - callbacks->CommandLog(fmt::format("SavedRegs[{:02X}]: {:016X}", i, saved_values[i])); - } - LogOpcode(cur_opcode); - - // Increment conditional depth, if relevant. - if (cur_opcode.begin_conditional_block) { - condition_depth++; - } - - if (auto store_static = std::get_if(&cur_opcode.opcode)) { - // Calculate address, write value to memory. - u64 dst_address = GetCheatProcessAddress(metadata, store_static->mem_type, - store_static->rel_address + - registers[store_static->offset_register]); - u64 dst_value = GetVmInt(store_static->value, store_static->bit_width); - switch (store_static->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryWriteUnsafe(dst_address, &dst_value, store_static->bit_width); - break; - } - } else if (auto begin_cond = std::get_if(&cur_opcode.opcode)) { - // Read value from memory. - u64 src_address = - GetCheatProcessAddress(metadata, begin_cond->mem_type, begin_cond->rel_address); - u64 src_value = 0; - switch (begin_cond->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryReadUnsafe(src_address, &src_value, begin_cond->bit_width); - break; - } - // Check against condition. - u64 cond_value = GetVmInt(begin_cond->value, begin_cond->bit_width); - bool cond_met = false; - switch (begin_cond->cond_type) { - case ConditionalComparisonType::GT: - cond_met = src_value > cond_value; - break; - case ConditionalComparisonType::GE: - cond_met = src_value >= cond_value; - break; - case ConditionalComparisonType::LT: - cond_met = src_value < cond_value; - break; - case ConditionalComparisonType::LE: - cond_met = src_value <= cond_value; - break; - case ConditionalComparisonType::EQ: - cond_met = src_value == cond_value; - break; - case ConditionalComparisonType::NE: - cond_met = src_value != cond_value; - break; - } - // Skip conditional block if condition not met. - if (!cond_met) { - SkipConditionalBlock(true); - } - } else if (auto end_cond = std::get_if(&cur_opcode.opcode)) { - if (end_cond->is_else) { - /* Skip to the end of the conditional block. */ - this->SkipConditionalBlock(false); - } else { - /* Decrement the condition depth. */ - /* We will assume, graciously, that mismatched conditional block ends are a nop. */ - if (condition_depth > 0) { - condition_depth--; - } - } - } else if (auto ctrl_loop = std::get_if(&cur_opcode.opcode)) { - if (ctrl_loop->start_loop) { - // Start a loop. - registers[ctrl_loop->reg_index] = ctrl_loop->num_iters; - loop_tops[ctrl_loop->reg_index] = instruction_ptr; - } else { - // End a loop. - registers[ctrl_loop->reg_index]--; - if (registers[ctrl_loop->reg_index] != 0) { - instruction_ptr = loop_tops[ctrl_loop->reg_index]; - } - } - } else if (auto ldr_static = std::get_if(&cur_opcode.opcode)) { - // Set a register to a static value. - registers[ldr_static->reg_index] = ldr_static->value; - } else if (auto ldr_memory = std::get_if(&cur_opcode.opcode)) { - // Choose source address. - u64 src_address; - if (ldr_memory->load_from_reg) { - src_address = registers[ldr_memory->reg_index] + ldr_memory->rel_address; - } else { - src_address = - GetCheatProcessAddress(metadata, ldr_memory->mem_type, ldr_memory->rel_address); - } - // Read into register. Gateway only reads on valid bitwidth. - switch (ldr_memory->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryReadUnsafe(src_address, ®isters[ldr_memory->reg_index], - ldr_memory->bit_width); - break; - } - } else if (auto str_static = std::get_if(&cur_opcode.opcode)) { - // Calculate address. - u64 dst_address = registers[str_static->reg_index]; - u64 dst_value = str_static->value; - if (str_static->add_offset_reg) { - dst_address += registers[str_static->offset_reg_index]; - } - // Write value to memory. Gateway only writes on valid bitwidth. - switch (str_static->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryWriteUnsafe(dst_address, &dst_value, str_static->bit_width); - break; - } - // Increment register if relevant. - if (str_static->increment_reg) { - registers[str_static->reg_index] += str_static->bit_width; - } - } else if (auto perform_math_static = - std::get_if(&cur_opcode.opcode)) { - // Do requested math. - switch (perform_math_static->math_type) { - case RegisterArithmeticType::Addition: - registers[perform_math_static->reg_index] += - static_cast(perform_math_static->value); - break; - case RegisterArithmeticType::Subtraction: - registers[perform_math_static->reg_index] -= - static_cast(perform_math_static->value); - break; - case RegisterArithmeticType::Multiplication: - registers[perform_math_static->reg_index] *= - static_cast(perform_math_static->value); - break; - case RegisterArithmeticType::LeftShift: - registers[perform_math_static->reg_index] <<= - static_cast(perform_math_static->value); - break; - case RegisterArithmeticType::RightShift: - registers[perform_math_static->reg_index] >>= - static_cast(perform_math_static->value); - break; - default: - // Do not handle extensions here. - break; - } - // Apply bit width. - switch (perform_math_static->bit_width) { - case 1: - registers[perform_math_static->reg_index] = - static_cast(registers[perform_math_static->reg_index]); - break; - case 2: - registers[perform_math_static->reg_index] = - static_cast(registers[perform_math_static->reg_index]); - break; - case 4: - registers[perform_math_static->reg_index] = - static_cast(registers[perform_math_static->reg_index]); - break; - case 8: - registers[perform_math_static->reg_index] = - static_cast(registers[perform_math_static->reg_index]); - break; - } - } else if (auto begin_keypress_cond = - std::get_if(&cur_opcode.opcode)) { - // Check for keypress. - if ((begin_keypress_cond->key_mask & kDown) != begin_keypress_cond->key_mask) { - // Keys not pressed. Skip conditional block. - SkipConditionalBlock(true); - } - } else if (auto perform_math_reg = - std::get_if(&cur_opcode.opcode)) { - const u64 operand_1_value = registers[perform_math_reg->src_reg_1_index]; - const u64 operand_2_value = - perform_math_reg->has_immediate - ? GetVmInt(perform_math_reg->value, perform_math_reg->bit_width) - : registers[perform_math_reg->src_reg_2_index]; - - u64 res_val = 0; - // Do requested math. - switch (perform_math_reg->math_type) { - case RegisterArithmeticType::Addition: - res_val = operand_1_value + operand_2_value; - break; - case RegisterArithmeticType::Subtraction: - res_val = operand_1_value - operand_2_value; - break; - case RegisterArithmeticType::Multiplication: - res_val = operand_1_value * operand_2_value; - break; - case RegisterArithmeticType::LeftShift: - res_val = operand_1_value << operand_2_value; - break; - case RegisterArithmeticType::RightShift: - res_val = operand_1_value >> operand_2_value; - break; - case RegisterArithmeticType::LogicalAnd: - res_val = operand_1_value & operand_2_value; - break; - case RegisterArithmeticType::LogicalOr: - res_val = operand_1_value | operand_2_value; - break; - case RegisterArithmeticType::LogicalNot: - res_val = ~operand_1_value; - break; - case RegisterArithmeticType::LogicalXor: - res_val = operand_1_value ^ operand_2_value; - break; - case RegisterArithmeticType::None: - res_val = operand_1_value; - break; - } - - // Apply bit width. - switch (perform_math_reg->bit_width) { - case 1: - res_val = static_cast(res_val); - break; - case 2: - res_val = static_cast(res_val); - break; - case 4: - res_val = static_cast(res_val); - break; - case 8: - res_val = static_cast(res_val); - break; - } - - // Save to register. - registers[perform_math_reg->dst_reg_index] = res_val; - } else if (auto str_register = - std::get_if(&cur_opcode.opcode)) { - // Calculate address. - u64 dst_value = registers[str_register->str_reg_index]; - u64 dst_address = registers[str_register->addr_reg_index]; - switch (str_register->ofs_type) { - case StoreRegisterOffsetType::None: - // Nothing more to do - break; - case StoreRegisterOffsetType::Reg: - dst_address += registers[str_register->ofs_reg_index]; - break; - case StoreRegisterOffsetType::Imm: - dst_address += str_register->rel_address; - break; - case StoreRegisterOffsetType::MemReg: - dst_address = GetCheatProcessAddress(metadata, str_register->mem_type, - registers[str_register->addr_reg_index]); - break; - case StoreRegisterOffsetType::MemImm: - dst_address = GetCheatProcessAddress(metadata, str_register->mem_type, - str_register->rel_address); - break; - case StoreRegisterOffsetType::MemImmReg: - dst_address = GetCheatProcessAddress(metadata, str_register->mem_type, - registers[str_register->addr_reg_index] + - str_register->rel_address); - break; - } - - // Write value to memory. Write only on valid bitwidth. - switch (str_register->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryWriteUnsafe(dst_address, &dst_value, str_register->bit_width); - break; - } - - // Increment register if relevant. - if (str_register->increment_reg) { - registers[str_register->addr_reg_index] += str_register->bit_width; - } - } else if (auto begin_reg_cond = - std::get_if(&cur_opcode.opcode)) { - // Get value from register. - u64 src_value = 0; - switch (begin_reg_cond->bit_width) { - case 1: - src_value = static_cast(registers[begin_reg_cond->val_reg_index] & 0xFFul); - break; - case 2: - src_value = static_cast(registers[begin_reg_cond->val_reg_index] & 0xFFFFul); - break; - case 4: - src_value = - static_cast(registers[begin_reg_cond->val_reg_index] & 0xFFFFFFFFul); - break; - case 8: - src_value = static_cast(registers[begin_reg_cond->val_reg_index] & - 0xFFFFFFFFFFFFFFFFul); - break; - } - - // Read value from memory. - u64 cond_value = 0; - if (begin_reg_cond->comp_type == CompareRegisterValueType::StaticValue) { - cond_value = GetVmInt(begin_reg_cond->value, begin_reg_cond->bit_width); - } else if (begin_reg_cond->comp_type == CompareRegisterValueType::OtherRegister) { - switch (begin_reg_cond->bit_width) { - case 1: - cond_value = - static_cast(registers[begin_reg_cond->other_reg_index] & 0xFFul); - break; - case 2: - cond_value = - static_cast(registers[begin_reg_cond->other_reg_index] & 0xFFFFul); - break; - case 4: - cond_value = - static_cast(registers[begin_reg_cond->other_reg_index] & 0xFFFFFFFFul); - break; - case 8: - cond_value = static_cast(registers[begin_reg_cond->other_reg_index] & - 0xFFFFFFFFFFFFFFFFul); - break; - } - } else { - u64 cond_address = 0; - switch (begin_reg_cond->comp_type) { - case CompareRegisterValueType::MemoryRelAddr: - cond_address = GetCheatProcessAddress(metadata, begin_reg_cond->mem_type, - begin_reg_cond->rel_address); - break; - case CompareRegisterValueType::MemoryOfsReg: - cond_address = GetCheatProcessAddress(metadata, begin_reg_cond->mem_type, - registers[begin_reg_cond->ofs_reg_index]); - break; - case CompareRegisterValueType::RegisterRelAddr: - cond_address = - registers[begin_reg_cond->addr_reg_index] + begin_reg_cond->rel_address; - break; - case CompareRegisterValueType::RegisterOfsReg: - cond_address = registers[begin_reg_cond->addr_reg_index] + - registers[begin_reg_cond->ofs_reg_index]; - break; - default: - break; - } - switch (begin_reg_cond->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryReadUnsafe(cond_address, &cond_value, - begin_reg_cond->bit_width); - break; - } - } - - // Check against condition. - bool cond_met = false; - switch (begin_reg_cond->cond_type) { - case ConditionalComparisonType::GT: - cond_met = src_value > cond_value; - break; - case ConditionalComparisonType::GE: - cond_met = src_value >= cond_value; - break; - case ConditionalComparisonType::LT: - cond_met = src_value < cond_value; - break; - case ConditionalComparisonType::LE: - cond_met = src_value <= cond_value; - break; - case ConditionalComparisonType::EQ: - cond_met = src_value == cond_value; - break; - case ConditionalComparisonType::NE: - cond_met = src_value != cond_value; - break; - } - - // Skip conditional block if condition not met. - if (!cond_met) { - SkipConditionalBlock(true); - } - } else if (auto save_restore_reg = - std::get_if(&cur_opcode.opcode)) { - // Save or restore a register. - switch (save_restore_reg->op_type) { - case SaveRestoreRegisterOpType::ClearRegs: - registers[save_restore_reg->dst_index] = 0ul; - break; - case SaveRestoreRegisterOpType::ClearSaved: - saved_values[save_restore_reg->dst_index] = 0ul; - break; - case SaveRestoreRegisterOpType::Save: - saved_values[save_restore_reg->dst_index] = registers[save_restore_reg->src_index]; - break; - case SaveRestoreRegisterOpType::Restore: - default: - registers[save_restore_reg->dst_index] = saved_values[save_restore_reg->src_index]; - break; - } - } else if (auto save_restore_regmask = - std::get_if(&cur_opcode.opcode)) { - // Save or restore register mask. - u64* src; - u64* dst; - switch (save_restore_regmask->op_type) { - case SaveRestoreRegisterOpType::ClearSaved: - case SaveRestoreRegisterOpType::Save: - src = registers.data(); - dst = saved_values.data(); - break; - case SaveRestoreRegisterOpType::ClearRegs: - case SaveRestoreRegisterOpType::Restore: - default: - src = saved_values.data(); - dst = registers.data(); - break; - } - for (std::size_t i = 0; i < NumRegisters; i++) { - if (save_restore_regmask->should_operate[i]) { - switch (save_restore_regmask->op_type) { - case SaveRestoreRegisterOpType::ClearSaved: - case SaveRestoreRegisterOpType::ClearRegs: - dst[i] = 0ul; - break; - case SaveRestoreRegisterOpType::Save: - case SaveRestoreRegisterOpType::Restore: - default: - dst[i] = src[i]; - break; - } - } - } - } else if (auto rw_static_reg = - std::get_if(&cur_opcode.opcode)) { - if (rw_static_reg->static_idx < NumReadableStaticRegisters) { - // Load a register with a static register. - registers[rw_static_reg->idx] = static_registers[rw_static_reg->static_idx]; - } else { - // Store a register to a static register. - static_registers[rw_static_reg->static_idx] = registers[rw_static_reg->idx]; - } - } else if (std::holds_alternative(cur_opcode.opcode)) { - callbacks->PauseProcess(); - } else if (std::holds_alternative(cur_opcode.opcode)) { - callbacks->ResumeProcess(); - } else if (auto debug_log = std::get_if(&cur_opcode.opcode)) { - // Read value from memory. - u64 log_value = 0; - if (debug_log->val_type == DebugLogValueType::RegisterValue) { - switch (debug_log->bit_width) { - case 1: - log_value = static_cast(registers[debug_log->val_reg_index] & 0xFFul); - break; - case 2: - log_value = static_cast(registers[debug_log->val_reg_index] & 0xFFFFul); - break; - case 4: - log_value = - static_cast(registers[debug_log->val_reg_index] & 0xFFFFFFFFul); - break; - case 8: - log_value = static_cast(registers[debug_log->val_reg_index] & - 0xFFFFFFFFFFFFFFFFul); - break; - } - } else { - u64 val_address = 0; - switch (debug_log->val_type) { - case DebugLogValueType::MemoryRelAddr: - val_address = GetCheatProcessAddress(metadata, debug_log->mem_type, - debug_log->rel_address); - break; - case DebugLogValueType::MemoryOfsReg: - val_address = GetCheatProcessAddress(metadata, debug_log->mem_type, - registers[debug_log->ofs_reg_index]); - break; - case DebugLogValueType::RegisterRelAddr: - val_address = registers[debug_log->addr_reg_index] + debug_log->rel_address; - break; - case DebugLogValueType::RegisterOfsReg: - val_address = - registers[debug_log->addr_reg_index] + registers[debug_log->ofs_reg_index]; - break; - default: - break; - } - switch (debug_log->bit_width) { - case 1: - case 2: - case 4: - case 8: - callbacks->MemoryReadUnsafe(val_address, &log_value, debug_log->bit_width); - break; - } - } - - // Log value. - DebugLog(debug_log->log_id, log_value); - } - } -} - -} // namespace Core::Memory diff --git a/src/core/memory/dmnt_cheat_vm.h b/src/core/memory/dmnt_cheat_vm.h deleted file mode 100644 index de5e81add2..0000000000 --- a/src/core/memory/dmnt_cheat_vm.h +++ /dev/null @@ -1,330 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include - -#include -#include "common/common_types.h" -#include "core/memory/dmnt_cheat_types.h" - -namespace Core::Memory { - -enum class CheatVmOpcodeType : u32 { - StoreStatic = 0, - BeginConditionalBlock = 1, - EndConditionalBlock = 2, - ControlLoop = 3, - LoadRegisterStatic = 4, - LoadRegisterMemory = 5, - StoreStaticToAddress = 6, - PerformArithmeticStatic = 7, - BeginKeypressConditionalBlock = 8, - - // These are not implemented by Gateway's VM. - PerformArithmeticRegister = 9, - StoreRegisterToAddress = 10, - Reserved11 = 11, - - // This is a meta entry, and not a real opcode. - // This is to facilitate multi-nybble instruction decoding. - ExtendedWidth = 12, - - // Extended width opcodes. - BeginRegisterConditionalBlock = 0xC0, - SaveRestoreRegister = 0xC1, - SaveRestoreRegisterMask = 0xC2, - ReadWriteStaticRegister = 0xC3, - - // This is a meta entry, and not a real opcode. - // This is to facilitate multi-nybble instruction decoding. - DoubleExtendedWidth = 0xF0, - - // Double-extended width opcodes. - PauseProcess = 0xFF0, - ResumeProcess = 0xFF1, - DebugLog = 0xFFF, -}; - -enum class MemoryAccessType : u32 { - MainNso = 0, - Heap = 1, - Alias = 2, - Aslr = 3, -}; - -enum class ConditionalComparisonType : u32 { - GT = 1, - GE = 2, - LT = 3, - LE = 4, - EQ = 5, - NE = 6, -}; - -enum class RegisterArithmeticType : u32 { - Addition = 0, - Subtraction = 1, - Multiplication = 2, - LeftShift = 3, - RightShift = 4, - - // These are not supported by Gateway's VM. - LogicalAnd = 5, - LogicalOr = 6, - LogicalNot = 7, - LogicalXor = 8, - - None = 9, -}; - -enum class StoreRegisterOffsetType : u32 { - None = 0, - Reg = 1, - Imm = 2, - MemReg = 3, - MemImm = 4, - MemImmReg = 5, -}; - -enum class CompareRegisterValueType : u32 { - MemoryRelAddr = 0, - MemoryOfsReg = 1, - RegisterRelAddr = 2, - RegisterOfsReg = 3, - StaticValue = 4, - OtherRegister = 5, -}; - -enum class SaveRestoreRegisterOpType : u32 { - Restore = 0, - Save = 1, - ClearSaved = 2, - ClearRegs = 3, -}; - -enum class DebugLogValueType : u32 { - MemoryRelAddr = 0, - MemoryOfsReg = 1, - RegisterRelAddr = 2, - RegisterOfsReg = 3, - RegisterValue = 4, -}; - -union VmInt { - u8 bit8; - u16 bit16; - u32 bit32; - u64 bit64; -}; - -struct StoreStaticOpcode { - u32 bit_width{}; - MemoryAccessType mem_type{}; - u32 offset_register{}; - u64 rel_address{}; - VmInt value{}; -}; - -struct BeginConditionalOpcode { - u32 bit_width{}; - MemoryAccessType mem_type{}; - ConditionalComparisonType cond_type{}; - u64 rel_address{}; - VmInt value{}; -}; - -struct EndConditionalOpcode { - bool is_else; -}; - -struct ControlLoopOpcode { - bool start_loop{}; - u32 reg_index{}; - u32 num_iters{}; -}; - -struct LoadRegisterStaticOpcode { - u32 reg_index{}; - u64 value{}; -}; - -struct LoadRegisterMemoryOpcode { - u32 bit_width{}; - MemoryAccessType mem_type{}; - u32 reg_index{}; - bool load_from_reg{}; - u64 rel_address{}; -}; - -struct StoreStaticToAddressOpcode { - u32 bit_width{}; - u32 reg_index{}; - bool increment_reg{}; - bool add_offset_reg{}; - u32 offset_reg_index{}; - u64 value{}; -}; - -struct PerformArithmeticStaticOpcode { - u32 bit_width{}; - u32 reg_index{}; - RegisterArithmeticType math_type{}; - u32 value{}; -}; - -struct BeginKeypressConditionalOpcode { - u32 key_mask{}; -}; - -struct PerformArithmeticRegisterOpcode { - u32 bit_width{}; - RegisterArithmeticType math_type{}; - u32 dst_reg_index{}; - u32 src_reg_1_index{}; - u32 src_reg_2_index{}; - bool has_immediate{}; - VmInt value{}; -}; - -struct StoreRegisterToAddressOpcode { - u32 bit_width{}; - u32 str_reg_index{}; - u32 addr_reg_index{}; - bool increment_reg{}; - StoreRegisterOffsetType ofs_type{}; - MemoryAccessType mem_type{}; - u32 ofs_reg_index{}; - u64 rel_address{}; -}; - -struct BeginRegisterConditionalOpcode { - u32 bit_width{}; - ConditionalComparisonType cond_type{}; - u32 val_reg_index{}; - CompareRegisterValueType comp_type{}; - MemoryAccessType mem_type{}; - u32 addr_reg_index{}; - u32 other_reg_index{}; - u32 ofs_reg_index{}; - u64 rel_address{}; - VmInt value{}; -}; - -struct SaveRestoreRegisterOpcode { - u32 dst_index{}; - u32 src_index{}; - SaveRestoreRegisterOpType op_type{}; -}; - -struct SaveRestoreRegisterMaskOpcode { - SaveRestoreRegisterOpType op_type{}; - std::array should_operate{}; -}; - -struct ReadWriteStaticRegisterOpcode { - u32 static_idx{}; - u32 idx{}; -}; - -struct PauseProcessOpcode {}; - -struct ResumeProcessOpcode {}; - -struct DebugLogOpcode { - u32 bit_width{}; - u32 log_id{}; - DebugLogValueType val_type{}; - MemoryAccessType mem_type{}; - u32 addr_reg_index{}; - u32 val_reg_index{}; - u32 ofs_reg_index{}; - u64 rel_address{}; -}; - -struct UnrecognizedInstruction { - CheatVmOpcodeType opcode{}; -}; - -struct CheatVmOpcode { - bool begin_conditional_block{}; - std::variant - opcode{}; -}; - -class DmntCheatVm { -public: - /// Helper Type for DmntCheatVm <=> yuzu Interface - class Callbacks { - public: - virtual ~Callbacks(); - - virtual void MemoryReadUnsafe(VAddr address, void* data, u64 size) = 0; - virtual void MemoryWriteUnsafe(VAddr address, const void* data, u64 size) = 0; - - virtual u64 HidKeysDown() = 0; - - virtual void PauseProcess() = 0; - virtual void ResumeProcess() = 0; - - virtual void DebugLog(u8 id, u64 value) = 0; - virtual void CommandLog(std::string_view data) = 0; - }; - - static constexpr std::size_t MaximumProgramOpcodeCount = 0x400; - static constexpr std::size_t NumRegisters = 0x10; - static constexpr std::size_t NumReadableStaticRegisters = 0x80; - static constexpr std::size_t NumWritableStaticRegisters = 0x80; - static constexpr std::size_t NumStaticRegisters = - NumReadableStaticRegisters + NumWritableStaticRegisters; - - explicit DmntCheatVm(std::unique_ptr callbacks_); - ~DmntCheatVm(); - - std::size_t GetProgramSize() const { - return this->num_opcodes; - } - - bool LoadProgram(const std::vector& cheats); - void Execute(const CheatProcessMetadata& metadata); - -private: - std::unique_ptr callbacks; - - std::size_t num_opcodes = 0; - std::size_t instruction_ptr = 0; - std::size_t condition_depth = 0; - bool decode_success = false; - std::array program{}; - std::array registers{}; - std::array saved_values{}; - std::array static_registers{}; - std::array loop_tops{}; - - bool DecodeNextOpcode(CheatVmOpcode& out); - void SkipConditionalBlock(bool is_if); - void ResetState(); - - // For implementing the DebugLog opcode. - void DebugLog(u32 log_id, u64 value); - - void LogOpcode(const CheatVmOpcode& opcode); - - static u64 GetVmInt(VmInt value, u32 bit_width); - static u64 GetCheatProcessAddress(const CheatProcessMetadata& metadata, - MemoryAccessType mem_type, u64 rel_address); -}; - -}; // namespace Core::Memory diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index ebb3fcd020..022e27a75f 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -79,9 +79,7 @@ namespace { #endif if (enable_validation && AreExtensionsSupported(dld, *properties, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME})) extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); - // VK_EXT_surface_maintenance1 is required for VK_EXT_swapchain_maintenance1 - if (window_type != Core::Frontend::WindowSystemType::Headless && AreExtensionsSupported(dld, *properties, std::array{VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME})) - extensions.push_back(VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME); + } return extensions; } diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index ee2db55a5d..7fd975164d 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -5,6 +5,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include +#include #include #include @@ -73,10 +75,32 @@ ConfigurePerGameAddons::~ConfigurePerGameAddons() = default; void ConfigurePerGameAddons::ApplyConfiguration() { std::vector disabled_addons; - for (const auto& item : list_items) { - const auto disabled = item.front()->checkState() == Qt::Unchecked; - if (disabled) - disabled_addons.push_back(item.front()->text().toStdString()); + // Helper function to recursively collect disabled items + std::function collect_disabled = [&](QStandardItem* item) { + if (item == nullptr) { + return; + } + + // Check if this item is disabled + if (item->isCheckable() && item->checkState() == Qt::Unchecked) { + // Use the stored key from UserRole, falling back to text + const auto key = item->data(Qt::UserRole).toString(); + if (!key.isEmpty()) { + disabled_addons.push_back(key.toStdString()); + } else { + disabled_addons.push_back(item->text().toStdString()); + } + } + + // Process children (for cheats under mods) + for (int row = 0; row < item->rowCount(); ++row) { + collect_disabled(item->child(row, 0)); + } + }; + + // Process all root items + for (int row = 0; row < item_model->rowCount(); ++row) { + collect_disabled(item_model->item(row, 0)); } auto current = Settings::values.disabled_addons[title_id]; @@ -123,24 +147,61 @@ void ConfigurePerGameAddons::LoadConfiguration() { FileSys::VirtualFile update_raw; loader->ReadUpdateRaw(update_raw); + // Get the build ID from the main executable for cheat enumeration + const auto build_id = pm.GetBuildID(update_raw); + const auto& disabled = Settings::values.disabled_addons[title_id]; - for (const auto& patch : pm.GetPatches(update_raw)) { + // Map to store parent items for mods (for adding cheat children) + std::map mod_items; + + for (const auto& patch : pm.GetPatches(update_raw, build_id)) { const auto name = QString::fromStdString(patch.name); + // For cheats, we need to use the full key (parent::name) for storage + std::string storage_key; + if (patch.type == FileSys::PatchType::Cheat && !patch.parent_name.empty()) { + storage_key = patch.parent_name + "::" + patch.name; + } else { + storage_key = patch.name; + } + auto* const first_item = new QStandardItem; first_item->setText(name); first_item->setCheckable(true); + // Store the storage key as user data for later retrieval + first_item->setData(QString::fromStdString(storage_key), Qt::UserRole); + const auto patch_disabled = - std::find(disabled.begin(), disabled.end(), name.toStdString()) != disabled.end(); + std::find(disabled.begin(), disabled.end(), storage_key) != disabled.end(); first_item->setCheckState(patch_disabled ? Qt::Unchecked : Qt::Checked); - list_items.push_back(QList{ - first_item, new QStandardItem{QString::fromStdString(patch.version)}}); - item_model->appendRow(list_items.back()); + auto* const version_item = new QStandardItem{QString::fromStdString(patch.version)}; + + if (patch.type == FileSys::PatchType::Cheat && !patch.parent_name.empty()) { + // This is a cheat - add as child of its parent mod + auto parent_it = mod_items.find(patch.parent_name); + if (parent_it != mod_items.end()) { + parent_it->second->appendRow(QList{first_item, version_item}); + } else { + // Parent not found (shouldn't happen), add to root + list_items.push_back(QList{first_item, version_item}); + item_model->appendRow(list_items.back()); + } + } else { + // This is a top-level item (Update, Mod, DLC) + list_items.push_back(QList{first_item, version_item}); + item_model->appendRow(list_items.back()); + + // Store mod items for later cheat attachment + if (patch.type == FileSys::PatchType::Mod) { + mod_items[patch.name] = first_item; + } + } } + tree_view->expandAll(); tree_view->resizeColumnToContents(1); } From dc85d184b423f317eda5f35c1518f17bd9ab2b38 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Thu, 18 Dec 2025 15:47:03 +0100 Subject: [PATCH 002/170] fix license header and compilation issues --- .../src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt | 3 +++ src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt | 3 +++ .../app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt | 3 +++ src/core/file_sys/patch_manager.h | 3 +++ src/core/hle/service/dmnt/cheat_parser.cpp | 1 + 5 files changed, 13 insertions(+) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt index 90938870ca..f3d5b5936e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt index 9c2ad80eae..87c573044c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt index 271d3b869b..668ef97165 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index f2e226a71b..4aa9b650cb 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/dmnt/cheat_parser.cpp b/src/core/hle/service/dmnt/cheat_parser.cpp index eb8f298fa4..ef33a8560a 100644 --- a/src/core/hle/service/dmnt/cheat_parser.cpp +++ b/src/core/hle/service/dmnt/cheat_parser.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include From 26f6f37616859f15102e6c77043a0a406e973e4a Mon Sep 17 00:00:00 2001 From: Maufeat Date: Fri, 19 Dec 2025 11:38:05 +0100 Subject: [PATCH 003/170] fix orientation and list bug --- .../main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt | 3 ++- .../java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt | 6 ++++-- .../main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt | 7 ++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt index 47ccca556c..b96debcf8a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt @@ -32,8 +32,9 @@ class AddonAdapter(val addonViewModel: AddonViewModel) : binding.addonSwitch.performClick() } binding.title.text = model.name - binding.addonSwitch.isChecked = model.enabled + binding.addonSwitch.setOnCheckedChangeListener(null) + binding.addonSwitch.isChecked = model.enabled binding.addonSwitch.setOnCheckedChangeListener { _, checked -> model.enabled = checked } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt index 573549d84b..ca13b338a1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt @@ -73,7 +73,7 @@ class AddonsFragment : Fragment() { } addonViewModel.addonList.collect(viewLifecycleOwner) { - (binding.listAddons.adapter as AddonAdapter).submitList(it) + (binding.listAddons.adapter as AddonAdapter).submitList(it.toList()) } addonViewModel.showModInstallPicker.collect( viewLifecycleOwner, @@ -127,7 +127,9 @@ class AddonsFragment : Fragment() { override fun onDestroy() { super.onDestroy() - addonViewModel.onCloseAddons() + if (!requireActivity().isChangingConfigurations) { + addonViewModel.onCloseAddons() + } } val installAddon = diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt index f3d5b5936e..dbe199b451 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt @@ -31,10 +31,14 @@ class AddonViewModel : ViewModel() { val addonToDelete = _addonToDelete.asStateFlow() var game: Game? = null + private set private val isRefreshing = AtomicBoolean(false) fun onOpenAddons(game: Game) { + if (this.game?.programId == game.programId && _patchList.value.isNotEmpty()) { + return + } this.game = game refreshAddons() } @@ -67,6 +71,7 @@ class AddonViewModel : ViewModel() { PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name) PatchType.Cheat -> {} } + _patchList.value.clear() refreshAddons() } @@ -81,7 +86,7 @@ class AddonViewModel : ViewModel() { if (it.enabled) { null } else { - it.getStorageKey() // Use storage key for proper cheat identification + it.getStorageKey() } }.toTypedArray() ) From d9973ff67471e15ddd40665646bf517af03c0b51 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Fri, 19 Dec 2025 11:42:05 +0100 Subject: [PATCH 004/170] correct license header --- .../src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt index ca13b338a1..ba4dcc0ed4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments From 993819f29f94de49535b1b4efa3e0dee68ab9833 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Wed, 21 Jan 2026 06:25:35 +0100 Subject: [PATCH 005/170] fix the rebase --- src/core/core.cpp | 149 +++++++++++++++++++++++++--- src/core/file_sys/patch_manager.cpp | 9 +- 2 files changed, 142 insertions(+), 16 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index bada8ef2c1..8ae97d8713 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -40,6 +40,7 @@ #include "core/hle/service/am/frontend/applets.h" #include "core/hle/service/am/process_creation.h" #include "core/hle/service/apm/apm_controller.h" +#include "core/hle/service/dmnt/cheat_process_manager.h" #include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/glue/glue_manager.h" #include "core/hle/service/glue/time/static.h" @@ -54,7 +55,6 @@ #include "core/internal_network/network.h" #include "core/loader/loader.h" #include "core/memory.h" -#include "core/memory/cheat_engine.h" #include "core/perf_stats.h" #include "core/reporter.h" #include "core/tools/freezer.h" @@ -277,8 +277,17 @@ struct System::Impl { audio_core.emplace(system); service_manager = std::make_shared(kernel); + + // Create cheat_manager BEFORE services, as DMNT::LoopProcess needs it + cheat_manager = std::make_unique(system); + services.emplace(service_manager, system, stop_event.get_token()); + // Apply any pending cheats that were registered before cheat_manager was initialized + if (pending_cheats.has_pending) { + ApplyPendingCheats(system); + } + is_powered_on = true; exit_locked = false; exit_requested = false; @@ -339,11 +348,6 @@ struct System::Impl { return init_result; } - // Initialize cheat engine - if (cheat_engine) { - cheat_engine->Initialize(); - } - // Register with applet manager // All threads are started, begin main process execution, now that we're in the clear applet_manager.CreateAndInsertByFrontendAppletParameters(std::move(process), params); @@ -404,7 +408,6 @@ struct System::Impl { services.reset(); service_manager.reset(); fs_controller.Reset(); - cheat_engine.reset(); core_timing.ClearPendingEvents(); app_loader.reset(); audio_core.reset(); @@ -465,7 +468,6 @@ struct System::Impl { Core::SpeedLimiter speed_limiter; ExecuteProgramCallback execute_program_callback; ExitCallback exit_callback; - std::optional services; std::optional debugger; std::optional general_channel_context; @@ -474,7 +476,6 @@ struct System::Impl { std::optional host1x_core; std::optional device_memory; std::optional audio_core; - std::optional cheat_engine; std::optional memory_freezer; std::optional renderdoc_api; @@ -494,6 +495,17 @@ struct System::Impl { std::unique_ptr gpu_core; std::stop_source stop_event; + /// Cheat Manager (DMNT) + std::unique_ptr cheat_manager; + /// Pending cheats to register after cheat_manager is initialized + struct PendingCheats { + std::vector list; + std::array build_id{}; + u64 main_region_begin{}; + u64 main_region_size{}; + bool has_pending{false}; + } pending_cheats; + mutable std::mutex suspend_guard; std::mutex general_channel_mutex; std::atomic_bool is_paused{}; @@ -511,6 +523,61 @@ struct System::Impl { general_channel_event.emplace(*general_channel_context); } } + + void ApplyPendingCheats(System& system) { + if (!pending_cheats.has_pending || !cheat_manager) { + return; + } + + LOG_DEBUG(Core, "Applying {} pending cheats", pending_cheats.list.size()); + + const auto result = cheat_manager->AttachToApplicationProcess( + pending_cheats.build_id, pending_cheats.main_region_begin, + pending_cheats.main_region_size); + + if (result.IsError()) { + LOG_WARNING(Core, "Failed to attach cheat process: result={}", result.raw); + pending_cheats = {}; + return; + } + + LOG_DEBUG(Core, "Cheat process attached successfully"); + + for (const auto& entry : pending_cheats.list) { + if (entry.cheat_id == 0 && entry.definition.num_opcodes != 0) { + LOG_DEBUG(Core, "Setting master cheat '{}' with {} opcodes", + entry.definition.readable_name.data(), entry.definition.num_opcodes); + const auto set_result = cheat_manager->SetMasterCheat(entry.definition); + if (set_result.IsError()) { + LOG_WARNING(Core, "Failed to set master cheat: result={}", set_result.raw); + } + break; + } + } + + // Add normal cheats (cheat_id != 0) + for (const auto& entry : pending_cheats.list) { + if (entry.cheat_id == 0 || entry.definition.num_opcodes == 0) { + continue; + } + + u32 assigned_id = 0; + LOG_DEBUG(Core, "Adding cheat '{}' (enabled={}, {} opcodes)", + entry.definition.readable_name.data(), entry.enabled, + entry.definition.num_opcodes); + const auto add_result = cheat_manager->AddCheat(assigned_id, entry.enabled, + entry.definition); + if (add_result.IsError()) { + LOG_WARNING(Core, + "Failed to add cheat (original_id={} enabled={} name='{}'): result={}", + entry.cheat_id, entry.enabled, + entry.definition.readable_name.data(), add_result.raw); + } + } + + // Clear pending cheats + pending_cheats = {}; + } }; System::System() : impl{std::make_unique(*this)} {} @@ -748,11 +815,61 @@ FileSys::VirtualFilesystem System::GetFilesystem() const { return impl->virtual_filesystem; } -void System::RegisterCheatList(const std::vector& list, +void System::RegisterCheatList(const std::vector& list, const std::array& build_id, u64 main_region_begin, u64 main_region_size) { - impl->cheat_engine.emplace(*this, list, build_id); - impl->cheat_engine->SetMainMemoryParameters(main_region_begin, main_region_size); + // If cheat_manager is not yet initialized, cache the cheats for later + if (!impl->cheat_manager) { + impl->pending_cheats.list = list; + impl->pending_cheats.build_id = build_id; + impl->pending_cheats.main_region_begin = main_region_begin; + impl->pending_cheats.main_region_size = main_region_size; + impl->pending_cheats.has_pending = true; + LOG_INFO(Core, "Cached {} cheats for later registration", list.size()); + return; + } + + // Attach cheat process to the current application process + const auto result = impl->cheat_manager->AttachToApplicationProcess(build_id, main_region_begin, + main_region_size); + if (result.IsError()) { + LOG_WARNING(Core, "Failed to attach cheat process: result={}", result.raw); + return; + } + + // Empty list: nothing more to do + if (list.empty()) { + return; + } + + // Set master cheat if present (cheat_id == 0) + for (const auto& entry : list) { + if (entry.cheat_id == 0 && entry.definition.num_opcodes != 0) { + const auto set_result = impl->cheat_manager->SetMasterCheat(entry.definition); + if (set_result.IsError()) { + LOG_WARNING(Core, "Failed to set master cheat: result={}", set_result.raw); + } + // Only one master cheat allowed + break; + } + } + + // Add normal cheats (cheat_id != 0) + for (const auto& entry : list) { + if (entry.cheat_id == 0 || entry.definition.num_opcodes == 0) { + continue; + } + + u32 assigned_id = 0; + const auto add_result = impl->cheat_manager->AddCheat(assigned_id, entry.enabled, + entry.definition); + if (add_result.IsError()) { + LOG_WARNING(Core, + "Failed to add cheat (original_id={} enabled={} name='{}'): result={}", + entry.cheat_id, entry.enabled, + entry.definition.readable_name.data(), add_result.raw); + } + } } void System::SetFrontendAppletSet(Service::AM::Frontend::FrontendAppletSet&& set) { @@ -896,6 +1013,14 @@ Tools::RenderdocAPI& System::GetRenderdocAPI() { return *impl->renderdoc_api; } +Service::DMNT::CheatProcessManager& System::GetCheatManager() { + return *impl->cheat_manager; +} + +const Service::DMNT::CheatProcessManager& System::GetCheatManager() const { + return *impl->cheat_manager; +} + void System::RunServer(std::unique_ptr&& server_manager) { return impl->kernel.RunServer(std::move(server_manager)); } diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index adbb611c1c..ceea3437a3 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -90,15 +90,15 @@ std::optional> ReadCheatFileFromFolder( const auto file = base_path->GetFile(fmt::format("{}.txt", build_id)); if (file == nullptr) { - LOG_INFO(Common_Filesystem, "No cheats file found for title_id={:016X}, build_id={}", + LOG_DEBUG(Common_Filesystem, "No cheats file found for title_id={:016X}, build_id={}", title_id, build_id); return std::nullopt; } std::vector data(file->GetSize()); if (file->Read(data.data(), data.size()) != data.size()) { - LOG_INFO(Common_Filesystem, "Failed to read cheats file for title_id={:016X}, build_id={}", - title_id, build_id); + LOG_WARNING(Common_Filesystem, "Failed to read cheats file for title_id={:016X}, build_id={}", + title_id, build_id); return std::nullopt; } @@ -661,7 +661,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw, const BuildI .parent_name = ""}); // Add individual cheats as sub-entries if we have a build_id - if (has_cheats && has_build_id && !mod_disabled) { + // Always show cheats even if mod folder is disabled, so users can enable individual cheats + if (has_cheats && has_build_id) { // Try to read cheat file (uppercase first, then lowercase) std::optional> cheat_entries; if (auto res = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, true)) { From 6893be8a6c98b8df13c5e54ba24af8ee3a285554 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Wed, 21 Jan 2026 09:37:06 +0100 Subject: [PATCH 006/170] mhmh --- src/core/file_sys/patch_manager.cpp | 66 ++++++++++++++--------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index ceea3437a3..92f826e5c1 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -660,42 +660,42 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw, const BuildI .title_id = title_id, .parent_name = ""}); - // Add individual cheats as sub-entries if we have a build_id - // Always show cheats even if mod folder is disabled, so users can enable individual cheats - if (has_cheats && has_build_id) { - // Try to read cheat file (uppercase first, then lowercase) - std::optional> cheat_entries; - if (auto res = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, true)) { - cheat_entries = std::move(res); - } else if (auto res_lower = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, false)) { - cheat_entries = std::move(res_lower); + // Add individual cheats as sub-entries + if (has_cheats) { + // Try to read cheat file with build_id first, fallback to all files + std::vector cheat_entries; + + if (has_build_id) { + if (auto res = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, true)) { + cheat_entries = std::move(*res); + } else if (auto res_lower = ReadCheatFileFromFolder(title_id, build_id, cheats_dir, false)) { + cheat_entries = std::move(*res_lower); + } } - if (cheat_entries) { - for (const auto& cheat : *cheat_entries) { - // Skip master cheat (id 0) with no readable name - if (cheat.cheat_id == 0 && cheat.definition.readable_name[0] == '\0') { - continue; - } - - const std::string cheat_name = cheat.definition.readable_name.data(); - if (cheat_name.empty()) { - continue; - } - - // Create unique key for this cheat: "ModName::CheatName" - const std::string cheat_key = mod->GetName() + "::" + cheat_name; - const auto cheat_disabled = - std::find(disabled.begin(), disabled.end(), cheat_key) != disabled.end(); - - out.push_back({.enabled = !cheat_disabled, - .name = cheat_name, - .version = types, - .type = PatchType::Cheat, - .program_id = title_id, - .title_id = title_id, - .parent_name = mod->GetName()}); + for (const auto& cheat : cheat_entries) { + // Skip master cheat (id 0) with no readable name + if (cheat.cheat_id == 0 && cheat.definition.readable_name[0] == '\0') { + continue; } + + const std::string cheat_name = cheat.definition.readable_name.data(); + if (cheat_name.empty()) { + continue; + } + + // Create unique key for this cheat: "ModName::CheatName" + const std::string cheat_key = mod->GetName() + "::" + cheat_name; + const auto cheat_disabled = + std::find(disabled.begin(), disabled.end(), cheat_key) != disabled.end(); + + out.push_back({.enabled = !cheat_disabled, + .name = cheat_name, + .version = types, + .type = PatchType::Cheat, + .program_id = title_id, + .title_id = title_id, + .parent_name = mod->GetName()}); } } } From 396701b426d38e0bedefae83c29d1e1d81d546df Mon Sep 17 00:00:00 2001 From: Caio Oliveira Date: Mon, 2 Feb 2026 15:04:49 -0300 Subject: [PATCH 007/170] [chore] license headers --- .../src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt | 2 +- .../src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt | 2 +- .../app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt | 2 +- src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt | 2 +- .../app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt | 2 +- src/common/android/id_cache.cpp | 2 +- src/core/core.cpp | 2 +- src/core/core.h | 2 +- src/core/file_sys/patch_manager.cpp | 2 +- src/core/file_sys/patch_manager.h | 2 +- src/core/hle/service/dmnt/cheat_interface.cpp | 2 +- src/core/hle/service/dmnt/cheat_interface.h | 2 +- src/core/hle/service/dmnt/cheat_parser.cpp | 2 +- src/core/hle/service/dmnt/cheat_parser.h | 2 +- src/core/hle/service/dmnt/cheat_process_manager.cpp | 2 +- src/core/hle/service/dmnt/cheat_process_manager.h | 2 +- src/core/hle/service/dmnt/cheat_virtual_machine.cpp | 2 +- src/core/hle/service/dmnt/cheat_virtual_machine.h | 2 +- src/core/hle/service/dmnt/dmnt.cpp | 2 +- src/core/hle/service/dmnt/dmnt.h | 2 +- src/core/hle/service/dmnt/dmnt_results.h | 2 +- src/core/hle/service/dmnt/dmnt_types.h | 2 +- src/core/hle/service/services.cpp | 2 +- src/video_core/vulkan_common/vulkan_instance.cpp | 2 +- src/yuzu/configuration/configure_per_game_addons.cpp | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt index b96debcf8a..ec4ce541cc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt index ba4dcc0ed4..13f729a9aa 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt index dbe199b451..842bf69d57 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt index 87c573044c..dac6d1c9af 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt index 668ef97165..24317d350b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/PatchType.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2024 yuzu Emulator Project diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index 230d249ed3..d6210e071f 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/core/core.cpp b/src/core/core.cpp index 8ae97d8713..d034ec7279 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/core/core.h b/src/core/core.h index 8a23420ae8..c0c5619ef5 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 92f826e5c1..6247af426d 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 4aa9b650cb..0be089bb9e 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_interface.cpp b/src/core/hle/service/dmnt/cheat_interface.cpp index 2e566814c7..4a938328b6 100644 --- a/src/core/hle/service/dmnt/cheat_interface.cpp +++ b/src/core/hle/service/dmnt/cheat_interface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_interface.h b/src/core/hle/service/dmnt/cheat_interface.h index 91bf1a7960..7d77e6fed5 100644 --- a/src/core/hle/service/dmnt/cheat_interface.h +++ b/src/core/hle/service/dmnt/cheat_interface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_parser.cpp b/src/core/hle/service/dmnt/cheat_parser.cpp index ef33a8560a..b0ebbfb83e 100644 --- a/src/core/hle/service/dmnt/cheat_parser.cpp +++ b/src/core/hle/service/dmnt/cheat_parser.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_parser.h b/src/core/hle/service/dmnt/cheat_parser.h index 9ff248a1e4..2c57c91749 100644 --- a/src/core/hle/service/dmnt/cheat_parser.h +++ b/src/core/hle/service/dmnt/cheat_parser.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_process_manager.cpp b/src/core/hle/service/dmnt/cheat_process_manager.cpp index 5fcb5df16f..7ffc95d28c 100644 --- a/src/core/hle/service/dmnt/cheat_process_manager.cpp +++ b/src/core/hle/service/dmnt/cheat_process_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_process_manager.h b/src/core/hle/service/dmnt/cheat_process_manager.h index bbf0782921..f4ecfdd9d3 100644 --- a/src/core/hle/service/dmnt/cheat_process_manager.h +++ b/src/core/hle/service/dmnt/cheat_process_manager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_virtual_machine.cpp b/src/core/hle/service/dmnt/cheat_virtual_machine.cpp index 6d78f1115f..9363b4b930 100644 --- a/src/core/hle/service/dmnt/cheat_virtual_machine.cpp +++ b/src/core/hle/service/dmnt/cheat_virtual_machine.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/cheat_virtual_machine.h b/src/core/hle/service/dmnt/cheat_virtual_machine.h index 8860764701..29f743807f 100644 --- a/src/core/hle/service/dmnt/cheat_virtual_machine.h +++ b/src/core/hle/service/dmnt/cheat_virtual_machine.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/dmnt.cpp b/src/core/hle/service/dmnt/dmnt.cpp index 373ef83b9e..18eb039d3b 100644 --- a/src/core/hle/service/dmnt/dmnt.cpp +++ b/src/core/hle/service/dmnt/dmnt.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/dmnt.h b/src/core/hle/service/dmnt/dmnt.h index 4c98a5fc0f..af715d9ce4 100644 --- a/src/core/hle/service/dmnt/dmnt.h +++ b/src/core/hle/service/dmnt/dmnt.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/dmnt_results.h b/src/core/hle/service/dmnt/dmnt_results.h index ec3859c936..3b220cf575 100644 --- a/src/core/hle/service/dmnt/dmnt_results.h +++ b/src/core/hle/service/dmnt/dmnt_results.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/dmnt/dmnt_types.h b/src/core/hle/service/dmnt/dmnt_types.h index 60a118200a..7078d5422f 100644 --- a/src/core/hle/service/dmnt/dmnt_types.h +++ b/src/core/hle/service/dmnt/dmnt_types.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project diff --git a/src/core/hle/service/services.cpp b/src/core/hle/service/services.cpp index 14a19d376c..ee2fa25a4d 100644 --- a/src/core/hle/service/services.cpp +++ b/src/core/hle/service/services.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index 022e27a75f..ded8765cb3 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index 7fd975164d..5cf993e87f 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project From cce77b8d11839f7ce51087b21bc2dcc60f744b8c Mon Sep 17 00:00:00 2001 From: Caio Oliveira Date: Thu, 5 Feb 2026 05:09:04 +0100 Subject: [PATCH 008/170] [frontend] Remove 19.0.1+ warnings (#3463) Signed-off-by: Caio Oliveira Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3463 Reviewed-by: Maufeat Reviewed-by: crueter Co-authored-by: Caio Oliveira Co-committed-by: Caio Oliveira --- src/android/app/src/main/res/values/strings.xml | 4 ++-- src/qt_common/qt_string_lookup.h | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 2967b3fcd1..d35ba4268e 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -381,9 +381,9 @@ Launch applications from the system home screen Applet launcher Launch system applets using installed firmware - Firmware not installed or invalid version + Firmware not installed Applet not available - prod.keys file and firmware are installed and try again.
Additionally, ensure your firmware is of version 19.0.1 or older.]]>
+ prod.keys file and firmware are installed and try again.]]> Album See images stored in the user screenshots folder with the system photo viewer Mii edit diff --git a/src/qt_common/qt_string_lookup.h b/src/qt_common/qt_string_lookup.h index 5a19fb00d3..5b7dbd5f0c 100644 --- a/src/qt_common/qt_string_lookup.h +++ b/src/qt_common/qt_string_lookup.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -98,8 +98,7 @@ static const constexpr frozen::map strings = { {FwCheckErrorFirmwareMissing, QT_TR_NOOP( - "Firmware missing. Firmware is required to run certain games and use the Home Menu. " - "Versions 19.0.1 or earlier are recommended, as 20.0.0+ is currently experimental.")}, + "Firmware missing. Firmware is required to run certain games and use the Home Menu.")}, {FwCheckErrorFirmwareCorrupted, QT_TR_NOOP( "Firmware reported as present, but was unable to be read. Check for decryption keys and " From bd7d0e0466d9abf4bd69cddd3964088659bf055c Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 05:09:46 +0100 Subject: [PATCH 009/170] [dynarmic] remove RNG from ARM64 regalloc, use incremental LRU (#3416) - Backported from Azahar's dynarmic > From: PabloMK7 > Date: Sun, 4 Jan 2026 13:57:44 +0100 > Subject: [PATCH] backend: Do not use random generator for reg allocation (#7) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3416 Reviewed-by: DraVee Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp | 7 ++++--- src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h | 10 +++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp index 3bd5ed90e4..e98a2f6e71 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.cpp @@ -433,9 +433,10 @@ int RegAlloc::AllocateRegister(const std::array& regs, const st std::vector candidates; std::copy_if(order.begin(), order.end(), std::back_inserter(candidates), [&](int i) { return regs[i].MaybeAllocatable(); }); - // TODO: LRU - std::uniform_int_distribution dis{0, candidates.size() - 1}; - return candidates[dis(rand_gen)]; + // TODO: The candidate was chosen randomly before, and a LRU was + // suggested as an improvement. However, using an incrementing index + // seems to be close enough. Determine if an LRU is still needed. + return candidates[alloc_candidate_index++ % candidates.size()]; } void RegAlloc::SpillGpr(int index) { diff --git a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h index a8395a068d..87446a240b 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/reg_alloc.h @@ -160,8 +160,12 @@ class RegAlloc final { public: using ArgumentInfo = std::array; - explicit RegAlloc(oaknut::CodeGenerator& code, FpsrManager& fpsr_manager, std::vector gpr_order, std::vector fpr_order) - : code{code}, fpsr_manager{fpsr_manager}, gpr_order{gpr_order}, fpr_order{fpr_order}, rand_gen{std::random_device{}()} {} + explicit RegAlloc(oaknut::CodeGenerator& code, FpsrManager& fpsr_manager, std::vector gpr_order, std::vector fpr_order) noexcept + : code{code} + , fpsr_manager{fpsr_manager} + , gpr_order{gpr_order} + , fpr_order{fpr_order} + {} ArgumentInfo GetArgumentInfo(IR::Inst* inst); bool WasValueDefined(IR::Inst* inst) const; @@ -331,7 +335,7 @@ private: HostLocInfo flags; std::array spills; - mutable std::mt19937 rand_gen; + mutable size_t alloc_candidate_index = 0; ankerl::unordered_dense::set defined_insts; }; From cbb92e75d33426e2d1950c53c661f926beefd650 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 05:22:47 +0100 Subject: [PATCH 010/170] [common] log modified settings first (#3132) basically i want to see the modified options first :) one of the few times i use deque without resorting to boost::container::deque, haha Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3132 Reviewed-by: crueter Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/settings.cpp | 66 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 1c28adafe5..5d8a0e41f6 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/settings_enums.h" #if __cpp_lib_chrono >= 201907L #include #include @@ -17,8 +16,10 @@ #include #include #include +#include #include +#include "common/settings_enums.h" #include "common/assert.h" #include "common/fs/fs_util.h" #include "common/fs/path_util.h" @@ -110,36 +111,38 @@ std::string GetTimeZoneString(TimeZone time_zone) { } void LogSettings() { - const auto log_setting = [](std::string_view name, const auto& value) { - LOG_INFO(Config, "{}: {}", name, value); - }; - - const auto log_path = [](std::string_view name, const std::filesystem::path& path) { - LOG_INFO(Config, "{}: {}", name, Common::FS::PathToUTF8String(path)); - }; - - LOG_INFO(Config, "Eden Configuration:"); + std::deque settings_list; for (auto& [category, settings] : values.linkage.by_category) { for (const auto& setting : settings) { - if (setting->Id() == values.eden_token.Id()) { - // Hide the token secret, for security reasons. - continue; + // Hide the token secret, for security reasons. + if (setting->Id() != values.eden_token.Id()) { + auto const is_default = setting->ToString() == setting->DefaultToString(); + auto const name = fmt::format( + "{:c}{:c} {}.{}", + is_default ? '-' : 'M', + setting->UsingGlobal() ? '-' : 'C', TranslateCategory(category), + setting->GetLabel()); + if (is_default) + settings_list.push_back(fmt::format("{}: {}\n", name, setting->Canonicalize())); + else + settings_list.push_front(fmt::format("{}: {}\n", name, setting->Canonicalize())); } - - const auto name = fmt::format( - "{:c}{:c} {}.{}", setting->ToString() == setting->DefaultToString() ? '-' : 'M', - setting->UsingGlobal() ? '-' : 'C', TranslateCategory(category), - setting->GetLabel()); - - log_setting(name, setting->Canonicalize()); } } - log_path("DataStorage_CacheDir", Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir)); - log_path("DataStorage_ConfigDir", Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir)); - log_path("DataStorage_LoadDir", Common::FS::GetEdenPath(Common::FS::EdenPath::LoadDir)); - log_path("DataStorage_NANDDir", Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir)); - log_path("DataStorage_SaveDir", Common::FS::GetEdenPath(Common::FS::EdenPath::SaveDir)); - log_path("DataStorage_SDMCDir", Common::FS::GetEdenPath(Common::FS::EdenPath::SDMCDir)); + + std::string settings_str{}; + for (auto const& e : settings_list) + settings_str += e; + LOG_INFO(Config, "Eden Configuration:\n{}", settings_str); +#define LOG_PATH(NAME) \ + LOG_INFO(Config, #NAME ": {}", Common::FS::PathToUTF8String(Common::FS::GetEdenPath(Common::FS::EdenPath::NAME))) + LOG_PATH(CacheDir); + LOG_PATH(ConfigDir); + LOG_PATH(LoadDir); + LOG_PATH(NANDDir); + LOG_PATH(SaveDir); + LOG_PATH(SDMCDir); +#undef LOG_PATH } bool getDebugKnobAt(u8 i) { @@ -171,12 +174,10 @@ bool IsDMALevelSafe() { } bool IsFastmemEnabled() { - if (values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Debugging) { + if (values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Debugging) return bool(values.cpuopt_fastmem); - } - if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) { + else if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) return bool(values.cpuopt_unsafe_host_mmu); - } #if !defined(__APPLE__) && !defined(__linux__) && !defined(__ANDROID__) && !defined(_WIN32) return false; #else @@ -341,10 +342,7 @@ void TranslateResolutionInfo(ResolutionSetup setup, ResolutionScalingInfo& info) info.down_shift = 0; break; default: - ASSERT(false); - info.up_scale = 1; - info.down_shift = 0; - break; + UNREACHABLE(); } info.up_factor = static_cast(info.up_scale) / (1U << info.down_shift); info.down_factor = static_cast(1U << info.down_shift) / info.up_scale; From 913a74dbd3c07717d072d975b14b952653486b2f Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 05:47:43 +0100 Subject: [PATCH 011/170] [common] remove uneeded allocations in logs (#3409) + make filename be a const char also mark as `noexcept` to avoid emission of uneeded unwind paths :) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3409 Reviewed-by: DraVee Reviewed-by: Maufeat Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/logging/backend.cpp | 114 ++++++++++++++------------ src/common/logging/log_entry.h | 11 +-- src/common/logging/text_formatter.cpp | 28 ++++--- src/common/logging/text_formatter.h | 11 +-- 4 files changed, 89 insertions(+), 75 deletions(-) diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 5c93e179fb..788cf77ca2 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -41,7 +42,7 @@ namespace { /// @brief Trims up to and including the last of ../, ..\, src/, src\ in a string /// do not be fooled this isn't generating new strings on .rodata :) -constexpr const char* TrimSourcePath(std::string_view source) { +constexpr const char* TrimSourcePath(std::string_view source) noexcept { const auto rfind = [source](const std::string_view match) { return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size()); }; @@ -51,31 +52,31 @@ constexpr const char* TrimSourcePath(std::string_view source) { /// @brief Interface for logging backends. struct Backend { - virtual ~Backend() = default; - virtual void Write(const Entry& entry) = 0; - virtual void EnableForStacktrace() = 0; - virtual void Flush() = 0; + virtual ~Backend() noexcept = default; + virtual void Write(const Entry& entry) noexcept = 0; + virtual void EnableForStacktrace() noexcept= 0; + virtual void Flush() noexcept = 0; }; /// @brief Backend that writes to stderr and with color struct ColorConsoleBackend final : public Backend { - explicit ColorConsoleBackend() = default; - ~ColorConsoleBackend() override = default; + explicit ColorConsoleBackend() noexcept = default; + ~ColorConsoleBackend() noexcept override = default; - void Write(const Entry& entry) override { + void Write(const Entry& entry) noexcept override { if (enabled.load(std::memory_order_relaxed)) PrintColoredMessage(entry); } - void Flush() override { + void Flush() noexcept override { // stderr shouldn't be buffered } - void EnableForStacktrace() override { + void EnableForStacktrace() noexcept override { enabled = true; } - void SetEnabled(bool enabled_) { + void SetEnabled(bool enabled_) noexcept { enabled = enabled_; } @@ -83,9 +84,10 @@ private: std::atomic_bool enabled{false}; }; +#ifndef __OPENORBIS__ /// @brief Backend that writes to a file passed into the constructor struct FileBackend final : public Backend { - explicit FileBackend(const std::filesystem::path& filename) { + explicit FileBackend(const std::filesystem::path& filename) noexcept { auto old_filename = filename; old_filename += ".old.txt"; @@ -97,9 +99,9 @@ struct FileBackend final : public Backend { file = std::make_unique(filename, FS::FileAccessMode::Write, FS::FileType::TextFile); } - ~FileBackend() override = default; + ~FileBackend() noexcept override = default; - void Write(const Entry& entry) override { + void Write(const Entry& entry) noexcept override { if (!enabled) return; @@ -147,11 +149,11 @@ struct FileBackend final : public Backend { } } - void Flush() override { + void Flush() noexcept override { file->Flush(); } - void EnableForStacktrace() override { + void EnableForStacktrace() noexcept override { enabled = true; bytes_written = 0; } @@ -161,29 +163,30 @@ private: std::size_t bytes_written = 0; bool enabled = true; }; +#endif #ifdef _WIN32 /// @brief Backend that writes to Visual Studio's output window struct DebuggerBackend final : public Backend { - explicit DebuggerBackend() = default; - ~DebuggerBackend() override = default; - void Write(const Entry& entry) override { + explicit DebuggerBackend() noexcept = default; + ~DebuggerBackend() noexcept override = default; + void Write(const Entry& entry) noexcept override { ::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str()); } - void Flush() override {} - void EnableForStacktrace() override {} + void Flush() noexcept override {} + void EnableForStacktrace() noexcept override {} }; #endif #ifdef ANDROID /// @brief Backend that writes to the Android logcat struct LogcatBackend : public Backend { - explicit LogcatBackend() = default; - ~LogcatBackend() override = default; - void Write(const Entry& entry) override { + explicit LogcatBackend() noexcept = default; + ~LogcatBackend() noexcept override = default; + void Write(const Entry& entry) noexcept override { PrintMessageToLogcat(entry); } - void Flush() override {} - void EnableForStacktrace() override {} + void Flush() noexcept override {} + void EnableForStacktrace() noexcept override {} }; #endif @@ -192,13 +195,13 @@ bool initialization_in_progress_suppress_logging = true; /// @brief Static state as a singleton. class Impl { public: - static Impl& Instance() { + static Impl& Instance() noexcept { if (!instance) - throw std::runtime_error("Using Logging instance before its initialization"); + std::abort(); return *instance; } - static void Initialize() { + static void Initialize() noexcept { if (instance) { LOG_WARNING(Log, "Reinitializing logging backend"); return; @@ -212,25 +215,25 @@ public: initialization_in_progress_suppress_logging = false; } - static void Start() { + static void Start() noexcept { instance->StartBackendThread(); } - static void Stop() { + static void Stop() noexcept { instance->StopBackendThread(); } - Impl(const Impl&) = delete; - Impl& operator=(const Impl&) = delete; + Impl(const Impl&) noexcept = delete; + Impl& operator=(const Impl&) noexcept = delete; - Impl(Impl&&) = delete; - Impl& operator=(Impl&&) = delete; + Impl(Impl&&) noexcept = delete; + Impl& operator=(Impl&&) noexcept = delete; - void SetGlobalFilter(const Filter& f) { + void SetGlobalFilter(const Filter& f) noexcept { filter = f; } - void SetColorConsoleBackendEnabled(bool enabled) { + void SetColorConsoleBackendEnabled(bool enabled) noexcept { color_console_backend.SetEnabled(enabled); } @@ -238,19 +241,21 @@ public: return filter.CheckMessage(log_class, log_level); } - void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num, - const char* function, std::string&& message) noexcept { - message_queue.EmplaceWait( - CreateEntry(log_class, log_level, TrimSourcePath(filename), line_num, function, std::move(message))); + void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, std::string&& message) noexcept { + message_queue.EmplaceWait(CreateEntry(log_class, log_level, TrimSourcePath(filename), line_num, function, std::move(message))); } private: - Impl(const std::filesystem::path& file_backend_filename, const Filter& filter_) - : filter{filter_}, file_backend{file_backend_filename} {} + Impl(const std::filesystem::path& file_backend_filename, const Filter& filter_) noexcept : + filter{filter_} +#ifndef __OPENORBIS__ + , file_backend{file_backend_filename} +#endif + {} - ~Impl() = default; + ~Impl() noexcept = default; - void StartBackendThread() { + void StartBackendThread() noexcept { backend_thread = std::jthread([this](std::stop_token stop_token) { Common::SetCurrentThreadName("Logger"); Entry entry; @@ -271,15 +276,14 @@ private: }); } - void StopBackendThread() { + void StopBackendThread() noexcept { backend_thread.request_stop(); if (backend_thread.joinable()) backend_thread.join(); ForEachBackend([](Backend& backend) { backend.Flush(); }); } - Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, - const char* function, std::string&& message) const { + Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, const char* function, std::string&& message) const noexcept { using std::chrono::duration_cast; using std::chrono::microseconds; using std::chrono::steady_clock; @@ -294,9 +298,11 @@ private: }; } - void ForEachBackend(auto lambda) { + void ForEachBackend(auto lambda) noexcept { lambda(static_cast(color_console_backend)); +#ifndef __OPENORBIS__ lambda(static_cast(file_backend)); +#endif #ifdef _WIN32 lambda(static_cast(debugger_backend)); #endif @@ -305,7 +311,7 @@ private: #endif } - static void Deleter(Impl* ptr) { + static void Deleter(Impl* ptr) noexcept { delete ptr; } @@ -313,7 +319,9 @@ private: Filter filter; ColorConsoleBackend color_console_backend{}; +#ifndef __OPENORBIS__ FileBackend file_backend; +#endif #ifdef _WIN32 DebuggerBackend debugger_backend{}; #endif @@ -351,9 +359,7 @@ void SetColorConsoleBackendEnabled(bool enabled) { Impl::Instance().SetColorConsoleBackendEnabled(enabled); } -void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, - unsigned int line_num, const char* function, fmt::string_view format, - const fmt::format_args& args) { +void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, const fmt::format_args& args) { if (!initialization_in_progress_suppress_logging) { auto& instance = Impl::Instance(); if (instance.CanPushEntry(log_class, log_level)) diff --git a/src/common/logging/log_entry.h b/src/common/logging/log_entry.h index d8d7daf762..23f1aaf625 100644 --- a/src/common/logging/log_entry.h +++ b/src/common/logging/log_entry.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,17 +12,15 @@ namespace Common::Log { -/** - * A log entry. Log entries are store in a structured format to permit more varied output - * formatting on different frontends, as well as facilitating filtering and aggregation. - */ +/// @brief A log entry. Log entries are store in a structured format to permit more varied output +/// formatting on different frontends, as well as facilitating filtering and aggregation. struct Entry { std::chrono::microseconds timestamp; Class log_class{}; Level log_level{}; const char* filename = nullptr; unsigned int line_num = 0; - std::string function; + const char* function = nullptr; std::string message; }; diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp index 68b84d0e1b..dee1f770bc 100644 --- a/src/common/logging/text_formatter.cpp +++ b/src/common/logging/text_formatter.cpp @@ -24,24 +24,26 @@ namespace Common::Log { // Some IDEs prefer : instead, so let's just do that :) -std::string FormatLogMessage(const Entry& entry) { +std::string FormatLogMessage(const Entry& entry) noexcept { if (!entry.filename) return ""; auto const time_seconds = uint32_t(entry.timestamp.count() / 1000000); auto const time_fractional = uint32_t(entry.timestamp.count() % 1000000); - char const* class_name = GetLogClassName(entry.log_class); - char const* level_name = GetLevelName(entry.log_level); + auto const class_name = GetLogClassName(entry.log_class); + auto const level_name = GetLevelName(entry.log_level); return fmt::format("[{:4d}.{:06d}] {} <{}> {}:{}:{}: {}", time_seconds, time_fractional, class_name, level_name, entry.filename, entry.line_num, entry.function, entry.message); } -void PrintMessage(const Entry& entry) { +/// @brief Formats and prints a log entry to stderr. +static void PrintMessage(const Entry& entry) noexcept { #ifdef _WIN32 auto const str = FormatLogMessage(entry).append(1, '\n'); + fwrite(str.c_str(), 1, str.size(), stderr); #else #define ESC "\x1b" - auto str = std::string{[&entry]() -> const char* { + auto const color_str = [&entry]() -> const char* { switch (entry.log_level) { case Level::Debug: return ESC "[0;36m"; // Cyan case Level::Info: return ESC "[0;37m"; // Bright gray @@ -50,15 +52,19 @@ void PrintMessage(const Entry& entry) { case Level::Critical: return ESC "[1;35m"; // Bright magenta default: return ESC "[1;30m"; // Grey } - }()}; - str.append(FormatLogMessage(entry)); - str.append(ESC "[0m\n"); + }(); + auto const time_seconds = uint32_t(entry.timestamp.count() / 1000000); + auto const time_fractional = uint32_t(entry.timestamp.count() % 1000000); + auto const class_name = GetLogClassName(entry.log_class); + auto const level_name = GetLevelName(entry.log_level); + fprintf(stderr, "%s[%4d.%06d] %s <%s> %s:%u:%s: %s" ESC "[0m\n", color_str, + time_seconds, time_fractional, class_name, level_name, entry.filename, + entry.line_num, entry.function, entry.message.c_str()); #undef ESC #endif - fwrite(str.c_str(), 1, str.size(), stderr); } -void PrintColoredMessage(const Entry& entry) { +void PrintColoredMessage(const Entry& entry) noexcept { #ifdef _WIN32 HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); if (console_handle == INVALID_HANDLE_VALUE) @@ -84,7 +90,7 @@ void PrintColoredMessage(const Entry& entry) { #endif } -void PrintMessageToLogcat(const Entry& entry) { +void PrintMessageToLogcat(const Entry& entry) noexcept { #ifdef ANDROID android_LogPriority android_log_priority = [&]() { switch (entry.log_level) { diff --git a/src/common/logging/text_formatter.h b/src/common/logging/text_formatter.h index 68417420bb..8ce11240f2 100644 --- a/src/common/logging/text_formatter.h +++ b/src/common/logging/text_formatter.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,11 +13,9 @@ namespace Common::Log { struct Entry; /// Formats a log entry into the provided text buffer. -std::string FormatLogMessage(const Entry& entry); -/// Formats and prints a log entry to stderr. -void PrintMessage(const Entry& entry); +std::string FormatLogMessage(const Entry& entry) noexcept; /// Prints the same message as `PrintMessage`, but colored according to the severity level. -void PrintColoredMessage(const Entry& entry); +void PrintColoredMessage(const Entry& entry) noexcept; /// Formats and prints a log entry to the android logcat. -void PrintMessageToLogcat(const Entry& entry); +void PrintMessageToLogcat(const Entry& entry) noexcept; } // namespace Common::Log From 5acddfde16a4af22afb58c66cc4ac65ea73d3352 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 5 Feb 2026 18:08:24 +0100 Subject: [PATCH 012/170] [video_core] Partial Revert #3246 to Improve Performance (#3456) Improves performance and stuttering in MP4 noticeable on the Steamdeck. https://git.eden-emu.dev/eden-emu/eden/pulls/3456#issuecomment-19064 LM3 Fixed in #3457 Attempt to fix a flickering issue noticed with LM3 Co-authored-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3456 Reviewed-by: MaranBr Reviewed-by: Maufeat Reviewed-by: crueter Co-authored-by: John Co-committed-by: John --- src/video_core/renderer_vulkan/vk_compute_pass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp index f654cd91d3..22e646afe9 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp @@ -623,7 +623,7 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map, .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_GENERAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -638,7 +638,7 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map, }, }; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, image_barrier); + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, image_barrier); }); scheduler.Finish(); } From ff03ef657a7abda4d3401a3380fe3f2675f48822 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 22:38:55 +0100 Subject: [PATCH 013/170] [cmake, macos] use CMAKE_SOURCE_DIR instead of relative icon paths (#3370) should be a pretty innocuous change I believe Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3370 Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- src/yuzu/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 27911d2ac8..0d49e4a5e7 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -361,12 +361,12 @@ endif() if (APPLE) # Normal icns - set(MACOSX_ICON "../../dist/eden.icns") + set(MACOSX_ICON "${CMAKE_SOURCE_DIR}/dist/eden.icns") set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) target_sources(yuzu PRIVATE ${MACOSX_ICON}) # Liquid glass - set(MACOSX_LIQUID_GLASS_ICON "../../dist/Assets.car") + set(MACOSX_LIQUID_GLASS_ICON "${CMAKE_SOURCE_DIR}/dist/Assets.car") set_source_files_properties(${MACOSX_LIQUID_GLASS_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) target_sources(yuzu PRIVATE ${MACOSX_LIQUID_GLASS_ICON}) From 9b1f6801a58ca09b6bf83e6b326d0823af5bdd24 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 22:38:59 +0100 Subject: [PATCH 014/170] [vk] blacklist on NVIDIA drivers older than 580.119.02 the VK_EXT_vertex_input_dynamic_state (#3379) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3379 Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- src/video_core/vulkan_common/vulkan_device.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index ab4e5b1b65..f06551b91e 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -1168,7 +1168,6 @@ bool Device::GetSuitability(bool requires_swapchain) { // Driver detection variables for workarounds in GetSuitability const VkDriverId driver_id = properties.driver.driverID; - const bool is_intel_windows = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS; // VK_EXT_extended_dynamic_state2 below this will appear drivers that need workarounds. @@ -1185,15 +1184,14 @@ bool Device::GetSuitability(bool requires_swapchain) { } // Intel Windows < 27.20.100.0: Broken VertexInputDynamicState + // Same for NVIDIA Proprietary < 580.119.02, unknown when VIDS was first NOT broken // Disable VertexInputDynamicState on old Intel Windows drivers - if (extensions.vertex_input_dynamic_state && is_intel_windows) { + if (extensions.vertex_input_dynamic_state) { const u32 version = (properties.properties.driverVersion << 3) >> 3; - if (version < VK_MAKE_API_VERSION(27, 20, 100, 0)) { - LOG_WARNING(Render_Vulkan, - "Intel Windows < 27.20.100.0: Disabling broken VK_EXT_vertex_input_dynamic_state"); - RemoveExtensionFeature(extensions.vertex_input_dynamic_state, - features.vertex_input_dynamic_state, - VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); + if ((driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS && version < VK_MAKE_API_VERSION(27, 20, 100, 0)) + || (driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY && version < VK_MAKE_API_VERSION(580, 119, 02, 0))) { + LOG_WARNING(Render_Vulkan, "Disabling broken VK_EXT_vertex_input_dynamic_state"); + RemoveExtensionFeature(extensions.vertex_input_dynamic_state, features.vertex_input_dynamic_state, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); } } From 8907523ee4e570c5bb18d1f446f78a80a9d876e9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 22:44:09 +0100 Subject: [PATCH 015/170] [tools/windows] fix Windows on ARM installs for vulkan (#3201) while we dont support MSVC on ARM64 yet, one day we may, and when that day comes someone will be annoyed their vulkan sdk won't install properly Signed-off-by: lizzie lizzie@eden-emu.dev Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3201 Reviewed-by: crueter Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- tools/windows/install-vulkan-sdk.ps1 | 15 +++++++++++---- tools/windows/install-vulkan-sdk.sh | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/tools/windows/install-vulkan-sdk.ps1 b/tools/windows/install-vulkan-sdk.ps1 index ac26d62766..1b93e12a83 100755 --- a/tools/windows/install-vulkan-sdk.ps1 +++ b/tools/windows/install-vulkan-sdk.ps1 @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2023 yuzu Emulator Project @@ -14,10 +14,17 @@ try { Exit 1 } -$VulkanSDKVer = "1.4.335.0" +$VulkanSDKVer = "1.4.341.1" +if ((Get-WmiObject -Class Win32_ComputerSystem).SystemType -match '(x64)' -eq "True") { + $VulkanSDKArch = "X64" + $VulkanSDKOs = "windows" +} else { + $VulkanSDKArch = "ARM64" + $VulkanSDKOs = "warm" +} $VULKAN_SDK = "C:/VulkanSDK/$VulkanSDKVer" -$ExeFile = "vulkansdk-windows-X64-$VulkanSDKVer.exe" -$Uri = "https://sdk.lunarg.com/sdk/download/$VulkanSDKVer/windows/$ExeFile" +$ExeFile = "vulkansdk-windows-$VulkanSDKArch-$VulkanSDKVer.exe" +$Uri = "https://sdk.lunarg.com/sdk/download/$VulkanSDKVer/$VulkanSDKOs/$ExeFile" $Destination = "./$ExeFile" # Check if Vulkan SDK is already installed diff --git a/tools/windows/install-vulkan-sdk.sh b/tools/windows/install-vulkan-sdk.sh index 9cc3426d4a..0f136748cf 100644 --- a/tools/windows/install-vulkan-sdk.sh +++ b/tools/windows/install-vulkan-sdk.sh @@ -1,11 +1,19 @@ #!/usr/bin/sh -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -: "${VULKAN_SDK_VER:=1.4.335.0}" +: "${VULKAN_SDK_VER:=1.4.341.1}" : "${VULKAN_ROOT:=C:/VulkanSDK/$VULKAN_SDK_VER}" -EXE_FILE="vulkansdk-windows-X64-$VULKAN_SDK_VER.exe" -URI="https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VER/windows/$EXE_FILE" +VULKAN_SDK_ARCH=X64 +VULKAN_SDK_OS=windows +case "$(uname)" in + *ARM64*) + VULKAN_SDK_ARCH=ARM64 + VULKAN_SDK_OS=warm + ;; +esac +EXE_FILE="vulkansdk-windows-$VULKAN_SDK_ARCH-$VULKAN_SDK_VER.exe" +URI="https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VER/$VULKAN_SDK_OS/$EXE_FILE" VULKAN_ROOT_UNIX=$(cygpath -u "$VULKAN_ROOT") # Check if Vulkan SDK is already installed From d536a6601016ea54792358e2df9c3f0ad8a526e7 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 5 Feb 2026 22:47:17 +0100 Subject: [PATCH 016/170] [port, cmake] fix NetBSD/OpenBSD 7.8 build failure, update documentation (#3272) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3272 Reviewed-by: MaranBr Reviewed-by: DraVee Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- CMakeLists.txt | 9 +- docs/Caveats.md | 2 + docs/Deps.md | 2 +- docs/Development.md | 10 +- src/video_core/host_shaders/CMakeLists.txt | 128 ++++++++++----------- 5 files changed, 77 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 175ad7c3f2..dbe947c1bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,8 +32,8 @@ if (PLATFORM_OPENBSD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib") elseif (PLATFORM_NETBSD) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib") endif() @@ -246,11 +246,12 @@ cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF) set(DEFAULT_ENABLE_OPENSSL ON) -if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN) +if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN OR PLATFORM_OPENBSD) # - Windows defaults to the Schannel backend. # - macOS defaults to the SecureTransport backend. # - Android currently has no SSL backend as the NDK doesn't include any SSL # library; a proper 'native' backend would have to go through Java. + # - Solaris and OpenBSD have too old backends # But you can force builds for those platforms to use OpenSSL if you have # your own copy of it. set(DEFAULT_ENABLE_OPENSSL OFF) @@ -263,7 +264,7 @@ endif() option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) -if (EXT_DEFAULT OR PLATFORM_SUN) +if (EXT_DEFAULT OR PLATFORM_SUN OR PLATFORM_OPENBSD) set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON) endif() diff --git a/docs/Caveats.md b/docs/Caveats.md index ed98f602d8..39b5ab15e6 100644 --- a/docs/Caveats.md +++ b/docs/Caveats.md @@ -85,6 +85,8 @@ If you have `quazip1_qt6_devel`, uninstall it. It may call `Core5Compat` on CMak ## OpenBSD +System boost doesn't have `context` (as of 7.8); so you may need to specify `-DYUZU_USE_CPM=ON -DBoost_FORCE_BUNDLED=ON`. + After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`. `-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`. Builds are currently not working due to lack of `std::jthread` and such, either compile libc++ manually or wait for ports to catch up. diff --git a/docs/Deps.md b/docs/Deps.md index 689d12800a..c91d6fc4fb 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -277,7 +277,7 @@ For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv ```sh pkg_add -u -pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake llvm-19.1.7p3 qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl2 libusb1-1.0.27 +pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl2 libusb1-1.0.29 ``` [Caveats](./Caveats.md#openbsd). diff --git a/docs/Development.md b/docs/Development.md index 062bc140d9..eb9f4159b5 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -82,15 +82,15 @@ You may additionally need the `Qt Extension Pack` extension if building Qt. # Build speedup -If you have an HDD, use ramdisk (build in RAM): +If you have an HDD, use ramdisk (build in RAM), approximatedly you need 4GB for a full build with debug symbols: ```sh -sudo mkdir /tmp/ramdisk -sudo chmod 777 /tmp/ramdisk +mkdir /tmp/ramdisk +chmod 777 /tmp/ramdisk # about 8GB needed -sudo mount -t tmpfs -o size=8G myramdisk /tmp/ramdisk +mount -t tmpfs -o size=4G myramdisk /tmp/ramdisk cmake -B /tmp/ramdisk cmake --build /tmp/ramdisk -- -j32 -sudo umount /tmp/ramdisk +umount /tmp/ramdisk ``` # Assets and large files diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 40fa4968a8..60b399ccba 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -14,68 +14,68 @@ set(GLSL_INCLUDES ) set(SHADER_FILES - astc_decoder.comp - blit_color_float.frag - block_linear_unswizzle_2d.comp - block_linear_unswizzle_3d.comp - block_linear_unswizzle_3d_bcn.comp - convert_abgr8_to_d24s8.frag - convert_abgr8_to_d32f.frag - convert_d32f_to_abgr8.frag - convert_d24s8_to_abgr8.frag - convert_depth_to_float.frag - convert_float_to_depth.frag - convert_msaa_to_non_msaa.comp - convert_non_msaa_to_msaa.comp - convert_s8d24_to_abgr8.frag - full_screen_triangle.vert - fxaa.frag - fxaa.vert - opengl_convert_s8d24.comp - opengl_copy_bc4.comp - opengl_fidelityfx_fsr.frag - opengl_fidelityfx_fsr_easu.frag - opengl_fidelityfx_fsr_rcas.frag - opengl_lmem_warmup.comp - opengl_present.frag - opengl_present.vert - opengl_present_scaleforce.frag - opengl_smaa.glsl - pitch_unswizzle.comp - present_area.frag - present_bicubic.frag - present_zero_tangent.frag - present_bspline.frag - present_mitchell.frag - present_gaussian.frag - present_lanczos.frag - present_spline1.frag - present_mmpx.frag - queries_prefix_scan_sum.comp - queries_prefix_scan_sum_nosubgroups.comp - resolve_conditional_render.comp - smaa_edge_detection.vert - smaa_edge_detection.frag - smaa_blending_weight_calculation.vert - smaa_blending_weight_calculation.frag - smaa_neighborhood_blending.vert - smaa_neighborhood_blending.frag - vulkan_blit_depth_stencil.frag - vulkan_color_clear.frag - vulkan_color_clear.vert - vulkan_depthstencil_clear.frag - vulkan_fidelityfx_fsr.vert - vulkan_fidelityfx_fsr_easu_fp16.frag - vulkan_fidelityfx_fsr_easu_fp32.frag - vulkan_fidelityfx_fsr_rcas_fp16.frag - vulkan_fidelityfx_fsr_rcas_fp32.frag - vulkan_present.frag - vulkan_present.vert - vulkan_present_scaleforce_fp16.frag - vulkan_present_scaleforce_fp32.frag - vulkan_quad_indexed.comp - vulkan_turbo_mode.comp - vulkan_uint8.comp + ${CMAKE_CURRENT_SOURCE_DIR}/astc_decoder.comp + ${CMAKE_CURRENT_SOURCE_DIR}/blit_color_float.frag + ${CMAKE_CURRENT_SOURCE_DIR}/block_linear_unswizzle_2d.comp + ${CMAKE_CURRENT_SOURCE_DIR}/block_linear_unswizzle_3d.comp + ${CMAKE_CURRENT_SOURCE_DIR}/block_linear_unswizzle_3d_bcn.comp + ${CMAKE_CURRENT_SOURCE_DIR}/convert_abgr8_to_d24s8.frag + ${CMAKE_CURRENT_SOURCE_DIR}/convert_abgr8_to_d32f.frag + ${CMAKE_CURRENT_SOURCE_DIR}/convert_d32f_to_abgr8.frag + ${CMAKE_CURRENT_SOURCE_DIR}/convert_d24s8_to_abgr8.frag + ${CMAKE_CURRENT_SOURCE_DIR}/convert_depth_to_float.frag + ${CMAKE_CURRENT_SOURCE_DIR}/convert_float_to_depth.frag + ${CMAKE_CURRENT_SOURCE_DIR}/convert_msaa_to_non_msaa.comp + ${CMAKE_CURRENT_SOURCE_DIR}/convert_non_msaa_to_msaa.comp + ${CMAKE_CURRENT_SOURCE_DIR}/convert_s8d24_to_abgr8.frag + ${CMAKE_CURRENT_SOURCE_DIR}/full_screen_triangle.vert + ${CMAKE_CURRENT_SOURCE_DIR}/fxaa.frag + ${CMAKE_CURRENT_SOURCE_DIR}/fxaa.vert + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_convert_s8d24.comp + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_copy_bc4.comp + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_fidelityfx_fsr.frag + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_fidelityfx_fsr_easu.frag + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_fidelityfx_fsr_rcas.frag + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_lmem_warmup.comp + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_present.frag + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_present.vert + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_present_scaleforce.frag + ${CMAKE_CURRENT_SOURCE_DIR}/opengl_smaa.glsl + ${CMAKE_CURRENT_SOURCE_DIR}/pitch_unswizzle.comp + ${CMAKE_CURRENT_SOURCE_DIR}/present_area.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_bicubic.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_zero_tangent.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_bspline.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_mitchell.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_gaussian.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_lanczos.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_spline1.frag + ${CMAKE_CURRENT_SOURCE_DIR}/present_mmpx.frag + ${CMAKE_CURRENT_SOURCE_DIR}/queries_prefix_scan_sum.comp + ${CMAKE_CURRENT_SOURCE_DIR}/queries_prefix_scan_sum_nosubgroups.comp + ${CMAKE_CURRENT_SOURCE_DIR}/resolve_conditional_render.comp + ${CMAKE_CURRENT_SOURCE_DIR}/smaa_edge_detection.vert + ${CMAKE_CURRENT_SOURCE_DIR}/smaa_edge_detection.frag + ${CMAKE_CURRENT_SOURCE_DIR}/smaa_blending_weight_calculation.vert + ${CMAKE_CURRENT_SOURCE_DIR}/smaa_blending_weight_calculation.frag + ${CMAKE_CURRENT_SOURCE_DIR}/smaa_neighborhood_blending.vert + ${CMAKE_CURRENT_SOURCE_DIR}/smaa_neighborhood_blending.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_blit_depth_stencil.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_color_clear.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_color_clear.vert + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_depthstencil_clear.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_fidelityfx_fsr.vert + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_fidelityfx_fsr_easu_fp16.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_fidelityfx_fsr_easu_fp32.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_fidelityfx_fsr_rcas_fp16.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_fidelityfx_fsr_rcas_fp32.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_present.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_present.vert + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_present_scaleforce_fp16.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_present_scaleforce_fp32.frag + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_quad_indexed.comp + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_turbo_mode.comp + ${CMAKE_CURRENT_SOURCE_DIR}/vulkan_uint8.comp ) if (PLATFORM_HAIKU) @@ -118,9 +118,9 @@ if (NOT GLSLANG_ERROR STREQUAL "") set(QUIET_FLAG "") endif() -foreach(FILENAME IN ITEMS ${SHADER_FILES}) +foreach(SOURCE_FILE IN ITEMS ${SHADER_FILES}) + get_filename_component(FILENAME ${SOURCE_FILE} NAME) string(REPLACE "." "_" SHADER_NAME ${FILENAME}) - set(SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}) # Skip generating source headers on Vulkan exclusive files if (NOT ${FILENAME} MATCHES "vulkan.*") set(SOURCE_HEADER_FILE ${SHADER_DIR}/${SHADER_NAME}.h) From 08232ce64275eaf388eba7005f4dae28fc18a0b7 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Thu, 5 Feb 2026 23:46:52 +0100 Subject: [PATCH 017/170] [core, am] stub SetGpuTimeSliceBoost & fix ExitProcessAndReturn (#3475) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A few things noticed on "Super Mario Allstars", this stubs SetGpuTimeSliceBoost and adds a fix for the "Return to title selection" menü. Basically ExitProcessAndReturn now starts/restarts the process on program_index 0 (main menu / title screen) and fixes a device memory clear when using that method. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3475 Reviewed-by: Lizzie Reviewed-by: MaranBr Co-authored-by: Maufeat Co-committed-by: Maufeat --- src/core/core.cpp | 4 +++- .../hle/service/am/service/applet_common_functions.cpp | 9 +++++++-- .../hle/service/am/service/applet_common_functions.h | 3 ++- .../service/am/service/library_applet_self_accessor.cpp | 9 ++++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index bada8ef2c1..50572ea449 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -142,6 +142,7 @@ struct System::Impl { void ReinitializeIfNecessary(System& system) { const bool must_reinitialize = + !device_memory.has_value() || is_multicore != Settings::values.use_multi_core.GetValue() || extended_memory_layout != (Settings::values.memory_layout_mode.GetValue() != Settings::MemoryLayout::Memory_4Gb); @@ -414,6 +415,7 @@ struct System::Impl { cpu_manager.Shutdown(); debugger.reset(); kernel.Shutdown(); + device_memory.reset(); stop_event = {}; Network::RestartSocketOperations(); diff --git a/src/core/hle/service/am/service/applet_common_functions.cpp b/src/core/hle/service/am/service/applet_common_functions.cpp index 2bfcd10d04..ee536221d9 100644 --- a/src/core/hle/service/am/service/applet_common_functions.cpp +++ b/src/core/hle/service/am/service/applet_common_functions.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -36,7 +36,7 @@ IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_, {100, nullptr, "SetApplicationCoreUsageMode"}, {300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"}, {310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+ - {320, nullptr, "SetGpuTimeSliceBoost"}, //19.0.0+ + {320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost"}, //19.0.0+ {321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+ {350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+ }; @@ -82,6 +82,11 @@ Result IAppletCommonFunctions::GetCurrentApplicationId(Out out_application_ R_SUCCEED(); } +Result IAppletCommonFunctions::SetGpuTimeSliceBoost(s64 time_span) { + LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span); + R_SUCCEED(); +} + Result IAppletCommonFunctions::Unknown350(Out out_unknown) { LOG_WARNING(Service_AM, "(STUBBED) called"); *out_unknown = 0; diff --git a/src/core/hle/service/am/service/applet_common_functions.h b/src/core/hle/service/am/service/applet_common_functions.h index be867f00e7..696fcd5bd1 100644 --- a/src/core/hle/service/am/service/applet_common_functions.h +++ b/src/core/hle/service/am/service/applet_common_functions.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -24,6 +24,7 @@ private: Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height); Result SetCpuBoostRequestPriority(s32 priority); Result GetCurrentApplicationId(Out out_application_id); + Result SetGpuTimeSliceBoost(s64 time_span); Result Unknown350(Out out_unknown); const std::shared_ptr applet; diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp index 0f71f24b0b..0335ae5be6 100644 --- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp @@ -179,7 +179,14 @@ Result ILibraryAppletSelfAccessor::GetMainAppletStorageId(Outprocess->Terminate(); + + if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { + system.GetUserChannel() = caller_applet->user_channel_launch_parameter; + } else { + system.GetUserChannel() = m_applet->user_channel_launch_parameter; + } + + system.ExecuteProgram(0); R_SUCCEED(); } From e07e269bd766aa1fc29951b958db2063c1a4048e Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 6 Feb 2026 06:37:30 +0100 Subject: [PATCH 018/170] [desktop] Add mod importer from folder and zip (#3472) Closes #3125 Adds buttons to the addons page that imports a mod (or mods) from zip or folder. Currently known to work with mods that provide proper romfs/exefs things, unsure about cheats and such. Also works on mods that just stuff things into the root of the zip. TODO: - [ ] test folder more thoroughly - [ ] cheats - [ ] test all sorts of mod pack types Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3472 Reviewed-by: Lizzie --- src/frontend_common/CMakeLists.txt | 3 +- src/frontend_common/mod_manager.cpp | 62 ++++++++ src/frontend_common/mod_manager.h | 21 +++ src/qt_common/CMakeLists.txt | 6 +- src/qt_common/abstract/frontend.cpp | 27 +++- src/qt_common/abstract/frontend.h | 8 +- src/qt_common/util/mod.cpp | 137 ++++++++++++++++++ src/qt_common/util/mod.h | 16 ++ src/yuzu/CMakeLists.txt | 1 + .../configuration/addon/mod_select_dialog.cpp | 66 +++++++++ .../configuration/addon/mod_select_dialog.h | 26 ++++ .../configuration/addon/mod_select_dialog.ui | 99 +++++++++++++ src/yuzu/configuration/configure_per_game.cpp | 2 +- src/yuzu/configuration/configure_per_game.h | 2 +- .../configure_per_game_addons.cpp | 75 +++++++++- .../configuration/configure_per_game_addons.h | 11 ++ .../configure_per_game_addons.ui | 18 ++- src/yuzu/main_window.cpp | 4 +- 18 files changed, 570 insertions(+), 14 deletions(-) create mode 100644 src/frontend_common/mod_manager.cpp create mode 100644 src/frontend_common/mod_manager.h create mode 100644 src/qt_common/util/mod.cpp create mode 100644 src/qt_common/util/mod.h create mode 100644 src/yuzu/configuration/addon/mod_select_dialog.cpp create mode 100644 src/yuzu/configuration/addon/mod_select_dialog.h create mode 100644 src/yuzu/configuration/addon/mod_select_dialog.ui diff --git a/src/frontend_common/CMakeLists.txt b/src/frontend_common/CMakeLists.txt index 2f75fede57..5c248ea337 100644 --- a/src/frontend_common/CMakeLists.txt +++ b/src/frontend_common/CMakeLists.txt @@ -13,7 +13,8 @@ add_library(frontend_common STATIC data_manager.h data_manager.cpp play_time_manager.cpp play_time_manager.h - settings_generator.h settings_generator.cpp) + settings_generator.h settings_generator.cpp + mod_manager.h mod_manager.cpp) if (ENABLE_UPDATE_CHECKER) target_link_libraries(frontend_common PRIVATE httplib::httplib) diff --git a/src/frontend_common/mod_manager.cpp b/src/frontend_common/mod_manager.cpp new file mode 100644 index 0000000000..6ac79d22e2 --- /dev/null +++ b/src/frontend_common/mod_manager.cpp @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include +#include "common/fs/fs.h" +#include "common/fs/fs_types.h" +#include "common/logging/backend.h" +#include "frontend_common/data_manager.h" +#include "mod_manager.h" + +namespace FrontendCommon { + +// TODO: Handle cases where the folder appears to contain multiple mods. +std::vector GetModFolder(const std::string& root) { + std::vector paths; + + auto callback = [&paths](const std::filesystem::directory_entry& entry) -> bool { + const auto name = entry.path().filename().string(); + static constexpr const std::array valid_names = {"exefs", + "romfs" + "romfs_ext", + "cheats", "romfslite"}; + + if (std::ranges::find(valid_names, name) != valid_names.end()) { + paths.emplace_back(entry.path().parent_path()); + } + + return true; + }; + + Common::FS::IterateDirEntriesRecursively(root, callback, Common::FS::DirEntryFilter::Directory); + + return paths; +} + +ModInstallResult InstallMod(const std::filesystem::path& path, const u64 program_id, const bool copy) { + const auto program_id_string = fmt::format("{:016X}", program_id); + const auto mod_name = path.filename(); + const auto mod_dir = + DataManager::GetDataDir(DataManager::DataDir::Mods) / program_id_string / mod_name; + + // pre-emptively remove any existing mod here + std::filesystem::remove_all(mod_dir); + + // now copy + try { + std::filesystem::copy(path, mod_dir, std::filesystem::copy_options::recursive); + if (!copy) + std::filesystem::remove_all(path); + } catch (std::exception& e) { + LOG_ERROR(Frontend, "Mod install failed with message {}", e.what()); + return Failed; + } + + LOG_INFO(Frontend, "Copied mod from {} to {}", path.string(), mod_dir.string()); + + return Success; +} + +} // namespace FrontendCommon diff --git a/src/frontend_common/mod_manager.h b/src/frontend_common/mod_manager.h new file mode 100644 index 0000000000..57fdbc3533 --- /dev/null +++ b/src/frontend_common/mod_manager.h @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include "common/common_types.h" + +namespace FrontendCommon { + +enum ModInstallResult { + Cancelled, + Failed, + Success, +}; + +std::vector GetModFolder(const std::string& root); + +ModInstallResult InstallMod(const std::filesystem::path &path, const u64 program_id, const bool copy = true); +} diff --git a/src/qt_common/CMakeLists.txt b/src/qt_common/CMakeLists.txt index 073301b313..65f5b1ee2b 100644 --- a/src/qt_common/CMakeLists.txt +++ b/src/qt_common/CMakeLists.txt @@ -22,6 +22,8 @@ add_library(qt_common STATIC util/rom.h util/rom.cpp util/applet.h util/applet.cpp util/compress.h util/compress.cpp + util/fs.h util/fs.cpp + util/mod.h util/mod.cpp abstract/frontend.h abstract/frontend.cpp abstract/qt_progress_dialog.h abstract/qt_progress_dialog.cpp @@ -29,9 +31,7 @@ add_library(qt_common STATIC qt_string_lookup.h qt_compat.h - discord/discord.h - util/fs.h util/fs.cpp -) + discord/discord.h) if (UNIX) target_sources(qt_common PRIVATE gui_settings.cpp gui_settings.h) diff --git a/src/qt_common/abstract/frontend.cpp b/src/qt_common/abstract/frontend.cpp index a0ce943538..58f1fe6aa8 100644 --- a/src/qt_common/abstract/frontend.cpp +++ b/src/qt_common/abstract/frontend.cpp @@ -1,6 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +#include #include "frontend.h" #include "qt_common/qt_common.h" @@ -8,6 +9,9 @@ #include #endif +#include +#include + namespace QtCommon::Frontend { StandardButton ShowMessage( @@ -50,4 +54,25 @@ const QString GetExistingDirectory(const QString& caption, const QString& dir, #endif } +int Choice(const QString& title, const QString& caption, const QStringList& options) { + QMessageBox box(rootObject); + box.setText(caption); + box.setWindowTitle(title); + + for (const QString &opt : options) { + box.addButton(opt, QMessageBox::AcceptRole); + } + + box.addButton(QMessageBox::Cancel); + + box.exec(); + auto button = box.clickedButton(); + return options.indexOf(button->text()); +} + +const QString GetTextInput(const QString& title, const QString& caption, + const QString& defaultText) { + return QInputDialog::getText(rootObject, title, caption, QLineEdit::Normal, defaultText); +} + } // namespace QtCommon::Frontend diff --git a/src/qt_common/abstract/frontend.h b/src/qt_common/abstract/frontend.h index 0ef9ea97e4..d61eebfeb1 100644 --- a/src/qt_common/abstract/frontend.h +++ b/src/qt_common/abstract/frontend.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef FRONTEND_H @@ -139,5 +139,11 @@ const QString GetExistingDirectory(const QString &caption = QString(), const QString &dir = QString(), Options options = Option::ShowDirsOnly); +int Choice(const QString& title = QString(), const QString& caption = QString(), + const QStringList& options = {}); + +const QString GetTextInput(const QString& title = QString(), const QString& caption = QString(), + const QString& defaultText = QString()); + } // namespace QtCommon::Frontend #endif // FRONTEND_H diff --git a/src/qt_common/util/mod.cpp b/src/qt_common/util/mod.cpp new file mode 100644 index 0000000000..1168bde2f6 --- /dev/null +++ b/src/qt_common/util/mod.cpp @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include "frontend_common/mod_manager.h" +#include "mod.h" +#include "qt_common/abstract/frontend.h" + +namespace QtCommon::Mod { +QStringList GetModFolders(const QString& root, const QString& fallbackName) { + namespace fs = std::filesystem; + + const auto std_root = root.toStdString(); + + auto paths = FrontendCommon::GetModFolder(std_root); + + // multi mod zip + if (paths.size() > 1) { + // We just have to assume it's properly formed here. + // If not, you're out of luck. + QStringList qpaths; + for (const fs::path& path : paths) { + qpaths << QString::fromStdString(path.string()); + } + + return qpaths; + } + // either frontend didn't detect any romfs/exefs, or is a single-mod zip + else { + fs::path std_path; + if (!paths.empty()) + std_path = paths[0]; + + QString default_name; + if (!fallbackName.isEmpty()) + default_name = fallbackName; + else if (!paths.empty()) + default_name = QString::fromStdString(std_path.filename().string()); + else + default_name = root.split(QLatin1Char('/')).last(); + + QString name = QtCommon::Frontend::GetTextInput( + tr("Mod Name"), tr("What should this mod be called?"), default_name); + + // if std_path is empty, frontend_common could not determine mod type and/or name. + // so we have to prompt the user and set up the structure ourselves + if (paths.empty()) { + // TODO: Carboxyl impl. + const QStringList choices = { + tr("RomFS"), + tr("ExeFS/Patch"), + tr("Cheat"), + }; + + int choice = QtCommon::Frontend::Choice( + tr("Mod Type"), + tr("Could not detect mod type automatically. Please manually " + "specify the type of mod you downloaded.\n\nMost mods are RomFS mods, but " + "patches " + "(.pchtxt) are typically ExeFS mods."), + choices); + + std::string to_make; + + switch (choice) { + case 0: + to_make = "romfs"; + break; + case 1: + to_make = "exefs"; + break; + case 2: + to_make = "cheats"; + break; + default: + return {}; + } + + // now make a temp directory... + const auto mod_dir = fs::temp_directory_path() / "eden" / "mod" / name.toStdString(); + const auto tmp = mod_dir / to_make; + fs::remove_all(mod_dir); + if (!fs::create_directories(tmp)) { + LOG_ERROR(Frontend, "Failed to create temporary directory {}", tmp.string()); + return {}; + } + + std_path = mod_dir; + + // ... and copy everything from the root to the temp dir + for (const auto& entry : fs::directory_iterator(root.toStdString())) { + const auto target = tmp / entry.path().filename(); + + fs::copy(entry.path(), target, + fs::copy_options::recursive | fs::copy_options::overwrite_existing); + } + } else { + // Rename the existing mod folder. + const auto new_path = std_path.parent_path() / name.toStdString(); + fs::rename(std_path, new_path); + std_path = new_path; + } + + return {QString::fromStdString(std_path.string())}; + } +} + +// TODO(crueter): Make this a common extract_to_tmp func +const QString ExtractMod(const QString& path) { + namespace fs = std::filesystem; + fs::path tmp{fs::temp_directory_path() / "eden" / "unzip_mod"}; + + fs::remove_all(tmp); + if (!fs::create_directories(tmp)) { + QtCommon::Frontend::Critical(tr("Mod Extract Failed"), + tr("Failed to create temporary directory %1") + .arg(QString::fromStdString(tmp.string()))); + return QString(); + } + + QString qCacheDir = QString::fromStdString(tmp.string()); + + QFile zip{path}; + + // TODO(crueter): use QtCompress + QStringList result = JlCompress::extractDir(&zip, qCacheDir); + if (result.isEmpty()) { + QtCommon::Frontend::Critical(tr("Mod Extract Failed"), + tr("Zip file %1 is empty").arg(path)); + return QString(); + } + + return qCacheDir; +} + +} // namespace QtCommon::Mod diff --git a/src/qt_common/util/mod.h b/src/qt_common/util/mod.h new file mode 100644 index 0000000000..ceda81ef92 --- /dev/null +++ b/src/qt_common/util/mod.h @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include "common/common_types.h" +#include "frontend_common/mod_manager.h" + +namespace QtCommon::Mod { + +QStringList GetModFolders(const QString &root, const QString &fallbackName); + +const QString ExtractMod(const QString &path); + +} diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 0d49e4a5e7..ba2b5b3927 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -238,6 +238,7 @@ add_executable(yuzu configuration/system/new_user_dialog.h configuration/system/new_user_dialog.cpp configuration/system/new_user_dialog.ui configuration/system/profile_avatar_dialog.h configuration/system/profile_avatar_dialog.cpp + configuration/addon/mod_select_dialog.h configuration/addon/mod_select_dialog.cpp configuration/addon/mod_select_dialog.ui ) set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") diff --git a/src/yuzu/configuration/addon/mod_select_dialog.cpp b/src/yuzu/configuration/addon/mod_select_dialog.cpp new file mode 100644 index 0000000000..e6c361b94f --- /dev/null +++ b/src/yuzu/configuration/addon/mod_select_dialog.cpp @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include "mod_select_dialog.h" +#include "ui_mod_select_dialog.h" + +ModSelectDialog::ModSelectDialog(const QStringList& mods, QWidget* parent) + : QDialog(parent), ui(new Ui::ModSelectDialog) { + ui->setupUi(this); + + item_model = new QStandardItemModel(ui->treeView); + ui->treeView->setModel(item_model); + + // We must register all custom types with the Qt Automoc system so that we are able to use it + // with signals/slots. In this case, QList falls under the umbrella of custom types. + qRegisterMetaType>("QList"); + + for (const auto& mod : mods) { + const auto basename = QFileInfo(mod).fileName(); + + auto* const first_item = new QStandardItem; + first_item->setText(basename); + first_item->setData(mod); + + first_item->setCheckable(true); + first_item->setCheckState(Qt::Checked); + + item_model->appendRow(first_item); + } + + ui->treeView->expandAll(); + ui->treeView->resizeColumnToContents(0); + + int rows = item_model->rowCount(); + int height = + ui->treeView->contentsMargins().top() * 4 + ui->treeView->contentsMargins().bottom() * 4; + int width = 0; + + for (int i = 0; i < rows; ++i) { + height += ui->treeView->sizeHintForRow(i); + width = qMax(width, item_model->item(i)->sizeHint().width()); + } + + width += ui->treeView->contentsMargins().left() * 4 + ui->treeView->contentsMargins().right() * 4; + ui->treeView->setMinimumHeight(qMin(height, 600)); + ui->treeView->setMinimumWidth(qMin(width, 700)); + adjustSize(); + + connect(this, &QDialog::accepted, this, [this]() { + QStringList selected_mods; + + for (qsizetype i = 0; i < item_model->rowCount(); ++i) { + auto* const item = item_model->item(i); + if (item->checkState() == Qt::Checked) + selected_mods << item->data().toString(); + } + + emit modsSelected(selected_mods); + }); +} + +ModSelectDialog::~ModSelectDialog() { + delete ui; +} diff --git a/src/yuzu/configuration/addon/mod_select_dialog.h b/src/yuzu/configuration/addon/mod_select_dialog.h new file mode 100644 index 0000000000..d23c435e7a --- /dev/null +++ b/src/yuzu/configuration/addon/mod_select_dialog.h @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +namespace Ui { +class ModSelectDialog; +} + +class ModSelectDialog : public QDialog { + Q_OBJECT + +public: + explicit ModSelectDialog(const QStringList &mods, QWidget* parent = nullptr); + ~ModSelectDialog(); + +signals: + void modsSelected(const QStringList &mods); +private: + Ui::ModSelectDialog* ui; + + QStandardItemModel* item_model; +}; diff --git a/src/yuzu/configuration/addon/mod_select_dialog.ui b/src/yuzu/configuration/addon/mod_select_dialog.ui new file mode 100644 index 0000000000..6e196ecff0 --- /dev/null +++ b/src/yuzu/configuration/addon/mod_select_dialog.ui @@ -0,0 +1,99 @@ + + + ModSelectDialog + + + + 0 + 0 + 400 + 430 + + + + Dialog + + + + + + The specified folder or archive contains the following mods. Select which ones to install. + + + true + + + + + + + Qt::ContextMenuPolicy::NoContextMenu + + + QAbstractItemView::EditTrigger::NoEditTriggers + + + true + + + QAbstractItemView::ScrollMode::ScrollPerPixel + + + true + + + true + + + true + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + + buttonBox + accepted() + ModSelectDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ModSelectDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index e49978414c..eddb24b952 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index e4d18f29b9..1e53bf0708 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index ee2db55a5d..3032e4c3d9 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -14,17 +14,21 @@ #include #include #include +#include #include "common/fs/fs.h" #include "common/fs/path_util.h" +#include "configuration/addon/mod_select_dialog.h" #include "core/core.h" #include "core/file_sys/patch_manager.h" -#include "core/file_sys/xts_archive.h" #include "core/loader/loader.h" +#include "frontend_common/mod_manager.h" +#include "qt_common/abstract/frontend.h" +#include "qt_common/config/uisettings.h" +#include "qt_common/util/mod.h" #include "ui_configure_per_game_addons.h" #include "yuzu/configuration/configure_input.h" #include "yuzu/configuration/configure_per_game_addons.h" -#include "qt_common/config/uisettings.h" ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* parent) : QWidget(parent), ui{std::make_unique()}, system{system_} { @@ -66,6 +70,9 @@ ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* p connect(item_model, &QStandardItemModel::itemChanged, [] { UISettings::values.is_game_list_reload_pending.exchange(true); }); + + connect(ui->folder, &QAbstractButton::clicked, this, &ConfigurePerGameAddons::InstallModFolder); + connect(ui->zip, &QAbstractButton::clicked, this, &ConfigurePerGameAddons::InstallModZip); } ConfigurePerGameAddons::~ConfigurePerGameAddons() = default; @@ -99,6 +106,68 @@ void ConfigurePerGameAddons::SetTitleId(u64 id) { this->title_id = id; } +void ConfigurePerGameAddons::InstallMods(const QStringList& mods) { + QStringList failed; + for (const auto& mod : mods) { + if (FrontendCommon::InstallMod(mod.toStdString(), title_id, true) == + FrontendCommon::Failed) { + failed << QFileInfo(mod).baseName(); + } + } + + if (failed.empty()) { + QtCommon::Frontend::Information(tr("Mod Install Succeeded"), + tr("Successfully installed all mods.")); + + item_model->removeRows(0, item_model->rowCount()); + list_items.clear(); + LoadConfiguration(); + + UISettings::values.is_game_list_reload_pending.exchange(true); + } else { + QtCommon::Frontend::Critical( + tr("Mod Install Failed"), + tr("Failed to install the following mods:\n\t%1\nCheck the log for details.") + .arg(failed.join(QStringLiteral("\n\t")))); + } +} + +void ConfigurePerGameAddons::InstallModPath(const QString& path) { + const auto mods = QtCommon::Mod::GetModFolders(path, {}); + + if (mods.size() > 1) { + ModSelectDialog* dialog = new ModSelectDialog(mods, this); + connect(dialog, &ModSelectDialog::modsSelected, this, &ConfigurePerGameAddons::InstallMods); + dialog->show(); + } else { + InstallMods(mods); + } +} + +void ConfigurePerGameAddons::InstallModFolder() { + const auto path = QtCommon::Frontend::GetExistingDirectory( + tr("Mod Folder"), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); + if (path.isEmpty()) { + return; + } + + InstallModPath(path); +} + +void ConfigurePerGameAddons::InstallModZip() { + const auto path = QtCommon::Frontend::GetOpenFileName( + tr("Zipped Mod Location"), + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation), + tr("Zipped Archives (*.zip)")); + if (path.isEmpty()) { + return; + } + + const QString extracted = QtCommon::Mod::ExtractMod(path); + if (!extracted.isEmpty()) + InstallModPath(extracted); +} + void ConfigurePerGameAddons::changeEvent(QEvent* event) { if (event->type() == QEvent::LanguageChange) { RetranslateUI(); diff --git a/src/yuzu/configuration/configure_per_game_addons.h b/src/yuzu/configuration/configure_per_game_addons.h index 32dc5dde62..8b698b5bec 100644 --- a/src/yuzu/configuration/configure_per_game_addons.h +++ b/src/yuzu/configuration/configure_per_game_addons.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,6 +10,7 @@ #include #include +#include #include "core/file_sys/vfs/vfs_types.h" @@ -38,6 +42,13 @@ public: void SetTitleId(u64 id); +public slots: + void InstallMods(const QStringList &mods); + void InstallModPath(const QString& path); + + void InstallModFolder(); + void InstallModZip(); + private: void changeEvent(QEvent* event) override; void RetranslateUI(); diff --git a/src/yuzu/configuration/configure_per_game_addons.ui b/src/yuzu/configuration/configure_per_game_addons.ui index f9cf6f2c31..632f9d422b 100644 --- a/src/yuzu/configuration/configure_per_game_addons.ui +++ b/src/yuzu/configuration/configure_per_game_addons.ui @@ -17,7 +17,21 @@ Add-Ons - + + + + Import Mod from ZIP + + + + + + + Import Mod from Folder + + + + true @@ -28,7 +42,7 @@ 0 0 380 - 280 + 249 diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 5fee35dc7f..8adcdb4cbe 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -85,6 +85,7 @@ #include "qt_common/util/meta.h" #include "qt_common/util/content.h" #include "qt_common/util/fs.h" +#include "qt_common/util/mod.h" // These are wrappers to avoid the calls to CreateDirectory and CreateFile because of the Windows // defines. @@ -3654,6 +3655,7 @@ void MainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file_ Settings::SetConfiguringGlobal(false); ConfigurePerGame dialog(this, title_id, file_name, vk_device_records, *QtCommon::system); dialog.LoadFromFile(v_file); + const auto result = dialog.exec(); if (result != QDialog::Accepted && !UISettings::values.configuration_applied) { @@ -3665,7 +3667,7 @@ void MainWindow::OpenPerGameConfiguration(u64 title_id, const std::string& file_ const auto reload = UISettings::values.is_game_list_reload_pending.exchange(false); if (reload) { - game_list->PopulateAsync(UISettings::values.game_dirs); + OnGameListRefresh(); } // Do not cause the global config to write local settings into the config file From 69aff83ef448b1f76fad1fa6ae46ff9f70b840c0 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Fri, 6 Feb 2026 14:05:44 +0100 Subject: [PATCH 019/170] [fs/core] Load external content without NAND install (#2862) Adds the capability to add DLC and Updates without installing them to NAND. This was tested on Windows only and needs Android integration. Co-authored-by: crueter Co-authored-by: wildcard Co-authored-by: nekle Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2862 Reviewed-by: DraVee Reviewed-by: crueter Co-authored-by: Maufeat Co-committed-by: Maufeat --- .../yuzu/yuzu_emu/adapters/AddonAdapter.kt | 10 +- .../yuzu/yuzu_emu/adapters/FolderAdapter.kt | 11 + .../GameFolderPropertiesDialogFragment.kt | 27 +- .../yuzu_emu/fragments/GameFoldersFragment.kt | 25 +- .../fragments/HomeSettingsFragment.kt | 3 + .../org/yuzu/yuzu_emu/model/AddonViewModel.kt | 71 ++- .../java/org/yuzu/yuzu_emu/model/GameDir.kt | 16 +- .../org/yuzu/yuzu_emu/model/GamesViewModel.kt | 68 ++- .../java/org/yuzu/yuzu_emu/model/Patch.kt | 6 +- .../org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 29 + .../org/yuzu/yuzu_emu/utils/GameHelper.kt | 44 +- .../org/yuzu/yuzu_emu/utils/NativeConfig.kt | 10 +- .../app/src/main/jni/android_config.cpp | 23 +- src/android/app/src/main/jni/native.cpp | 120 +++- .../app/src/main/jni/native_config.cpp | 22 + .../app/src/main/res/layout/card_folder.xml | 17 +- .../app/src/main/res/values/strings.xml | 4 + src/common/android/id_cache.cpp | 4 +- src/common/settings.h | 1 + src/core/file_sys/patch_manager.cpp | 454 +++++++++++++-- src/core/file_sys/patch_manager.h | 12 + src/core/file_sys/registered_cache.cpp | 519 +++++++++++++++++- src/core/file_sys/registered_cache.h | 57 +- src/core/file_sys/submission_package.cpp | 11 + .../hle/service/filesystem/filesystem.cpp | 38 +- src/core/hle/service/filesystem/filesystem.h | 8 + src/qt_common/config/qt_config.cpp | 19 +- src/qt_common/util/game.cpp | 16 +- src/yuzu/configuration/configure_dialog.cpp | 4 +- src/yuzu/configuration/configure_dialog.h | 3 +- .../configuration/configure_filesystem.cpp | 7 +- src/yuzu/configuration/configure_filesystem.h | 2 +- src/yuzu/configuration/configure_general.cpp | 67 ++- src/yuzu/configuration/configure_general.h | 10 + src/yuzu/configuration/configure_general.ui | 60 ++ .../configure_per_game_addons.cpp | 75 ++- .../configuration/configure_per_game_addons.h | 2 + src/yuzu/game_list.cpp | 33 ++ src/yuzu/game_list.h | 3 + src/yuzu/main_window.cpp | 5 +- 40 files changed, 1790 insertions(+), 126 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt index 2be91ba46a..371fef0025 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/AddonAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project @@ -10,6 +10,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding import org.yuzu.yuzu_emu.model.Patch +import org.yuzu.yuzu_emu.model.PatchType import org.yuzu.yuzu_emu.model.AddonViewModel import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder @@ -31,7 +32,12 @@ class AddonAdapter(val addonViewModel: AddonViewModel) : binding.addonSwitch.isChecked = model.enabled binding.addonSwitch.setOnCheckedChangeListener { _, checked -> - model.enabled = checked + if (PatchType.from(model.type) == PatchType.Update && checked) { + addonViewModel.enableOnlyThisUpdate(model) + notifyDataSetChanged() + } else { + model.enabled = checked + } } val deleteAction = { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt index 5cbd15d2ac..d53bebf796 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/adapters/FolderAdapter.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,8 +10,10 @@ import android.net.Uri import android.view.LayoutInflater import android.view.ViewGroup import androidx.fragment.app.FragmentActivity +import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.databinding.CardFolderBinding import org.yuzu.yuzu_emu.fragments.GameFolderPropertiesDialogFragment +import org.yuzu.yuzu_emu.model.DirectoryType import org.yuzu.yuzu_emu.model.GameDir import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.utils.ViewUtils.marquee @@ -31,6 +36,12 @@ class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesVie path.text = Uri.parse(model.uriString).path path.marquee() + // Set type indicator, shows below folder name, to see if DLC or Games + typeIndicator.text = when (model.type) { + DirectoryType.GAME -> activity.getString(R.string.games) + DirectoryType.EXTERNAL_CONTENT -> activity.getString(R.string.external_content) + } + buttonEdit.setOnClickListener { GameFolderPropertiesDialogFragment.newInstance(model) .show( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFolderPropertiesDialogFragment.kt index 1ea1e036e6..ff26ac0d89 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,11 +9,13 @@ package org.yuzu.yuzu_emu.fragments import android.app.Dialog import android.content.DialogInterface import android.os.Bundle +import android.view.View import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.databinding.DialogFolderPropertiesBinding +import org.yuzu.yuzu_emu.model.DirectoryType import org.yuzu.yuzu_emu.model.GameDir import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.utils.NativeConfig @@ -25,14 +30,18 @@ class GameFolderPropertiesDialogFragment : DialogFragment() { val binding = DialogFolderPropertiesBinding.inflate(layoutInflater) val gameDir = requireArguments().parcelable(GAME_DIR)!! - // Restore checkbox state - binding.deepScanSwitch.isChecked = - savedInstanceState?.getBoolean(DEEP_SCAN) ?: gameDir.deepScan + // Hide deepScan for external content, do automatically + if (gameDir.type == DirectoryType.EXTERNAL_CONTENT) { + binding.deepScanSwitch.visibility = View.GONE + } else { + // Restore checkbox state for game dirs + binding.deepScanSwitch.isChecked = + savedInstanceState?.getBoolean(DEEP_SCAN) ?: gameDir.deepScan - // Ensure that we can get the checkbox state even if the view is destroyed - deepScan = binding.deepScanSwitch.isChecked - binding.deepScanSwitch.setOnClickListener { deepScan = binding.deepScanSwitch.isChecked + binding.deepScanSwitch.setOnClickListener { + deepScan = binding.deepScanSwitch.isChecked + } } return MaterialAlertDialogBuilder(requireContext()) @@ -41,8 +50,10 @@ class GameFolderPropertiesDialogFragment : DialogFragment() { .setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int -> val folderIndex = gamesViewModel.folders.value.indexOf(gameDir) if (folderIndex != -1) { - gamesViewModel.folders.value[folderIndex].deepScan = - binding.deepScanSwitch.isChecked + if (gameDir.type == DirectoryType.GAME) { + gamesViewModel.folders.value[folderIndex].deepScan = + binding.deepScanSwitch.isChecked + } gamesViewModel.updateGameDirs() } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt index 87b1533408..9c43d2c6e1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -15,11 +15,14 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.launch import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.adapters.FolderAdapter import org.yuzu.yuzu_emu.databinding.FragmentFoldersBinding +import org.yuzu.yuzu_emu.model.DirectoryType +import org.yuzu.yuzu_emu.model.GameDir import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.ui.main.MainActivity @@ -73,7 +76,25 @@ class GameFoldersFragment : Fragment() { val mainActivity = requireActivity() as MainActivity binding.buttonAdd.setOnClickListener { - mainActivity.getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) + // Show a model to choose between Game and External Content + val options = arrayOf( + getString(R.string.games), + getString(R.string.external_content) + ) + + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.add_folders) + .setItems(options) { _, which -> + when (which) { + 0 -> { // Game Folder + mainActivity.getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) + } + 1 -> { // External Content Folder + mainActivity.getExternalContentDirectory.launch(null) + } + } + } + .show() } setInsets() diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt index d21b4e5d91..918478bf85 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt @@ -1,6 +1,9 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + package org.yuzu.yuzu_emu.fragments import android.Manifest diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt index b9c8e49ca4..c682a13cfc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/AddonViewModel.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -48,16 +51,68 @@ class AddonViewModel : ViewModel() { ?: emptyArray() ).toMutableList() patchList.sortBy { it.name } + + // Ensure only one update is enabled + ensureSingleUpdateEnabled(patchList) + + removeDuplicates(patchList) + _patchList.value = patchList isRefreshing.set(false) } } } + private fun ensureSingleUpdateEnabled(patchList: MutableList) { + val updates = patchList.filter { PatchType.from(it.type) == PatchType.Update } + if (updates.size <= 1) { + return + } + + val enabledUpdates = updates.filter { it.enabled } + + if (enabledUpdates.size > 1) { + val nandOrSdmcEnabled = enabledUpdates.find { + it.name.contains("(NAND)") || it.name.contains("(SDMC)") + } + + val updateToKeep = nandOrSdmcEnabled ?: enabledUpdates.first() + + for (patch in patchList) { + if (PatchType.from(patch.type) == PatchType.Update) { + patch.enabled = (patch === updateToKeep) + } + } + } + } + + private fun removeDuplicates(patchList: MutableList) { + val seen = mutableSetOf() + val iterator = patchList.iterator() + while (iterator.hasNext()) { + val patch = iterator.next() + val key = "${patch.name}|${patch.version}|${patch.type}" + if (seen.contains(key)) { + iterator.remove() + } else { + seen.add(key) + } + } + } + fun setAddonToDelete(patch: Patch?) { _addonToDelete.value = patch } + fun enableOnlyThisUpdate(selectedPatch: Patch) { + val currentList = _patchList.value + for (patch in currentList) { + if (PatchType.from(patch.type) == PatchType.Update) { + patch.enabled = (patch === selectedPatch) + } + } + } + fun onDeleteAddon(patch: Patch) { when (PatchType.from(patch.type)) { PatchType.Update -> NativeLibrary.removeUpdate(patch.programId) @@ -72,13 +127,27 @@ class AddonViewModel : ViewModel() { return } + // Check if there are multiple update versions + val updates = _patchList.value.filter { PatchType.from(it.type) == PatchType.Update } + val hasMultipleUpdates = updates.size > 1 + NativeConfig.setDisabledAddons( game!!.programId, _patchList.value.mapNotNull { if (it.enabled) { null } else { - it.name + if (PatchType.from(it.type) == PatchType.Update) { + if (it.name.contains("(NAND)") || it.name.contains("(SDMC)")) { + it.name + } else if (hasMultipleUpdates) { + "Update@${it.numericVersion}" + } else { + it.name + } + } else { + it.name + } } }.toTypedArray() ) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameDir.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameDir.kt index 274bc1c7bc..b7113bf937 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GameDir.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,5 +12,14 @@ import kotlinx.parcelize.Parcelize @Parcelize data class GameDir( val uriString: String, - var deepScan: Boolean -) : Parcelable + var deepScan: Boolean, + val type: DirectoryType = DirectoryType.GAME +) : Parcelable { + // Needed for JNI backward compatability + constructor(uriString: String, deepScan: Boolean) : this(uriString, deepScan, DirectoryType.GAME) +} + +enum class DirectoryType { + GAME, + EXTERNAL_CONTENT +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt index ae5f8f89de..39ff038034 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.model @@ -56,7 +56,7 @@ class GamesViewModel : ViewModel() { // Ensure keys are loaded so that ROM metadata can be decrypted. NativeLibrary.reloadKeys() - getGameDirs() + getGameDirsAndExternalContent() reloadGames(directoriesChanged = false, firstStartup = true) } @@ -144,11 +144,19 @@ class GamesViewModel : ViewModel() { fun addFolder(gameDir: GameDir, savedFromGameFragment: Boolean) = viewModelScope.launch { withContext(Dispatchers.IO) { - NativeConfig.addGameDir(gameDir) - val isFirstTimeSetup = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) - .getBoolean(org.yuzu.yuzu_emu.features.settings.model.Settings.PREF_FIRST_APP_LAUNCH, true) - - getGameDirs(!isFirstTimeSetup) + when (gameDir.type) { + DirectoryType.GAME -> { + NativeConfig.addGameDir(gameDir) + val isFirstTimeSetup = PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) + .getBoolean(org.yuzu.yuzu_emu.features.settings.model.Settings.PREF_FIRST_APP_LAUNCH, true) + getGameDirsAndExternalContent(!isFirstTimeSetup) + } + DirectoryType.EXTERNAL_CONTENT -> { + addExternalContentDir(gameDir.uriString) + NativeConfig.saveGlobalConfig() + getGameDirsAndExternalContent() + } + } } if (savedFromGameFragment) { @@ -168,8 +176,15 @@ class GamesViewModel : ViewModel() { val removedDirIndex = gameDirs.indexOf(gameDir) if (removedDirIndex != -1) { gameDirs.removeAt(removedDirIndex) - NativeConfig.setGameDirs(gameDirs.toTypedArray()) - getGameDirs() + when (gameDir.type) { + DirectoryType.GAME -> { + NativeConfig.setGameDirs(gameDirs.filter { it.type == DirectoryType.GAME }.toTypedArray()) + } + DirectoryType.EXTERNAL_CONTENT -> { + removeExternalContentDir(gameDir.uriString) + } + } + getGameDirsAndExternalContent() } } } @@ -177,15 +192,16 @@ class GamesViewModel : ViewModel() { fun updateGameDirs() = viewModelScope.launch { withContext(Dispatchers.IO) { - NativeConfig.setGameDirs(_folders.value.toTypedArray()) - getGameDirs() + val gameDirs = _folders.value.filter { it.type == DirectoryType.GAME } + NativeConfig.setGameDirs(gameDirs.toTypedArray()) + getGameDirsAndExternalContent() } } fun onOpenGameFoldersFragment() = viewModelScope.launch { withContext(Dispatchers.IO) { - getGameDirs() + getGameDirsAndExternalContent() } } @@ -193,16 +209,36 @@ class GamesViewModel : ViewModel() { NativeConfig.saveGlobalConfig() viewModelScope.launch { withContext(Dispatchers.IO) { - getGameDirs(true) + getGameDirsAndExternalContent(true) } } } - private fun getGameDirs(reloadList: Boolean = false) { - val gameDirs = NativeConfig.getGameDirs() - _folders.value = gameDirs.toMutableList() + private fun getGameDirsAndExternalContent(reloadList: Boolean = false) { + val gameDirs = NativeConfig.getGameDirs().toMutableList() + val externalContentDirs = NativeConfig.getExternalContentDirs().map { + GameDir(it, false, DirectoryType.EXTERNAL_CONTENT) + } + gameDirs.addAll(externalContentDirs) + _folders.value = gameDirs if (reloadList) { reloadGames(true) } } + + private fun addExternalContentDir(path: String) { + val currentDirs = NativeConfig.getExternalContentDirs().toMutableList() + if (!currentDirs.contains(path)) { + currentDirs.add(path) + NativeConfig.setExternalContentDirs(currentDirs.toTypedArray()) + NativeConfig.saveGlobalConfig() + } + } + + private fun removeExternalContentDir(path: String) { + val currentDirs = NativeConfig.getExternalContentDirs().toMutableList() + currentDirs.remove(path) + NativeConfig.setExternalContentDirs(currentDirs.toTypedArray()) + NativeConfig.saveGlobalConfig() + } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt index 25cb9e3654..8a367116c1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Patch.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,5 +15,6 @@ data class Patch( val version: String, val type: Int, val programId: String, - val titleId: String + val titleId: String, + val numericVersion: Long = 0 ) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 8186a6b18f..8edec4ff46 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -63,6 +63,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import androidx.documentfile.provider.DocumentFile class MainActivity : AppCompatActivity(), ThemeProvider { private lateinit var binding: ActivityMainBinding @@ -389,6 +390,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider { } } + val getExternalContentDirectory = + registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result -> + if (result != null) { + processExternalContentDir(result) + } + } + fun processGamesDir(result: Uri, calledFromGameFragment: Boolean = false) { contentResolver.takePersistableUriPermission( result, @@ -410,6 +418,27 @@ class MainActivity : AppCompatActivity(), ThemeProvider { .show(supportFragmentManager, AddGameFolderDialogFragment.TAG) } + fun processExternalContentDir(result: Uri) { + contentResolver.takePersistableUriPermission( + result, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + + val uriString = result.toString() + val folder = gamesViewModel.folders.value.firstOrNull { it.uriString == uriString } + if (folder != null) { + Toast.makeText( + applicationContext, + R.string.folder_already_added, + Toast.LENGTH_SHORT + ).show() + return + } + + val externalContentDir = org.yuzu.yuzu_emu.model.GameDir(uriString, false, org.yuzu.yuzu_emu.model.DirectoryType.EXTERNAL_CONTENT) + gamesViewModel.addFolder(externalContentDir, savedFromGameFragment = false) + } + val getProdKey = registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> if (result != null) { processKey(result, "keys") diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt index e27bc94696..fff5fdfb9b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt @@ -1,9 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// SPDX-FileCopyrightText: 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - package org.yuzu.yuzu_emu.utils import android.content.SharedPreferences @@ -49,6 +49,17 @@ object GameHelper { // Remove previous filesystem provider information so we can get up to date version info NativeLibrary.clearFilesystemProvider() + // Scan External Content directories and register all NSP/XCI files + val externalContentDirs = NativeConfig.getExternalContentDirs() + for (externalDir in externalContentDirs) { + if (externalDir.isNotEmpty()) { + val externalDirUri = externalDir.toUri() + if (FileUtil.isTreeUriValid(externalDirUri)) { + scanExternalContentRecursive(FileUtil.listFiles(externalDirUri), 3) + } + } + } + val badDirs = mutableListOf() gameDirs.forEachIndexed { index: Int, gameDir: GameDir -> val gameDirUri = gameDir.uriString.toUri() @@ -88,6 +99,33 @@ object GameHelper { return games.toList() } + // File extensions considered as external content, buuut should + // be done better imo. + private val externalContentExtensions = setOf("nsp", "xci") + + private fun scanExternalContentRecursive( + files: Array, + depth: Int + ) { + if (depth <= 0) { + return + } + + files.forEach { + if (it.isDirectory) { + scanExternalContentRecursive( + FileUtil.listFiles(it.uri), + depth - 1 + ) + } else { + val extension = FileUtil.getExtension(it.uri).lowercase() + if (externalContentExtensions.contains(extension)) { + NativeLibrary.addFileToFilesystemProvider(it.uri.toString()) + } + } + } + } + private fun addGamesRecursive( games: MutableList, files: Array, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt index d53672af26..d1b5b1373d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project @@ -204,4 +204,12 @@ object NativeConfig { external fun getSdmcDir(): String @Synchronized external fun setSdmcDir(path: String) + + /** + * External Content Provider + */ + @Synchronized + external fun getExternalContentDirs(): Array + @Synchronized + external fun setExternalContentDirs(dirs: Array) } diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index 7345a1893f..0171e2a7b3 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -1,8 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include #include +#include #include #include "android_config.h" #include "android_settings.h" @@ -69,6 +70,18 @@ void AndroidConfig::ReadPathValues() { } EndArray(); + // Read external content directories + Settings::values.external_content_dirs.clear(); + const int external_dirs_size = BeginArray(std::string("external_content_dirs")); + for (int i = 0; i < external_dirs_size; ++i) { + SetArrayIndex(i); + std::string dir_path = ReadStringSetting(std::string("path")); + if (!dir_path.empty()) { + Settings::values.external_content_dirs.push_back(dir_path); + } + } + EndArray(); + const auto nand_dir_setting = ReadStringSetting(std::string("nand_directory")); if (!nand_dir_setting.empty()) { Common::FS::SetEdenPath(Common::FS::EdenPath::NANDDir, nand_dir_setting); @@ -241,6 +254,14 @@ void AndroidConfig::SavePathValues() { } EndArray(); + // Save external content directories + BeginArray(std::string("external_content_dirs")); + for (size_t i = 0; i < Settings::values.external_content_dirs.size(); ++i) { + SetArrayIndex(i); + WriteStringSetting(std::string("path"), Settings::values.external_content_dirs[i]); + } + EndArray(); + // Save custom NAND directory const auto nand_path = Common::FS::GetEdenPathString(Common::FS::EdenPath::NANDDir); WriteStringSetting(std::string("nand_directory"), nand_path, diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index ac1a189e75..195a100983 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -55,8 +55,11 @@ #include "core/crypto/key_manager.h" #include "core/file_sys/card_image.h" #include "core/file_sys/content_archive.h" +#include "core/file_sys/control_metadata.h" #include "core/file_sys/fs_filesystem.h" #include "core/file_sys/romfs.h" +#include "core/file_sys/nca_metadata.h" +#include "core/file_sys/romfs.h" #include "core/file_sys/submission_package.h" #include "core/file_sys/vfs/vfs.h" #include "core/file_sys/vfs/vfs_real.h" @@ -212,6 +215,109 @@ void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath) return; } + const auto extension = Common::ToLower(filepath.substr(filepath.find_last_of('.') + 1)); + + if (extension == "nsp") { + auto nsp = std::make_shared(file); + if (nsp->GetStatus() == Loader::ResultStatus::Success) { + std::map nsp_versions; + std::map nsp_version_strings; + + for (const auto& [title_id, nca_map] : nsp->GetNCAs()) { + for (const auto& [type_pair, nca] : nca_map) { + const auto& [title_type, content_type] = type_pair; + + if (content_type == FileSys::ContentRecordType::Meta) { + const auto meta_nca = std::make_shared(nca->GetBaseFile()); + if (meta_nca->GetStatus() == Loader::ResultStatus::Success) { + const auto section0 = meta_nca->GetSubdirectories(); + if (!section0.empty()) { + for (const auto& meta_file : section0[0]->GetFiles()) { + if (meta_file->GetExtension() == "cnmt") { + FileSys::CNMT cnmt(meta_file); + nsp_versions[cnmt.GetTitleID()] = cnmt.GetTitleVersion(); + } + } + } + } + } + + if (content_type == FileSys::ContentRecordType::Control && + title_type == FileSys::TitleType::Update) { + auto romfs = nca->GetRomFS(); + if (romfs) { + auto extracted = FileSys::ExtractRomFS(romfs); + if (extracted) { + auto nacp_file = extracted->GetFile("control.nacp"); + if (!nacp_file) { + nacp_file = extracted->GetFile("Control.nacp"); + } + if (nacp_file) { + FileSys::NACP nacp(nacp_file); + auto ver_str = nacp.GetVersionString(); + if (!ver_str.empty()) { + nsp_version_strings[title_id] = ver_str; + } + } + } + } + } + } + } + + for (const auto& [title_id, nca_map] : nsp->GetNCAs()) { + for (const auto& [type_pair, nca] : nca_map) { + const auto& [title_type, content_type] = type_pair; + + if (title_type == FileSys::TitleType::Update) { + u32 version = 0; + auto ver_it = nsp_versions.find(title_id); + if (ver_it != nsp_versions.end()) { + version = ver_it->second; + } + + std::string version_string; + auto str_it = nsp_version_strings.find(title_id); + if (str_it != nsp_version_strings.end()) { + version_string = str_it->second; + } + + m_manual_provider->AddEntryWithVersion( + title_type, content_type, title_id, version, version_string, + nca->GetBaseFile()); + + LOG_DEBUG(Frontend, "Added NSP update entry - TitleID: {:016X}, Version: {}, VersionStr: {}", + title_id, version, version_string); + } else { + // Use regular AddEntry for non-updates + m_manual_provider->AddEntry(title_type, content_type, title_id, + nca->GetBaseFile()); + LOG_DEBUG(Frontend, "Added NSP entry - TitleID: {:016X}, TitleType: {}, ContentType: {}", + title_id, static_cast(title_type), static_cast(content_type)); + } + } + } + return; + } + } + + // Handle XCI files + if (extension == "xci") { + FileSys::XCI xci{file}; + if (xci.GetStatus() == Loader::ResultStatus::Success) { + const auto nsp = xci.GetSecurePartitionNSP(); + if (nsp) { + for (const auto& title : nsp->GetNCAs()) { + for (const auto& entry : title.second) { + m_manual_provider->AddEntry(entry.first.first, entry.first.second, title.first, + entry.second->GetBaseFile()); + } + } + } + return; + } + } + auto loader = Loader::GetLoader(m_system, file); if (!loader) { return; @@ -228,17 +334,6 @@ void EmulationSession::ConfigureFilesystemProvider(const std::string& filepath) m_manual_provider->AddEntry(FileSys::TitleType::Application, FileSys::GetCRTypeFromNCAType(FileSys::NCA{file}.GetType()), program_id, file); - } else if (res2 == Loader::ResultStatus::Success && - (file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP)) { - const auto nsp = file_type == Loader::FileType::NSP - ? std::make_shared(file) - : FileSys::XCI{file}.GetSecurePartitionNSP(); - for (const auto& title : nsp->GetNCAs()) { - for (const auto& entry : title.second) { - m_manual_provider->AddEntry(entry.first.first, entry.first.second, title.first, - entry.second->GetBaseFile()); - } - } } } @@ -1333,7 +1428,8 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env Common::Android::ToJString(env, patch.name), Common::Android::ToJString(env, patch.version), static_cast(patch.type), Common::Android::ToJString(env, std::to_string(patch.program_id)), - Common::Android::ToJString(env, std::to_string(patch.title_id))); + Common::Android::ToJString(env, std::to_string(patch.title_id)), + static_cast(patch.numeric_version)); env->SetObjectArrayElement(jpatchArray, i, jpatch); ++i; } diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 81c0afc7ef..4536175e9d 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -583,4 +583,26 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setSdmcDir(JNIEnv* env, jobject Common::FS::SetEdenPath(Common::FS::EdenPath::SDMCDir, path); } +jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getExternalContentDirs(JNIEnv* env, + jobject obj) { + const auto& dirs = Settings::values.external_content_dirs; + jobjectArray jdirsArray = + env->NewObjectArray(dirs.size(), Common::Android::GetStringClass(), + Common::Android::ToJString(env, "")); + for (size_t i = 0; i < dirs.size(); ++i) { + env->SetObjectArrayElement(jdirsArray, i, Common::Android::ToJString(env, dirs[i])); + } + return jdirsArray; +} + +void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setExternalContentDirs(JNIEnv* env, jobject obj, + jobjectArray jdirs) { + Settings::values.external_content_dirs.clear(); + const int size = env->GetArrayLength(jdirs); + for (int i = 0; i < size; ++i) { + auto jdir = static_cast(env->GetObjectArrayElement(jdirs, i)); + Settings::values.external_content_dirs.push_back(Common::Android::GetJString(env, jdir)); + } +} + } // extern "C" diff --git a/src/android/app/src/main/res/layout/card_folder.xml b/src/android/app/src/main/res/layout/card_folder.xml index e3a5f1a867..517063e7ac 100644 --- a/src/android/app/src/main/res/layout/card_folder.xml +++ b/src/android/app/src/main/res/layout/card_folder.xml @@ -11,7 +11,7 @@ @@ -23,12 +23,25 @@ android:layout_gravity="center_vertical|start" android:requiresFadingEdge="horizontal" android:textAlignment="viewStart" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@+id/type_indicator" app:layout_constraintEnd_toStartOf="@+id/button_layout" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="@string/select_gpu_driver_default" /> + + + + External Content + Add Folder + diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index eb43f4e213..c7f5332a68 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -516,7 +516,7 @@ namespace Common::Android { s_patch_class = reinterpret_cast(env->NewGlobalRef(patch_class)); s_patch_constructor = env->GetMethodID( patch_class, "", - "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V"); + "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;J)V"); s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z"); s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;"); s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;"); diff --git a/src/common/settings.h b/src/common/settings.h index f29d041c17..41f766a5e7 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -715,6 +715,7 @@ struct Values { Category::DataStorage}; Setting gamecard_path{linkage, std::string(), "gamecard_path", Category::DataStorage}; + std::vector external_content_dirs; // Debugging bool record_frame_times; diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 657172fb4d..86c2076380 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -137,12 +137,127 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const { return exefs; const auto& disabled = Settings::values.disabled_addons[title_id]; - const auto update_disabled = - std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); + + bool update_disabled = true; + std::optional enabled_version; + bool checked_external = false; + bool checked_manual = false; + + const auto* content_union = dynamic_cast(&content_provider); + const auto update_tid = GetUpdateTitleID(title_id); + + if (content_union) { + // First, check ExternalContentProvider + const auto* external_provider = content_union->GetExternalProvider(); + if (external_provider) { + const auto update_versions = external_provider->ListUpdateVersions(update_tid); + + if (!update_versions.empty()) { + checked_external = true; + for (const auto& update_entry : update_versions) { + std::string disabled_key = fmt::format("Update@{}", update_entry.version); + if (std::find(disabled.cbegin(), disabled.cend(), disabled_key) == disabled.cend()) { + update_disabled = false; + enabled_version = update_entry.version; + break; + } + } + } + } + + // Also check ManualContentProvider (for Android) + if (!checked_external) { + const auto* manual_provider = dynamic_cast( + content_union->GetSlotProvider(ContentProviderUnionSlot::FrontendManual)); + if (manual_provider) { + const auto manual_update_versions = manual_provider->ListUpdateVersions(update_tid); + + if (!manual_update_versions.empty()) { + checked_manual = true; + for (const auto& update_entry : manual_update_versions) { + std::string disabled_key = fmt::format("Update@{}", update_entry.version); + if (std::find(disabled.cbegin(), disabled.cend(), disabled_key) == disabled.cend()) { + update_disabled = false; + enabled_version = update_entry.version; + break; + } + } + } + } + } + } + + // check for original NAND style + // Check NAND if: no external updates exist, OR all external updates are disabled + if (!checked_external && !checked_manual) { + // Only enable NAND update if it exists AND is not disabled + // We need to check if an update actually exists in the content provider + const bool has_nand_update = content_provider.HasEntry(update_tid, ContentRecordType::Program); + + if (has_nand_update) { + const bool nand_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (NAND)") != disabled.cend(); + const bool sdmc_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (SDMC)") != disabled.cend(); + const bool generic_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); + + if (!nand_disabled && !sdmc_disabled && !generic_disabled) { + update_disabled = false; + } + } + } else if (update_disabled && content_union) { + const bool nand_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (NAND)") != disabled.cend(); + const bool sdmc_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (SDMC)") != disabled.cend(); + + if (!nand_disabled || !sdmc_disabled) { + const auto nand_sdmc_entries = content_union->ListEntriesFilterOrigin( + std::nullopt, TitleType::Update, ContentRecordType::Program, update_tid); + + for (const auto& [slot, entry] : nand_sdmc_entries) { + if (slot == ContentProviderUnionSlot::UserNAND || + slot == ContentProviderUnionSlot::SysNAND) { + if (!nand_disabled) { + update_disabled = false; + break; + } + } else if (slot == ContentProviderUnionSlot::SDMC) { + if (!sdmc_disabled) { + update_disabled = false; + break; + } + } + } + } + } // Game Updates - const auto update_tid = GetUpdateTitleID(title_id); - const auto update = content_provider.GetEntry(update_tid, ContentRecordType::Program); + std::unique_ptr update = nullptr; + + // If we have a specific enabled version from external provider, use it + if (enabled_version.has_value() && content_union) { + const auto* external_provider = content_union->GetExternalProvider(); + if (external_provider) { + auto file = external_provider->GetEntryForVersion(update_tid, ContentRecordType::Program, *enabled_version); + if (file != nullptr) { + update = std::make_unique(file); + } + } + + // Also try ManualContentProvider + if (update == nullptr) { + const auto* manual_provider = dynamic_cast( + content_union->GetSlotProvider(ContentProviderUnionSlot::FrontendManual)); + if (manual_provider) { + auto file = manual_provider->GetEntryForVersion(update_tid, ContentRecordType::Program, *enabled_version); + if (file != nullptr) { + update = std::make_unique(file); + } + } + } + } + + // Fallback to regular content provider if no external update was loaded + if (update == nullptr && !update_disabled) { + update = content_provider.GetEntry(update_tid, ContentRecordType::Program); + } if (!update_disabled && update != nullptr && update->GetExeFS() != nullptr) { LOG_INFO(Loader, " ExeFS: Update ({}) applied successfully", @@ -447,21 +562,103 @@ VirtualFile PatchManager::PatchRomFS(const NCA* base_nca, VirtualFile base_romfs // Game Updates const auto update_tid = GetUpdateTitleID(title_id); - const auto update_raw = content_provider.GetEntryRaw(update_tid, type); - const auto& disabled = Settings::values.disabled_addons[title_id]; - const auto update_disabled = - std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); + + bool update_disabled = true; + std::optional enabled_version; + VirtualFile update_raw = nullptr; + bool checked_external = false; + bool checked_manual = false; + + const auto* content_union = dynamic_cast(&content_provider); + if (content_union) { + // First, check ExternalContentProvider + const auto* external_provider = content_union->GetExternalProvider(); + if (external_provider) { + const auto update_versions = external_provider->ListUpdateVersions(update_tid); + + if (!update_versions.empty()) { + checked_external = true; + for (const auto& update_entry : update_versions) { + std::string disabled_key = fmt::format("Update@{}", update_entry.version); + if (std::find(disabled.cbegin(), disabled.cend(), disabled_key) == disabled.cend()) { + update_disabled = false; + enabled_version = update_entry.version; + update_raw = external_provider->GetEntryForVersion(update_tid, type, update_entry.version); + break; + } + } + } + } + + if (!checked_external) { + const auto* manual_provider = dynamic_cast( + content_union->GetSlotProvider(ContentProviderUnionSlot::FrontendManual)); + if (manual_provider) { + const auto manual_update_versions = manual_provider->ListUpdateVersions(update_tid); + + if (!manual_update_versions.empty()) { + checked_manual = true; + for (const auto& update_entry : manual_update_versions) { + std::string disabled_key = fmt::format("Update@{}", update_entry.version); + if (std::find(disabled.cbegin(), disabled.cend(), disabled_key) == disabled.cend()) { + update_disabled = false; + enabled_version = update_entry.version; + update_raw = manual_provider->GetEntryForVersion(update_tid, type, update_entry.version); + break; + } + } + } + } + } + } + + if (!checked_external && !checked_manual) { + const bool nand_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (NAND)") != disabled.cend(); + const bool sdmc_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (SDMC)") != disabled.cend(); + const bool generic_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); + + if (!nand_disabled && !sdmc_disabled && !generic_disabled) { + update_disabled = false; + } + if (!update_disabled) { + update_raw = content_provider.GetEntryRaw(update_tid, type); + } + } else if (update_disabled && content_union) { + const bool nand_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (NAND)") != disabled.cend(); + const bool sdmc_disabled = std::find(disabled.cbegin(), disabled.cend(), "Update (SDMC)") != disabled.cend(); + + if (!nand_disabled || !sdmc_disabled) { + const auto nand_sdmc_entries = content_union->ListEntriesFilterOrigin( + std::nullopt, TitleType::Update, type, update_tid); + + for (const auto& [slot, entry] : nand_sdmc_entries) { + if (slot == ContentProviderUnionSlot::UserNAND || + slot == ContentProviderUnionSlot::SysNAND) { + if (!nand_disabled) { + update_disabled = false; + update_raw = content_provider.GetEntryRaw(update_tid, type); + break; + } + } else if (slot == ContentProviderUnionSlot::SDMC) { + if (!sdmc_disabled) { + update_disabled = false; + update_raw = content_provider.GetEntryRaw(update_tid, type); + break; + } + } + } + } + } if (!update_disabled && update_raw != nullptr && base_nca != nullptr) { const auto new_nca = std::make_shared(update_raw, base_nca); if (new_nca->GetStatus() == Loader::ResultStatus::Success && new_nca->GetRomFS() != nullptr) { LOG_INFO(Loader, " RomFS: Update ({}) applied successfully", + enabled_version.has_value() ? FormatTitleVersion(*enabled_version) : FormatTitleVersion(content_provider.GetEntryVersion(update_tid).value_or(0))); romfs = new_nca->GetRomFS(); - const auto version = - FormatTitleVersion(content_provider.GetEntryVersion(update_tid).value_or(0)); } } else if (!update_disabled && packed_update_raw != nullptr && base_nca != nullptr) { const auto new_nca = std::make_shared(packed_update_raw, base_nca); @@ -490,34 +687,179 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { // Game Updates const auto update_tid = GetUpdateTitleID(title_id); - PatchManager update{update_tid, fs_controller, content_provider}; - const auto metadata = update.GetControlMetadata(); - const auto& nacp = metadata.first; - const auto update_disabled = - std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); - Patch update_patch = {.enabled = !update_disabled, - .name = "Update", - .version = "", - .type = PatchType::Update, - .program_id = title_id, - .title_id = title_id}; + std::vector external_update_patches; + + const auto* content_union = dynamic_cast(&content_provider); + + if (content_union) { + // First, check ExternalContentProvider for updates + const auto* external_provider = content_union->GetExternalProvider(); + if (external_provider) { + const auto update_versions = external_provider->ListUpdateVersions(update_tid); + + for (const auto& update_entry : update_versions) { + std::string version_str = update_entry.version_string; + if (version_str.empty()) { + version_str = FormatTitleVersion(update_entry.version); + } + + std::string disabled_key = fmt::format("Update@{}", update_entry.version); + const auto update_disabled = + std::find(disabled.cbegin(), disabled.cend(), disabled_key) != disabled.cend(); + + Patch update_patch = {.enabled = !update_disabled, + .name = "Update", + .version = version_str, + .type = PatchType::Update, + .program_id = title_id, + .title_id = update_tid, + .source = PatchSource::External, + .numeric_version = update_entry.version}; + + external_update_patches.push_back(update_patch); + } + } + + const auto* manual_provider = dynamic_cast( + content_union->GetSlotProvider(ContentProviderUnionSlot::FrontendManual)); + if (manual_provider && external_update_patches.empty()) { + const auto manual_update_versions = manual_provider->ListUpdateVersions(update_tid); + + for (const auto& update_entry : manual_update_versions) { + std::string version_str = update_entry.version_string; + if (version_str.empty()) { + version_str = FormatTitleVersion(update_entry.version); + } + + std::string disabled_key = fmt::format("Update@{}", update_entry.version); + const auto update_disabled = + std::find(disabled.cbegin(), disabled.cend(), disabled_key) != disabled.cend(); + + + Patch update_patch = {.enabled = !update_disabled, + .name = "Update", + .version = version_str, + .type = PatchType::Update, + .program_id = title_id, + .title_id = update_tid, + .source = PatchSource::External, + .numeric_version = update_entry.version}; + + external_update_patches.push_back(update_patch); + } + } + + if (external_update_patches.size() > 1) { + bool found_enabled = false; + for (auto& patch : external_update_patches) { + if (patch.enabled) { + if (found_enabled) { + patch.enabled = false; + } else { + found_enabled = true; + } + } + } + } + + for (auto& patch : external_update_patches) { + out.push_back(std::move(patch)); + } + + const auto all_updates = content_union->ListEntriesFilterOrigin( + std::nullopt, std::nullopt, ContentRecordType::Program, update_tid); + + for (const auto& [slot, entry] : all_updates) { + if (slot == ContentProviderUnionSlot::External) { + continue; + } + + PatchSource source_type = PatchSource::Unknown; + std::string source_suffix; + + switch (slot) { + case ContentProviderUnionSlot::UserNAND: + case ContentProviderUnionSlot::SysNAND: + source_type = PatchSource::NAND; + source_suffix = " (NAND)"; + break; + case ContentProviderUnionSlot::SDMC: + source_type = PatchSource::NAND; + source_suffix = " (SDMC)"; + break; + default: + break; + } + + std::string version_str; + u32 numeric_ver = 0; + PatchManager update{update_tid, fs_controller, content_provider}; + const auto metadata = update.GetControlMetadata(); + const auto& nacp = metadata.first; + + if (nacp != nullptr) { + version_str = nacp->GetVersionString(); + } - if (nacp != nullptr) { - update_patch.version = nacp->GetVersionString(); - out.push_back(update_patch); - } else { - if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) { const auto meta_ver = content_provider.GetEntryVersion(update_tid); - if (meta_ver.value_or(0) == 0) { - out.push_back(update_patch); - } else { - update_patch.version = FormatTitleVersion(*meta_ver); + if (meta_ver.has_value()) { + numeric_ver = *meta_ver; + if (version_str.empty() && numeric_ver != 0) { + version_str = FormatTitleVersion(numeric_ver); + } + } + + std::string patch_name = "Update" + source_suffix; + + bool update_disabled = + std::find(disabled.cbegin(), disabled.cend(), patch_name) != disabled.cend(); + + Patch update_patch = {.enabled = !update_disabled, + .name = patch_name, + .version = version_str, + .type = PatchType::Update, + .program_id = title_id, + .title_id = update_tid, + .source = source_type, + .numeric_version = numeric_ver}; + + out.push_back(update_patch); + } + } else { + PatchManager update{update_tid, fs_controller, content_provider}; + const auto metadata = update.GetControlMetadata(); + const auto& nacp = metadata.first; + + bool update_disabled = + std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend(); + Patch update_patch = {.enabled = !update_disabled, + .name = "Update", + .version = "", + .type = PatchType::Update, + .program_id = title_id, + .title_id = title_id, + .source = PatchSource::Unknown, + .numeric_version = 0}; + + if (nacp != nullptr) { + update_patch.version = nacp->GetVersionString(); + out.push_back(update_patch); + } else { + if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) { + const auto meta_ver = content_provider.GetEntryVersion(update_tid); + if (meta_ver.value_or(0) == 0) { + out.push_back(update_patch); + } else { + update_patch.version = FormatTitleVersion(*meta_ver); + update_patch.numeric_version = *meta_ver; + out.push_back(update_patch); + } + } else if (update_raw != nullptr) { + update_patch.version = "PACKED"; + update_patch.source = PatchSource::Packed; out.push_back(update_patch); } - } else if (update_raw != nullptr) { - update_patch.version = "PACKED"; - out.push_back(update_patch); } } @@ -533,7 +875,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = "Cheats", .type = PatchType::Mod, .program_id = title_id, - .title_id = title_id + .title_id = title_id, + .source = PatchSource::Unknown }); } @@ -554,7 +897,7 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { } else if (std::find(EXEFS_FILE_NAMES.begin(), EXEFS_FILE_NAMES.end(), file->GetName()) != EXEFS_FILE_NAMES.end()) { layeredfs = true; - } + } } if (ips) @@ -579,7 +922,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = types, .type = PatchType::Mod, .program_id = title_id, - .title_id = title_id}); + .title_id = title_id, + .source = PatchSource::Unknown}); } } @@ -593,7 +937,7 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { if (IsDirValidAndNonEmpty(FindSubdirectoryCaseless(sdmc_mod_dir, "romfs")) || IsDirValidAndNonEmpty(FindSubdirectoryCaseless(sdmc_mod_dir, "romfslite"))) { AppendCommaIfNotEmpty(types, "LayeredFS"); - } + } if (!types.empty()) { const auto mod_disabled = @@ -603,21 +947,44 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = types, .type = PatchType::Mod, .program_id = title_id, - .title_id = title_id}); + .title_id = title_id, + .source = PatchSource::Unknown}); } } // DLC const auto dlc_entries = content_provider.ListEntriesFilter(TitleType::AOC, ContentRecordType::Data); + std::vector dlc_match; dlc_match.reserve(dlc_entries.size()); std::copy_if(dlc_entries.begin(), dlc_entries.end(), std::back_inserter(dlc_match), [this](const ContentProviderEntry& entry) { - return GetBaseTitleID(entry.title_id) == title_id && - content_provider.GetEntry(entry)->GetStatus() == - Loader::ResultStatus::Success; + const auto base_tid = GetBaseTitleID(entry.title_id); + const bool matches_base = base_tid == title_id; + + if (!matches_base) { + LOG_DEBUG(Loader, "DLC {:016X} base {:016X} doesn't match title {:016X}", + entry.title_id, base_tid, title_id); + return false; + } + + auto nca = content_provider.GetEntry(entry); + if (!nca) { + LOG_DEBUG(Loader, "Failed to get NCA for DLC {:016X}", entry.title_id); + return false; + } + + const auto status = nca->GetStatus(); + if (status != Loader::ResultStatus::Success) { + LOG_DEBUG(Loader, "DLC {:016X} NCA has status {}", + entry.title_id, static_cast(status)); + return false; + } + + return true; }); + if (!dlc_match.empty()) { // Ensure sorted so DLC IDs show in order. std::sort(dlc_match.begin(), dlc_match.end()); @@ -635,7 +1002,8 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { .version = std::move(list), .type = PatchType::DLC, .program_id = title_id, - .title_id = dlc_match.back().title_id}); + .title_id = dlc_match.back().title_id, + .source = PatchSource::Unknown}); } return out; diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 552c0fbe23..ecd2086984 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -28,6 +31,13 @@ class NACP; enum class PatchType { Update, DLC, Mod }; +enum class PatchSource { + Unknown, + NAND, + External, + Packed, +}; + struct Patch { bool enabled; std::string name; @@ -35,6 +45,8 @@ struct Patch { PatchType type; u64 program_id; u64 title_id; + PatchSource source; + u32 numeric_version{0}; }; // A centralized class to manage patches to games. diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index f750a2e871..42ec878436 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -13,12 +13,15 @@ #include "common/hex_util.h" #include "common/logging/log.h" #include "common/scope_exit.h" +#include "common/string_util.h" #include "core/crypto/key_manager.h" #include "core/file_sys/card_image.h" #include "core/file_sys/common_funcs.h" #include "core/file_sys/content_archive.h" +#include "core/file_sys/control_metadata.h" #include "core/file_sys/nca_metadata.h" #include "core/file_sys/registered_cache.h" +#include "core/file_sys/romfs.h" #include "core/file_sys/submission_package.h" #include "core/file_sys/vfs/vfs_concat.h" #include "core/loader/loader.h" @@ -974,6 +977,22 @@ std::optional ContentProviderUnion::GetSlotForEntry( return iter->first; } +const ExternalContentProvider* ContentProviderUnion::GetExternalProvider() const { + auto it = providers.find(ContentProviderUnionSlot::External); + if (it != providers.end() && it->second != nullptr) { + return dynamic_cast(it->second); + } + return nullptr; +} + +const ContentProvider* ContentProviderUnion::GetSlotProvider(ContentProviderUnionSlot slot) const { + auto it = providers.find(slot); + if (it != providers.end()) { + return it->second; + } + return nullptr; +} + ManualContentProvider::~ManualContentProvider() = default; void ManualContentProvider::AddEntry(TitleType title_type, ContentRecordType content_type, @@ -981,8 +1000,51 @@ void ManualContentProvider::AddEntry(TitleType title_type, ContentRecordType con entries.insert_or_assign({title_type, content_type, title_id}, file); } +void ManualContentProvider::AddEntryWithVersion(TitleType title_type, ContentRecordType content_type, + u64 title_id, u32 version, + const std::string& version_string, VirtualFile file) { + if (title_type == TitleType::Update) { + auto it = std::find_if(multi_version_entries.begin(), multi_version_entries.end(), + [title_id, version](const ExternalUpdateEntry& entry) { + return entry.title_id == title_id && entry.version == version; + }); + + if (it != multi_version_entries.end()) { + // Update existing entry + it->files[content_type] = file; + if (!version_string.empty()) { + it->version_string = version_string; + } + } else { + // Add new entry + ExternalUpdateEntry new_entry; + new_entry.title_id = title_id; + new_entry.version = version; + new_entry.version_string = version_string; + new_entry.files[content_type] = file; + multi_version_entries.push_back(new_entry); + } + + auto existing = entries.find({title_type, content_type, title_id}); + if (existing == entries.end()) { + entries.insert_or_assign({title_type, content_type, title_id}, file); + } else { + // Check if this version is higher + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id && entry.version > version) { + return; // Don't replace with lower version + } + } + entries.insert_or_assign({title_type, content_type, title_id}, file); + } + } else { + entries.insert_or_assign({title_type, content_type, title_id}, file); + } +} + void ManualContentProvider::ClearAllEntries() { entries.clear(); + multi_version_entries.clear(); } void ManualContentProvider::Refresh() {} @@ -1036,4 +1098,459 @@ std::vector ManualContentProvider::ListEntriesFilter( out.erase(std::unique(out.begin(), out.end()), out.end()); return out; } + +std::vector ManualContentProvider::ListUpdateVersions(u64 title_id) const { + std::vector out; + + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id) { + out.push_back(entry); + } + } + + std::sort(out.begin(), out.end(), [](const ExternalUpdateEntry& a, const ExternalUpdateEntry& b) { + return a.version > b.version; + }); + + return out; +} + +VirtualFile ManualContentProvider::GetEntryForVersion(u64 title_id, ContentRecordType type, u32 version) const { + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id && entry.version == version) { + auto it = entry.files.find(type); + if (it != entry.files.end()) { + return it->second; + } + } + } + return nullptr; +} + +bool ManualContentProvider::HasMultipleVersions(u64 title_id, ContentRecordType type) const { + int count = 0; + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id && entry.files.count(type) > 0) { + count++; + if (count > 1) { + return true; + } + } + } + return false; +} + +ExternalContentProvider::ExternalContentProvider(std::vector load_directories) + : load_dirs(std::move(load_directories)) { + ExternalContentProvider::Refresh(); +} + +ExternalContentProvider::~ExternalContentProvider() = default; + +void ExternalContentProvider::AddDirectory(VirtualDir directory) { + if (directory != nullptr) { + load_dirs.push_back(std::move(directory)); + ScanDirectory(load_dirs.back()); + } +} + +void ExternalContentProvider::ClearDirectories() { + load_dirs.clear(); + entries.clear(); + versions.clear(); + multi_version_entries.clear(); +} + +void ExternalContentProvider::Refresh() { + entries.clear(); + versions.clear(); + multi_version_entries.clear(); + for (const auto& dir : load_dirs) { + if (dir != nullptr) { + ScanDirectory(dir); + } + } +} + +void ExternalContentProvider::ScanDirectory(const VirtualDir& dir) { + if (dir == nullptr) { + return; + } + + for (const auto& file : dir->GetFiles()) { + const auto filename = file->GetName(); + const auto dot_pos = filename.find_last_of('.'); + + if (dot_pos == std::string::npos) { + continue; + } + + const auto extension = Common::ToLower(filename.substr(dot_pos + 1)); + + if (extension == "nsp") { + ProcessNSP(file); + } else if (extension == "xci") { + ProcessXCI(file); + } + } + + for (const auto& subdir : dir->GetSubdirectories()) { + ScanDirectory(subdir); + } +} + +void ExternalContentProvider::ProcessNSP(const VirtualFile& file) { + auto nsp = NSP(file); + if (nsp.GetStatus() != Loader::ResultStatus::Success) { + return; + } + + LOG_DEBUG(Service_FS, "Processing NSP file: {}", file->GetName()); + + const auto ncas = nsp.GetNCAs(); + + std::map nsp_versions; + std::map nsp_version_strings; // title_id -> NACP version string + + for (const auto& [title_id, nca_map] : ncas) { + for (const auto& [type_pair, nca] : nca_map) { + const auto& [title_type, content_type] = type_pair; + + if (content_type == ContentRecordType::Meta) { + const auto subdirs = nca->GetSubdirectories(); + if (!subdirs.empty()) { + const auto section0 = subdirs[0]; + const auto files = section0->GetFiles(); + for (const auto& inner_file : files) { + if (inner_file->GetExtension() == "cnmt") { + const CNMT cnmt(inner_file); + const auto cnmt_title_id = cnmt.GetTitleID(); + const auto version = cnmt.GetTitleVersion(); + nsp_versions[cnmt_title_id] = version; + versions[cnmt_title_id] = version; + break; + } + } + } + } + + if (content_type == ContentRecordType::Control && title_type == TitleType::Update) { + auto romfs = nca->GetRomFS(); + if (romfs) { + auto extracted = ExtractRomFS(romfs); + if (extracted) { + auto nacp_file = extracted->GetFile("control.nacp"); + if (!nacp_file) { + nacp_file = extracted->GetFile("Control.nacp"); + } + if (nacp_file) { + NACP nacp(nacp_file); + auto ver_str = nacp.GetVersionString(); + if (!ver_str.empty()) { + nsp_version_strings[title_id] = ver_str; + } + } + } + } + } + } + } + + std::map, std::map> version_files; + + for (const auto& [title_id, nca_map] : ncas) { + for (const auto& [type_pair, nca] : nca_map) { + const auto& [title_type, content_type] = type_pair; + + if (title_type != TitleType::AOC && title_type != TitleType::Update) { + continue; + } + + auto nca_file = nsp.GetNCAFile(title_id, content_type, title_type); + if (nca_file != nullptr) { + entries[{title_id, content_type, title_type}] = nca_file; + + if (title_type == TitleType::Update) { + u32 version = 0; + auto ver_it = nsp_versions.find(title_id); + if (ver_it != nsp_versions.end()) { + version = ver_it->second; + } + + version_files[{title_id, version}][content_type] = nca_file; + } + + LOG_DEBUG(Service_FS, "Added entry - Title ID: {:016X}, Type: {}, Content: {}", + title_id, static_cast(title_type), static_cast(content_type)); + } + } + } + + for (const auto& [key, files_map] : version_files) { + const auto& [title_id, version] = key; + + std::string ver_str; + auto str_it = nsp_version_strings.find(title_id); + if (str_it != nsp_version_strings.end()) { + ver_str = str_it->second; + } + + bool version_exists = false; + for (auto& existing : multi_version_entries) { + if (existing.title_id == title_id && existing.version == version) { + for (const auto& [content_type, _file] : files_map) { + existing.files[content_type] = _file; + } + if (existing.version_string.empty() && !ver_str.empty()) { + existing.version_string = ver_str; + } + version_exists = true; + break; + } + } + + if (!version_exists && !files_map.empty()) { + ExternalUpdateEntry update_entry{ + .title_id = title_id, + .version = version, + .version_string = ver_str, + .files = files_map + }; + multi_version_entries.push_back(update_entry); + LOG_DEBUG(Service_FS, "Added multi-version update - Title ID: {:016X}, Version: {}, VersionStr: {}, Content types: {}", + title_id, version, ver_str, files_map.size()); + } + } +} + +void ExternalContentProvider::ProcessXCI(const VirtualFile& file) { + auto xci = XCI(file); + if (xci.GetStatus() != Loader::ResultStatus::Success) { + return; + } + + auto nsp = xci.GetSecurePartitionNSP(); + if (nsp == nullptr) { + return; + } + + const auto ncas = nsp->GetNCAs(); + + std::map xci_versions; + std::map xci_version_strings; + + for (const auto& [title_id, nca_map] : ncas) { + for (const auto& [type_pair, nca] : nca_map) { + const auto& [title_type, content_type] = type_pair; + + if (content_type == ContentRecordType::Meta) { + const auto subdirs = nca->GetSubdirectories(); + if (!subdirs.empty()) { + const auto section0 = subdirs[0]; + const auto files = section0->GetFiles(); + for (const auto& inner_file : files) { + if (inner_file->GetExtension() == "cnmt") { + const CNMT cnmt(inner_file); + const auto cnmt_title_id = cnmt.GetTitleID(); + const auto version = cnmt.GetTitleVersion(); + xci_versions[cnmt_title_id] = version; + versions[cnmt_title_id] = version; + break; + } + } + } + } + + if (content_type == ContentRecordType::Control && title_type == TitleType::Update) { + auto romfs = nca->GetRomFS(); + if (romfs) { + auto extracted = ExtractRomFS(romfs); + if (extracted) { + auto nacp_file = extracted->GetFile("control.nacp"); + if (!nacp_file) { + nacp_file = extracted->GetFile("Control.nacp"); + } + if (nacp_file) { + NACP nacp(nacp_file); + auto ver_str = nacp.GetVersionString(); + if (!ver_str.empty()) { + xci_version_strings[title_id] = ver_str; + } + } + } + } + } + } + } + + std::map, std::map> version_files; + + for (const auto& [title_id, nca_map] : ncas) { + for (const auto& [type_pair, nca] : nca_map) { + const auto& [title_type, content_type] = type_pair; + + if (title_type != TitleType::AOC && title_type != TitleType::Update) { + continue; + } + + auto nca_file = nsp->GetNCAFile(title_id, content_type, title_type); + if (nca_file != nullptr) { + entries[{title_id, content_type, title_type}] = nca_file; + + if (title_type == TitleType::Update) { + u32 version = 0; + auto ver_it = xci_versions.find(title_id); + if (ver_it != xci_versions.end()) { + version = ver_it->second; + } + + version_files[{title_id, version}][content_type] = nca_file; + } + } + } + } + + for (const auto& [key, files_map] : version_files) { + const auto& [title_id, version] = key; + + std::string ver_str; + auto str_it = xci_version_strings.find(title_id); + if (str_it != xci_version_strings.end()) { + ver_str = str_it->second; + } + + bool version_exists = false; + for (auto& existing : multi_version_entries) { + if (existing.title_id == title_id && existing.version == version) { + for (const auto& [content_type, _file] : files_map) { + existing.files[content_type] = _file; + } + if (existing.version_string.empty() && !ver_str.empty()) { + existing.version_string = ver_str; + } + version_exists = true; + break; + } + } + + if (!version_exists && !files_map.empty()) { + ExternalUpdateEntry update_entry{ + .title_id = title_id, + .version = version, + .version_string = ver_str, + .files = files_map + }; + multi_version_entries.push_back(update_entry); + LOG_DEBUG(Service_FS, "Added multi-version update from XCI - Title ID: {:016X}, Version: {}, VersionStr: {}, Content types: {}", + title_id, version, ver_str, files_map.size()); + } + } +} + +bool ExternalContentProvider::HasEntry(u64 title_id, ContentRecordType type) const { + return GetEntryRaw(title_id, type) != nullptr; +} + +std::optional ExternalContentProvider::GetEntryVersion(u64 title_id) const { + const auto it = versions.find(title_id); + if (it != versions.end()) { + return it->second; + } + return std::nullopt; +} + +VirtualFile ExternalContentProvider::GetEntryUnparsed(u64 title_id, ContentRecordType type) const { + return GetEntryRaw(title_id, type); +} + +VirtualFile ExternalContentProvider::GetEntryRaw(u64 title_id, ContentRecordType type) const { + // Try to find in AOC (DLC) entries + { + const auto it = entries.find({title_id, type, TitleType::AOC}); + if (it != entries.end()) { + return it->second; + } + } + + // Try to find in Update entries + { + const auto it = entries.find({title_id, type, TitleType::Update}); + if (it != entries.end()) { + return it->second; + } + } + + return nullptr; +} + +std::unique_ptr ExternalContentProvider::GetEntry(u64 title_id, + ContentRecordType type) const { + const auto file = GetEntryRaw(title_id, type); + if (file == nullptr) { + return nullptr; + } + return std::make_unique(file); +} + +std::vector ExternalContentProvider::ListEntriesFilter( + std::optional title_type, std::optional record_type, + std::optional title_id) const { + std::vector out; + + for (const auto& [key, file] : entries) { + const auto& [e_title_id, e_content_type, e_title_type] = key; + + if ((title_type == std::nullopt || e_title_type == *title_type) && + (record_type == std::nullopt || e_content_type == *record_type) && + (title_id == std::nullopt || e_title_id == *title_id)) { + out.emplace_back(ContentProviderEntry{e_title_id, e_content_type}); + } + } + + std::sort(out.begin(), out.end()); + out.erase(std::unique(out.begin(), out.end()), out.end()); + return out; +} + +std::vector ExternalContentProvider::ListUpdateVersions(u64 title_id) const { + std::vector out; + + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id) { + out.push_back(entry); + } + } + + std::sort(out.begin(), out.end(), [](const ExternalUpdateEntry& a, const ExternalUpdateEntry& b) { + return a.version > b.version; + }); + + return out; +} + +VirtualFile ExternalContentProvider::GetEntryForVersion(u64 title_id, ContentRecordType type, u32 version) const { + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id && entry.version == version) { + auto it = entry.files.find(type); + if (it != entry.files.end()) { + return it->second; + } + } + } + return nullptr; +} + +bool ExternalContentProvider::HasMultipleVersions(u64 title_id, ContentRecordType type) const { + size_t count = 0; + for (const auto& entry : multi_version_entries) { + if (entry.title_id == title_id && entry.files.count(type) > 0) { + count++; + if (count > 1) { + return true; + } + } + } + return false; +} + } // namespace FileSys diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h index a7fc556737..04e231f453 100644 --- a/src/core/file_sys/registered_cache.h +++ b/src/core/file_sys/registered_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,7 +17,8 @@ #include "core/file_sys/vfs/vfs.h" namespace FileSys { -class CNMT; + class ExternalContentProvider; + class CNMT; class NCA; class NSP; class XCI; @@ -48,6 +52,13 @@ struct ContentProviderEntry { std::string DebugInfo() const; }; +struct ExternalUpdateEntry { + u64 title_id; + u32 version; + std::string version_string; + std::map files; +}; + constexpr u64 GetUpdateTitleID(u64 base_title_id) { return base_title_id | 0x800; } @@ -208,6 +219,7 @@ enum class ContentProviderUnionSlot { UserNAND, ///< User NAND SDMC, ///< SD Card FrontendManual, ///< Frontend-defined game list or similar + External, ///< External content from NSP/XCI files in configured directories }; // Combines multiple ContentProvider(s) (i.e. SysNAND, UserNAND, SDMC) into one interface. @@ -228,6 +240,9 @@ public: std::optional title_type, std::optional record_type, std::optional title_id) const override; + const ExternalContentProvider* GetExternalProvider() const; + const ContentProvider* GetSlotProvider(ContentProviderUnionSlot slot) const; + std::vector> ListEntriesFilterOrigin( std::optional origin = {}, std::optional title_type = {}, std::optional record_type = {}, @@ -246,6 +261,8 @@ public: void AddEntry(TitleType title_type, ContentRecordType content_type, u64 title_id, VirtualFile file); + void AddEntryWithVersion(TitleType title_type, ContentRecordType content_type, u64 title_id, + u32 version, const std::string& version_string, VirtualFile file); void ClearAllEntries(); void Refresh() override; @@ -258,8 +275,46 @@ public: std::optional title_type, std::optional record_type, std::optional title_id) const override; + std::vector ListUpdateVersions(u64 title_id) const; + VirtualFile GetEntryForVersion(u64 title_id, ContentRecordType type, u32 version) const; + bool HasMultipleVersions(u64 title_id, ContentRecordType type) const; + private: std::map, VirtualFile> entries; + std::vector multi_version_entries; +}; + +class ExternalContentProvider : public ContentProvider { +public: + explicit ExternalContentProvider(std::vector load_directories = {}); + ~ExternalContentProvider() override; + + void AddDirectory(VirtualDir directory); + void ClearDirectories(); + + void Refresh() override; + bool HasEntry(u64 title_id, ContentRecordType type) const override; + std::optional GetEntryVersion(u64 title_id) const override; + VirtualFile GetEntryUnparsed(u64 title_id, ContentRecordType type) const override; + VirtualFile GetEntryRaw(u64 title_id, ContentRecordType type) const override; + std::unique_ptr GetEntry(u64 title_id, ContentRecordType type) const override; + std::vector ListEntriesFilter( + std::optional title_type, std::optional record_type, + std::optional title_id) const override; + + std::vector ListUpdateVersions(u64 title_id) const; + VirtualFile GetEntryForVersion(u64 title_id, ContentRecordType type, u32 version) const; + bool HasMultipleVersions(u64 title_id, ContentRecordType type) const; + +private: + void ScanDirectory(const VirtualDir& dir); + void ProcessNSP(const VirtualFile& file); + void ProcessXCI(const VirtualFile& file); + + std::vector load_dirs; + std::map, VirtualFile> entries; + std::map versions; + std::vector multi_version_entries; }; } // namespace FileSys diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index 68e8ec22fc..56286405e2 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -275,6 +278,14 @@ void NSP::ReadNCAs(const std::vector& files) { ncas[next_nca->GetTitleId()][{cnmt.GetType(), rec.type}] = std::move(next_nca); } else { + // fix for Bayonetta Origins in Bayonetta 3 and external content + // where multiple update NCAs exist for the same title and type. + auto& target_map = ncas[cnmt.GetTitleID()]; + auto existing = target_map.find({cnmt.GetType(), rec.type}); + + if (existing != target_map.end() && rec.type == ContentRecordType::Program) { + continue; + } ncas[cnmt.GetTitleID()][{cnmt.GetType(), rec.type}] = std::move(next_nca); } } else { diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 95a32c1250..2031052409 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -9,6 +9,7 @@ #include "common/assert.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" +#include "common/logging/log.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/bis_factory.h" @@ -507,6 +508,10 @@ FileSys::RegisteredCache* FileSystemController::GetSDMCContents() const { return sdmc_factory->GetSDMCContents(); } +FileSys::ExternalContentProvider* FileSystemController::GetExternalContentProvider() const { + return external_provider.get(); +} + FileSys::PlaceholderCache* FileSystemController::GetSystemNANDPlaceholder() const { LOG_TRACE(Service_FS, "Opening System NAND Placeholder"); @@ -684,6 +689,7 @@ void FileSystemController::CreateFactories(FileSys::VfsFilesystem& vfs, bool ove if (overwrite) { bis_factory = nullptr; sdmc_factory = nullptr; + external_provider = nullptr; } using EdenPath = Common::FS::EdenPath; @@ -716,6 +722,36 @@ void FileSystemController::CreateFactories(FileSys::VfsFilesystem& vfs, bool ove system.RegisterContentProvider(FileSys::ContentProviderUnionSlot::SDMC, sdmc_factory->GetSDMCContents()); } + + if (external_provider == nullptr) { + std::vector external_dirs; + + LOG_DEBUG(Service_FS, "Initializing ExternalContentProvider with {} configured directories", + Settings::values.external_content_dirs.size()); + + for (const auto& dir_path : Settings::values.external_content_dirs) { + if (!dir_path.empty()) { + LOG_DEBUG(Service_FS, "Attempting to open directory: {}", dir_path); + auto dir = vfs.OpenDirectory(dir_path, FileSys::OpenMode::Read); + if (dir != nullptr) { + external_dirs.push_back(std::move(dir)); + LOG_DEBUG(Service_FS, "Successfully opened directory: {}", dir_path); + } else { + LOG_ERROR(Service_FS, "Failed to open directory: {}", dir_path); + } + } + } + + LOG_DEBUG(Service_FS, "Creating ExternalContentProvider with {} opened directories", + external_dirs.size()); + + external_provider = std::make_unique( + std::move(external_dirs)); + system.RegisterContentProvider(FileSys::ContentProviderUnionSlot::External, + external_provider.get()); + + LOG_DEBUG(Service_FS, "ExternalContentProvider registered to content provider union"); + } } void FileSystemController::Reset() { diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h index 718500385b..ef45aec627 100644 --- a/src/core/hle/service/filesystem/filesystem.h +++ b/src/core/hle/service/filesystem/filesystem.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,6 +20,7 @@ class System; namespace FileSys { class BISFactory; +class ExternalContentProvider; class NCA; class RegisteredCache; class RegisteredCacheUnion; @@ -117,6 +121,8 @@ public: FileSys::VirtualDir GetBCATDirectory(u64 title_id) const; + FileSys::ExternalContentProvider* GetExternalContentProvider() const; + // Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function // above is called. void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true); @@ -138,6 +144,8 @@ private: std::unique_ptr sdmc_factory; std::unique_ptr bis_factory; + std::unique_ptr external_provider; + std::unique_ptr gamecard; std::unique_ptr gamecard_registered; std::unique_ptr gamecard_placeholder; diff --git a/src/qt_common/config/qt_config.cpp b/src/qt_common/config/qt_config.cpp index 65bf488c5c..c5a8f62745 100644 --- a/src/qt_common/config/qt_config.cpp +++ b/src/qt_common/config/qt_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project @@ -231,6 +231,16 @@ void QtConfig::ReadPathValues() { QString::fromStdString(ReadStringSetting(std::string("recentFiles"))) .split(QStringLiteral(", "), Qt::SkipEmptyParts, Qt::CaseSensitive); + const int external_dirs_size = BeginArray(std::string("external_content_dirs")); + for (int i = 0; i < external_dirs_size; ++i) { + SetArrayIndex(i); + std::string dir_path = ReadStringSetting(std::string("path")); + if (!dir_path.empty()) { + Settings::values.external_content_dirs.push_back(dir_path); + } + } + EndArray(); + ReadCategory(Settings::Category::Paths); EndGroup(); @@ -446,6 +456,13 @@ void QtConfig::SavePathValues() { WriteStringSetting(std::string("recentFiles"), UISettings::values.recent_files.join(QStringLiteral(", ")).toStdString()); + BeginArray(std::string("external_content_dirs")); + for (int i = 0; i < static_cast(Settings::values.external_content_dirs.size()); ++i) { + SetArrayIndex(i); + WriteStringSetting(std::string("path"), Settings::values.external_content_dirs[i]); + } + EndArray(); + EndGroup(); } diff --git a/src/qt_common/util/game.cpp b/src/qt_common/util/game.cpp index e34a388993..91f43579f3 100644 --- a/src/qt_common/util/game.cpp +++ b/src/qt_common/util/game.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "qt_common/util/game.h" @@ -373,27 +373,23 @@ void RemoveCacheStorage(u64 program_id) } // Metadata // -void ResetMetadata(bool show_message) -{ +void ResetMetadata(bool show_message) { const QString title = tr("Reset Metadata Cache"); - if (!Common::FS::Exists(Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) - / "game_list/")) { + if (!Common::FS::Exists(Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) / + "game_list/")) { if (show_message) - QtCommon::Frontend::Warning(rootObject, - title, + QtCommon::Frontend::Warning(rootObject, title, tr("The metadata cache is already empty.")); } else if (Common::FS::RemoveDirRecursively( Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir) / "game_list")) { if (show_message) - QtCommon::Frontend::Information(rootObject, - title, + QtCommon::Frontend::Information(rootObject, title, tr("The operation completed successfully.")); UISettings::values.is_game_list_reload_pending.exchange(true); } else { if (show_message) QtCommon::Frontend::Warning( - title, tr("The metadata cache couldn't be deleted. It might be in use or non-existent.")); } diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index c247c53493..1107c77e8c 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -99,6 +99,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, } }); connect(ui_tab.get(), &ConfigureUi::LanguageChanged, this, &ConfigureDialog::OnLanguageChanged); + connect(general_tab.get(), &ConfigureGeneral::ExternalContentDirsChanged, this, + &ConfigureDialog::ExternalContentDirsChanged); connect(ui->selectorList, &QListWidget::itemSelectionChanged, this, &ConfigureDialog::UpdateVisibleTabs); diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index 4f9cf79645..9d79e6f0ac 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -62,6 +62,7 @@ private slots: signals: void LanguageChanged(const QString& locale); + void ExternalContentDirsChanged(); private: void changeEvent(QEvent* event) override; diff --git a/src/yuzu/configuration/configure_filesystem.cpp b/src/yuzu/configuration/configure_filesystem.cpp index 545032eee3..f0310a30bd 100644 --- a/src/yuzu/configuration/configure_filesystem.cpp +++ b/src/yuzu/configuration/configure_filesystem.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -38,9 +38,9 @@ ConfigureFilesystem::ConfigureFilesystem(QWidget* parent) connect(ui->reset_game_list_cache, &QPushButton::pressed, this, &ConfigureFilesystem::ResetMetadata); - connect(ui->gamecard_inserted, &QCheckBox::STATE_CHANGED, this, + connect(ui->gamecard_inserted, &QCheckBox::stateChanged, this, &ConfigureFilesystem::UpdateEnabledControls); - connect(ui->gamecard_current_game, &QCheckBox::STATE_CHANGED, this, + connect(ui->gamecard_current_game, &QCheckBox::stateChanged, this, &ConfigureFilesystem::UpdateEnabledControls); } @@ -278,6 +278,7 @@ void ConfigureFilesystem::UpdateEnabledControls() { !ui->gamecard_current_game->isChecked()); } + void ConfigureFilesystem::RetranslateUI() { ui->retranslateUi(this); } diff --git a/src/yuzu/configuration/configure_filesystem.h b/src/yuzu/configuration/configure_filesystem.h index d8c26a783a..995e636544 100644 --- a/src/yuzu/configuration/configure_filesystem.h +++ b/src/yuzu/configuration/configure_filesystem.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index b2fe566a17..f628abeab3 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include #include #include "common/settings.h" #include "core/core.h" @@ -29,6 +32,15 @@ ConfigureGeneral::ConfigureGeneral(const Core::System& system_, connect(ui->button_reset_defaults, &QPushButton::clicked, this, &ConfigureGeneral::ResetDefaults); + connect(ui->add_external_dir_button, &QPushButton::pressed, this, + &ConfigureGeneral::AddExternalContentDirectory); + connect(ui->remove_external_dir_button, &QPushButton::pressed, this, + &ConfigureGeneral::RemoveSelectedExternalContentDirectory); + connect(ui->external_content_list, &QListWidget::itemSelectionChanged, this, [this] { + ui->remove_external_dir_button->setEnabled( + !ui->external_content_list->selectedItems().isEmpty()); + }); + if (!Settings::IsConfiguringGlobal()) { ui->button_reset_defaults->setVisible(false); } @@ -36,7 +48,9 @@ ConfigureGeneral::ConfigureGeneral(const Core::System& system_, ConfigureGeneral::~ConfigureGeneral() = default; -void ConfigureGeneral::SetConfiguration() {} +void ConfigureGeneral::SetConfiguration() { + UpdateExternalContentList(); +} void ConfigureGeneral::Setup(const ConfigurationShared::Builder& builder) { QLayout& general_layout = *ui->general_widget->layout(); @@ -101,6 +115,55 @@ void ConfigureGeneral::ApplyConfiguration() { for (const auto& func : apply_funcs) { func(powered_on); } + + std::vector new_dirs; + new_dirs.reserve(ui->external_content_list->count()); + for (int i = 0; i < ui->external_content_list->count(); ++i) { + new_dirs.push_back(ui->external_content_list->item(i)->text().toStdString()); + } + + if (new_dirs != Settings::values.external_content_dirs) { + Settings::values.external_content_dirs = std::move(new_dirs); + emit ExternalContentDirsChanged(); + } +} + +void ConfigureGeneral::UpdateExternalContentList() { + ui->external_content_list->clear(); + for (const auto& dir : Settings::values.external_content_dirs) { + ui->external_content_list->addItem(QString::fromStdString(dir)); + } +} + +void ConfigureGeneral::AddExternalContentDirectory() { + const QString dir_path = QFileDialog::getExistingDirectory( + this, tr("Select External Content Directory..."), QString()); + + if (dir_path.isEmpty()) { + return; + } + + QString normalized_path = QDir::toNativeSeparators(dir_path); + if (normalized_path.back() != QDir::separator()) { + normalized_path.append(QDir::separator()); + } + + for (int i = 0; i < ui->external_content_list->count(); ++i) { + if (ui->external_content_list->item(i)->text() == normalized_path) { + QMessageBox::information(this, tr("Directory Already Added"), + tr("This directory is already in the list.")); + return; + } + } + + ui->external_content_list->addItem(normalized_path); +} + +void ConfigureGeneral::RemoveSelectedExternalContentDirectory() { + auto selected = ui->external_content_list->selectedItems(); + if (!selected.isEmpty()) { + qDeleteAll(ui->external_content_list->selectedItems()); + } } void ConfigureGeneral::changeEvent(QEvent* event) { diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h index ada6526a6a..983fd50f10 100644 --- a/src/yuzu/configuration/configure_general.h +++ b/src/yuzu/configuration/configure_general.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -39,12 +42,19 @@ public: void ApplyConfiguration() override; void SetConfiguration() override; +signals: + void ExternalContentDirsChanged(); + private: void Setup(const ConfigurationShared::Builder& builder); void changeEvent(QEvent* event) override; void RetranslateUI(); + void UpdateExternalContentList(); + void AddExternalContentDirectory(); + void RemoveSelectedExternalContentDirectory(); + std::function reset_callback; std::unique_ptr ui; diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui index a10e7d3a50..78b6081d92 100644 --- a/src/yuzu/configuration/configure_general.ui +++ b/src/yuzu/configuration/configure_general.ui @@ -46,6 +46,66 @@ + + + + External Content + + + + + + Add directories to scan for DLCs and Updates without installing to NAND + + + true + + + + + + + QAbstractItemView::SingleSelection + + + + + + + + + Add Directory + + + + + + + Remove Selected + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index 3032e4c3d9..ecafa6826a 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -8,6 +8,8 @@ #include #include +#include + #include #include #include @@ -16,6 +18,7 @@ #include #include +#include "common/common_types.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "configuration/addon/mod_select_dialog.h" @@ -68,6 +71,8 @@ ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* p ui->scrollArea->setEnabled(!system.IsPoweredOn()); + connect(item_model, &QStandardItemModel::itemChanged, this, + &ConfigurePerGameAddons::OnItemChanged); connect(item_model, &QStandardItemModel::itemChanged, [] { UISettings::values.is_game_list_reload_pending.exchange(true); }); @@ -77,13 +82,37 @@ ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* p ConfigurePerGameAddons::~ConfigurePerGameAddons() = default; +void ConfigurePerGameAddons::OnItemChanged(QStandardItem* item) { + if (update_items.size() > 1 && item->checkState() == Qt::Checked) { + auto it = std::find(update_items.begin(), update_items.end(), item); + if (it != update_items.end()) { + for (auto* update_item : update_items) { + if (update_item != item && update_item->checkState() == Qt::Checked) { + disconnect(item_model, &QStandardItemModel::itemChanged, this, + &ConfigurePerGameAddons::OnItemChanged); + update_item->setCheckState(Qt::Unchecked); + connect(item_model, &QStandardItemModel::itemChanged, this, + &ConfigurePerGameAddons::OnItemChanged); + } + } + } + } +} + void ConfigurePerGameAddons::ApplyConfiguration() { std::vector disabled_addons; for (const auto& item : list_items) { const auto disabled = item.front()->checkState() == Qt::Unchecked; - if (disabled) - disabled_addons.push_back(item.front()->text().toStdString()); + if (disabled) { + QVariant userData = item.front()->data(Qt::UserRole); + if (userData.isValid() && userData.canConvert() && item.front()->text() == QStringLiteral("Update")) { + quint32 numeric_version = userData.toUInt(); + disabled_addons.push_back(fmt::format("Update@{}", numeric_version)); + } else { + disabled_addons.push_back(item.front()->text().toStdString()); + } + } } auto current = Settings::values.disabled_addons[title_id]; @@ -194,17 +223,51 @@ void ConfigurePerGameAddons::LoadConfiguration() { const auto& disabled = Settings::values.disabled_addons[title_id]; - for (const auto& patch : pm.GetPatches(update_raw)) { + update_items.clear(); + list_items.clear(); + item_model->removeRows(0, item_model->rowCount()); + + std::vector patches = pm.GetPatches(update_raw); + + bool has_enabled_update = false; + + for (const auto& patch : patches) { const auto name = QString::fromStdString(patch.name); auto* const first_item = new QStandardItem; first_item->setText(name); first_item->setCheckable(true); - const auto patch_disabled = - std::find(disabled.begin(), disabled.end(), name.toStdString()) != disabled.end(); + const bool is_external_update = patch.type == FileSys::PatchType::Update && + patch.source == FileSys::PatchSource::External && + patch.numeric_version != 0; - first_item->setCheckState(patch_disabled ? Qt::Unchecked : Qt::Checked); + if (is_external_update) { + first_item->setData(static_cast(patch.numeric_version), Qt::UserRole); + } + + bool patch_disabled = false; + if (is_external_update) { + std::string disabled_key = fmt::format("Update@{}", patch.numeric_version); + patch_disabled = std::find(disabled.begin(), disabled.end(), disabled_key) != disabled.end(); + } else { + patch_disabled = std::find(disabled.begin(), disabled.end(), name.toStdString()) != disabled.end(); + } + + bool should_enable = !patch_disabled; + + if (patch.type == FileSys::PatchType::Update) { + if (should_enable) { + if (has_enabled_update) { + should_enable = false; + } else { + has_enabled_update = true; + } + } + update_items.push_back(first_item); + } + + first_item->setCheckState(should_enable ? Qt::Checked : Qt::Unchecked); list_items.push_back(QList{ first_item, new QStandardItem{QString::fromStdString(patch.version)}}); diff --git a/src/yuzu/configuration/configure_per_game_addons.h b/src/yuzu/configuration/configure_per_game_addons.h index 8b698b5bec..3c7c0b0ff0 100644 --- a/src/yuzu/configuration/configure_per_game_addons.h +++ b/src/yuzu/configuration/configure_per_game_addons.h @@ -54,6 +54,7 @@ private: void RetranslateUI(); void LoadConfiguration(); + void OnItemChanged(QStandardItem* item); std::unique_ptr ui; FileSys::VirtualFile file; @@ -64,6 +65,7 @@ private: QStandardItemModel* item_model; std::vector> list_items; + std::vector update_items; Core::System& system; }; diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 9848c564d0..d206ab096b 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -16,11 +16,13 @@ #include #include #include +#include #include #include #include #include "common/common_types.h" #include "common/logging/log.h" +#include "common/settings.h" #include "core/core.h" #include "core/file_sys/patch_manager.h" #include "core/file_sys/registered_cache.h" @@ -32,6 +34,7 @@ #include "yuzu/game_list_worker.h" #include "yuzu/main_window.h" #include "yuzu/util/controller_navigation.h" +#include "qt_common/qt_common.h" GameListSearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist_, QObject* parent) : QObject(parent), gamelist{gamelist_} {} @@ -325,6 +328,10 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid watcher = new QFileSystemWatcher(this); connect(watcher, &QFileSystemWatcher::directoryChanged, this, &GameList::RefreshGameDirectory); + external_watcher = new QFileSystemWatcher(this); + ResetExternalWatcher(); + connect(external_watcher, &QFileSystemWatcher::directoryChanged, this, &GameList::RefreshExternalContent); + this->main_window = parent; layout = new QVBoxLayout; tree_view = new QTreeView; @@ -919,12 +926,38 @@ const QStringList GameList::supported_file_extensions = { void GameList::RefreshGameDirectory() { + // Reset the externals watcher whenever the game list is reloaded, + // primarily ensures that new titles and external dirs are caught. + ResetExternalWatcher(); + if (!UISettings::values.game_dirs.empty() && current_worker != nullptr) { LOG_INFO(Frontend, "Change detected in the games directory. Reloading game list."); + QtCommon::system->GetFileSystemController().CreateFactories(*QtCommon::vfs); PopulateAsync(UISettings::values.game_dirs); } } +void GameList::RefreshExternalContent() { + // TODO: Explore the possibility of only resetting the metadata cache for that specific game. + if (!UISettings::values.game_dirs.empty() && current_worker != nullptr) { + LOG_INFO(Frontend, "External content directory changed. Clearing metadata cache."); + QtCommon::Game::ResetMetadata(false); + QtCommon::system->GetFileSystemController().CreateFactories(*QtCommon::vfs); + PopulateAsync(UISettings::values.game_dirs); + } +} + +void GameList::ResetExternalWatcher() { + auto watch_dirs = external_watcher->directories(); + if (!watch_dirs.isEmpty()) { + external_watcher->removePaths(watch_dirs); + } + + for (const std::string &dir : Settings::values.external_content_dirs) { + external_watcher->addPath(QString::fromStdString(dir)); + } +} + void GameList::ToggleFavorite(u64 program_id) { if (!UISettings::values.favorited_ids.contains(program_id)) { tree_view->setRowHidden(0, item_model->invisibleRootItem()->index(), diff --git a/src/yuzu/game_list.h b/src/yuzu/game_list.h index 293a46a4f2..9b00e270cd 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game_list.h @@ -94,6 +94,8 @@ public: public slots: void RefreshGameDirectory(); + void RefreshExternalContent(); + void ResetExternalWatcher(); signals: void BootGame(const QString& game_path, StartGameType type); @@ -160,6 +162,7 @@ private: QStandardItemModel* item_model = nullptr; std::unique_ptr current_worker; QFileSystemWatcher* watcher = nullptr; + QFileSystemWatcher* external_watcher = nullptr; ControllerNavigation* controller_navigation = nullptr; CompatibilityList compatibility_list; diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 8adcdb4cbe..e44696b6a3 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -3388,6 +3388,8 @@ void MainWindow::OnConfigure() { !multiplayer_state->IsHostingPublicRoom()); connect(&configure_dialog, &ConfigureDialog::LanguageChanged, this, &MainWindow::OnLanguageChanged); + connect(&configure_dialog, &ConfigureDialog::ExternalContentDirsChanged, this, + &MainWindow::OnGameListRefresh); const auto result = configure_dialog.exec(); if (result != QDialog::Accepted && !UISettings::values.configuration_applied && @@ -3907,8 +3909,7 @@ void MainWindow::OnToggleStatusBar() { statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked()); } -void MainWindow::OnGameListRefresh() -{ +void MainWindow::OnGameListRefresh() { // Resets metadata cache and reloads QtCommon::Game::ResetMetadata(false); game_list->RefreshGameDirectory(); From b9e052b3a7b9d3f265c16e9c5dacb68473b2bd4c Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 6 Feb 2026 19:51:01 +0100 Subject: [PATCH 020/170] [desktop] Basic grid view implementation (#3479) Closes #3441 Basic impl of a grid view on the game list. The ideal solution here would be to use QSortFilterProxyModel and abstract the game list model out to a QStandardItemModel, but that is too much effort for me rn. Adapted the "card" design from QML, can 1000% be improved but QPainter is just such a pain to deal with. Implanting a Qt Quick scene into there would legitimately be easier. Anyways, margins and text sizes lgtm at all sizes, though please give feedback on both that and the general card design. Future TODOs: - [ ] Auto size mode - [ ] Refactor to use models Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3479 --- src/common/settings_enums.h | 1 + src/qt_common/config/shared_translation.cpp | 6 + src/qt_common/config/uisettings.h | 4 +- src/yuzu/CMakeLists.txt | 15 +- src/yuzu/game/game_card.cpp | 104 +++++++ src/yuzu/game/game_card.h | 27 ++ src/yuzu/{ => game}/game_list.cpp | 326 +++++++++++++++----- src/yuzu/{ => game}/game_list.h | 17 + src/yuzu/{ => game}/game_list_p.h | 49 ++- src/yuzu/{ => game}/game_list_worker.cpp | 13 +- src/yuzu/{ => game}/game_list_worker.h | 2 +- src/yuzu/main.ui | 24 ++ src/yuzu/main_window.cpp | 25 +- src/yuzu/main_window.h | 6 + src/yuzu/multiplayer/chat_room.cpp | 4 +- src/yuzu/multiplayer/client_room.cpp | 4 +- src/yuzu/multiplayer/host_room.cpp | 4 +- src/yuzu/multiplayer/lobby.cpp | 4 +- src/yuzu/multiplayer/state.cpp | 4 +- 19 files changed, 517 insertions(+), 122 deletions(-) create mode 100644 src/yuzu/game/game_card.cpp create mode 100644 src/yuzu/game/game_card.h rename src/yuzu/{ => game}/game_list.cpp (82%) rename src/yuzu/{ => game}/game_list.h (95%) rename src/yuzu/{ => game}/game_list_p.h (92%) rename src/yuzu/{ => game}/game_list_worker.cpp (98%) rename src/yuzu/{ => game}/game_list_worker.h (97%) diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 30d075565b..33c553dc3c 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -155,6 +155,7 @@ ENUM(GpuUnswizzleChunk, VeryLow, Low, Normal, Medium, High) ENUM(TemperatureUnits, Celsius, Fahrenheit) ENUM(ExtendedDynamicState, Disabled, EDS1, EDS2, EDS3); ENUM(GpuLogLevel, Off, Errors, Standard, Verbose, All) +ENUM(GameListMode, TreeView, GridView); template inline std::string_view CanonicalizeEnum(Type id) { diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 0d15f9065c..5d4185b47d 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -766,6 +766,12 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) PAIR(ExtendedDynamicState, EDS3, tr("ExtendedDynamicState 3")), }}); + translations->insert({Settings::EnumMetadata::Index(), + { + PAIR(GameListMode, TreeView, tr("Tree View")), + PAIR(GameListMode, GridView, tr("Grid View")), + }}); + #undef PAIR #undef CTX_PAIR diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h index 679d00782d..89e3833508 100644 --- a/src/qt_common/config/uisettings.h +++ b/src/qt_common/config/uisettings.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -210,6 +210,8 @@ struct Values { Setting folder_icon_size{linkage, 48, "folder_icon_size", Category::UiGameList}; Setting row_1_text_id{linkage, 3, "row_1_text_id", Category::UiGameList}; Setting row_2_text_id{linkage, 2, "row_2_text_id", Category::UiGameList}; + Setting game_list_mode{linkage, Settings::GameListMode::TreeView, "game_list_mode", Category::UiGameList}; + std::atomic_bool is_game_list_reload_pending{false}; Setting cache_game_list{linkage, true, "cache_game_list", Category::UiGameList}; Setting favorites_expanded{linkage, true, "favorites_expanded", Category::UiGameList}; diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index ba2b5b3927..dad32f2316 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -156,11 +156,14 @@ add_executable(yuzu debugger/controller.cpp debugger/controller.h - game_list.cpp - game_list.h - game_list_p.h - game_list_worker.cpp - game_list_worker.h + game/game_list.cpp + game/game_list.h + game/game_list_p.h + game/game_list_worker.cpp + game/game_list_worker.h + game/game_card.h + game/game_card.cpp + hotkeys.cpp hotkeys.h install_dialog.cpp @@ -234,7 +237,7 @@ add_executable(yuzu data_dialog.h data_dialog.cpp data_dialog.ui data_widget.ui ryujinx_dialog.h ryujinx_dialog.cpp ryujinx_dialog.ui - main_window.h main_window.cpp + main_window.h main_window.cpp main.ui configuration/system/new_user_dialog.h configuration/system/new_user_dialog.cpp configuration/system/new_user_dialog.ui configuration/system/profile_avatar_dialog.h configuration/system/profile_avatar_dialog.cpp diff --git a/src/yuzu/game/game_card.cpp b/src/yuzu/game/game_card.cpp new file mode 100644 index 0000000000..d172d3e535 --- /dev/null +++ b/src/yuzu/game/game_card.cpp @@ -0,0 +1,104 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include "game_card.h" +#include "qt_common/config/uisettings.h" + +GameCard::GameCard(QObject* parent) : QStyledItemDelegate{parent} { + setObjectName("GameCard"); +} + +void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const { + if (!index.isValid()) + return; + + painter->save(); + painter->setRenderHint(QPainter::Antialiasing); + + // padding + QRect cardRect = option.rect.adjusted(4, 4, -4, -4); + + // colors + QPalette palette = option.palette; + QColor backgroundColor = palette.window().color(); + QColor borderColor = palette.dark().color(); + QColor textColor = palette.text().color(); + + // if it's selected add a blue background + if (option.state & QStyle::State_Selected) { + backgroundColor = palette.highlight().color(); + borderColor = palette.highlight().color().lighter(150); + textColor = palette.highlightedText().color(); + } else if (option.state & QStyle::State_MouseOver) { + backgroundColor = backgroundColor.lighter(110); + } + + // bg + painter->setBrush(backgroundColor); + painter->setPen(QPen(borderColor, 1)); + painter->drawRoundedRect(cardRect, 10, 10); + + static constexpr const int padding = 10; + + // icon + int _iconsize = UISettings::values.game_icon_size.GetValue(); + QSize iconSize(_iconsize, _iconsize); + QPixmap iconPixmap = index.data(Qt::DecorationRole).value(); + + QRect iconRect; + if (!iconPixmap.isNull()) { + QSize scaledSize = iconPixmap.size(); + scaledSize.scale(iconSize, Qt::KeepAspectRatio); + + int x = cardRect.left() + (cardRect.width() - scaledSize.width()) / 2; + int y = cardRect.top() + padding; + + iconRect = QRect(x, y, scaledSize.width(), scaledSize.height()); + + painter->setRenderHint(QPainter::SmoothPixmapTransform, true); + painter->drawPixmap(iconRect, iconPixmap); + } else { + // if there is no icon just draw a blank rect + iconRect = QRect(cardRect.left() + padding, + cardRect.top() + padding, + _iconsize, _iconsize); + } + + // if "none" is selected, pretend there's a + _iconsize = _iconsize ? _iconsize : 96; + + // padding + text + QRect textRect = cardRect; + textRect.setTop(iconRect.bottom() + 8); + textRect.adjust(padding, 0, -padding, -padding); + + // We are already crammed on space, ignore the row 2 + QString title = index.data(Qt::DisplayRole).toString(); + title = title.split(QLatin1Char('\n')).first(); + + // now draw text + painter->setPen(textColor); + QFont font = option.font; + font.setBold(true); + + // TODO(crueter): fix this abysmal scaling + // If "none" is selected, then default to 8.5 point font. + font.setPointSize(1 + std::max(7.0, _iconsize ? std::sqrt(_iconsize * 0.6) : 7.5)); + + // TODO(crueter): elide mode + painter->setFont(font); + + painter->drawText(textRect, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, title); + + painter->restore(); +} + +QSize GameCard::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { + return m_size; +} + +void GameCard::setSize(const QSize& newSize) { + m_size = newSize; +} diff --git a/src/yuzu/game/game_card.h b/src/yuzu/game/game_card.h new file mode 100644 index 0000000000..3c695c9047 --- /dev/null +++ b/src/yuzu/game/game_card.h @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +/** + * A stylized "card"-like delegate for the game grid view. + * Adapted from QML + */ +class GameCard : public QStyledItemDelegate { + Q_OBJECT +public: + explicit GameCard(QObject* parent = nullptr); + + void paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + + QSize sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + void setSize(const QSize& newSize); + +private: + QSize m_size; +}; diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game/game_list.cpp similarity index 82% rename from src/yuzu/game_list.cpp rename to src/yuzu/game/game_list.cpp index d206ab096b..515fed1a8d 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game/game_list.cpp @@ -9,29 +9,30 @@ #include #include #include +#include #include -#include #include +#include #include #include #include #include -#include -#include -#include -#include +#include +#include +#include #include "common/common_types.h" #include "common/logging/log.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/patch_manager.h" #include "core/file_sys/registered_cache.h" +#include "game/game_card.h" #include "qt_common/config/uisettings.h" #include "qt_common/util/game.h" #include "yuzu/compatibility_list.h" -#include "yuzu/game_list.h" -#include "yuzu/game_list_p.h" -#include "yuzu/game_list_worker.h" +#include "yuzu/game/game_list.h" +#include "yuzu/game/game_list_p.h" +#include "yuzu/game/game_list_worker.h" #include "yuzu/main_window.h" #include "yuzu/util/controller_navigation.h" #include "qt_common/qt_common.h" @@ -198,25 +199,56 @@ void GameList::OnTextChanged(const QString& new_text) { QString edit_filter_text = new_text.toLower(); QStandardItem* folder; int children_total = 0; + int result_count = 0; + + auto hide = [this](int row, bool hidden, QModelIndex index = QModelIndex()) { + if (m_isTreeMode) { + tree_view->setRowHidden(row, index, hidden); + } else { + list_view->setRowHidden(row, hidden); + } + }; // If the searchfield is empty every item is visible // Otherwise the filter gets applied - if (edit_filter_text.isEmpty()) { - tree_view->setRowHidden(0, item_model->invisibleRootItem()->index(), - UISettings::values.favorited_ids.size() == 0); + + // TODO(crueter) dedupe + if (!m_isTreeMode) { + int row_count = item_model->rowCount(); + + for (int i = 0; i < row_count; ++i) { + QStandardItem* item = item_model->item(i, 0); + if (!item) continue; + + children_total++; + + const QString file_path = item->data(GameListItemPath::FullPathRole).toString().toLower(); + const QString file_title = item->data(GameListItemPath::TitleRole).toString().toLower(); + const QString file_name = file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + + QLatin1Char{' '} + file_title; + + if (edit_filter_text.isEmpty() || ContainsAllWords(file_name, edit_filter_text)) { + hide(i, false); + result_count++; + } else { + hide(i, true); + } + } + search_field->setFilterResult(result_count, children_total); + } else if (edit_filter_text.isEmpty()) { + hide(0, UISettings::values.favorited_ids.size() == 0, item_model->invisibleRootItem()->index()); for (int i = 1; i < item_model->rowCount() - 1; ++i) { folder = item_model->item(i, 0); const QModelIndex folder_index = folder->index(); const int children_count = folder->rowCount(); for (int j = 0; j < children_count; ++j) { ++children_total; - tree_view->setRowHidden(j, folder_index, false); + hide(j, false, folder_index); } } search_field->setFilterResult(children_total, children_total); } else { - tree_view->setRowHidden(0, item_model->invisibleRootItem()->index(), true); - int result_count = 0; + hide(0, true, item_model->invisibleRootItem()->index()); for (int i = 1; i < item_model->rowCount() - 1; ++i) { folder = item_model->item(i, 0); const QModelIndex folder_index = folder->index(); @@ -245,10 +277,10 @@ void GameList::OnTextChanged(const QString& new_text) { file_title; if (ContainsAllWords(file_name, edit_filter_text) || (file_program_id.size() == 16 && file_program_id.contains(edit_filter_text))) { - tree_view->setRowHidden(j, folder_index, false); + hide(j, false, folder_index); ++result_count; } else { - tree_view->setRowHidden(j, folder_index, true); + hide(j, true, folder_index); } } } @@ -334,28 +366,21 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid this->main_window = parent; layout = new QVBoxLayout; - tree_view = new QTreeView; + tree_view = new QTreeView(this); + list_view = new QListView(this); + m_gameCard = new GameCard(this); + + list_view->setItemDelegate(m_gameCard); + controller_navigation = new ControllerNavigation(system.HIDCore(), this); search_field = new GameListSearchField(this); item_model = new QStandardItemModel(tree_view); tree_view->setModel(item_model); + list_view->setModel(item_model); SetupScrollAnimation(); - tree_view->viewport()->installEventFilter(this); - - // touch gestures - tree_view->viewport()->grabGesture(Qt::SwipeGesture); - tree_view->viewport()->grabGesture(Qt::PanGesture); - - // TODO: touch? - QScroller::grabGesture(tree_view->viewport(), QScroller::LeftMouseButtonGesture); - - auto scroller = QScroller::scroller(tree_view->viewport()); - QScrollerProperties props; - props.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - props.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - scroller->setScrollerProperties(props); + // tree tree_view->setAlternatingRowColors(true); tree_view->setSelectionMode(QHeaderView::SingleSelection); tree_view->setSelectionBehavior(QHeaderView::SelectRows); @@ -367,6 +392,24 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid tree_view->setAttribute(Qt::WA_AcceptTouchEvents, true); tree_view->setStyleSheet(QStringLiteral("QTreeView{ border: none; }")); + // list view setup + list_view->setViewMode(QListView::IconMode); + list_view->setResizeMode(QListView::Adjust); + list_view->setUniformItemSizes(false); + list_view->setSelectionMode(QAbstractItemView::SingleSelection); + list_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + list_view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + list_view->setEditTriggers(QAbstractItemView::NoEditTriggers); + list_view->setContextMenuPolicy(Qt::CustomContextMenu); + list_view->setGridSize(QSize(140, 160)); + m_gameCard->setSize(list_view->gridSize()); + + list_view->setSpacing(10); + list_view->setWordWrap(true); + list_view->setTextElideMode(Qt::ElideRight); + list_view->setFlow(QListView::LeftToRight); + list_view->setWrapping(true); + item_model->insertColumns(0, COLUMN_COUNT); RetranslateUI(); @@ -376,8 +419,13 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid item_model->setSortRole(GameListItemPath::SortRole); connect(main_window, &MainWindow::UpdateThemedIcons, this, &GameList::OnUpdateThemedIcons); + connect(tree_view, &QTreeView::activated, this, &GameList::ValidateEntry); connect(tree_view, &QTreeView::customContextMenuRequested, this, &GameList::PopupContextMenu); + + connect(list_view, &QListView::activated, this, &GameList::ValidateEntry); + connect(list_view, &QListView::customContextMenuRequested, this, &GameList::PopupContextMenu); + connect(tree_view, &QTreeView::expanded, this, &GameList::OnItemExpanded); connect(tree_view, &QTreeView::collapsed, this, &GameList::OnItemExpanded); connect(controller_navigation, &ControllerNavigation::TriggerKeyboardEvent, this, @@ -391,6 +439,7 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid } QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier); QCoreApplication::postEvent(tree_view, event); + QCoreApplication::postEvent(list_view, event); }); // We must register all custom types with the Qt Automoc system so that we are able to use @@ -401,14 +450,70 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid layout->setSpacing(0); layout->addWidget(tree_view); + layout->addWidget(list_view); layout->addWidget(search_field); setLayout(layout); + + ResetViewMode(); } void GameList::UnloadController() { controller_navigation->UnloadController(); } +bool GameList::IsTreeMode() { + return m_isTreeMode; +} + +void GameList::ResetViewMode() { + auto &setting = UISettings::values.game_list_mode; + bool newTreeMode = false; + + switch (setting.GetValue()) { + case Settings::GameListMode::TreeView: + m_currentView = tree_view; + newTreeMode = true; + + tree_view->setVisible(true); + list_view->setVisible(false); + break; + case Settings::GameListMode::GridView: + m_currentView = list_view; + newTreeMode = false; + + list_view->setVisible(true); + tree_view->setVisible(false); + break; + default: + break; + } + + if (m_isTreeMode != newTreeMode) { + m_isTreeMode = newTreeMode; + + auto view = m_currentView->viewport(); + + view->installEventFilter(this); + + // touch gestures + view->grabGesture(Qt::SwipeGesture); + view->grabGesture(Qt::PanGesture); + + // TODO: touch? + QScroller::grabGesture(view, QScroller::LeftMouseButtonGesture); + + auto scroller = QScroller::scroller(view); + QScrollerProperties props; + props.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, + QScrollerProperties::OvershootAlwaysOff); + props.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, + QScrollerProperties::OvershootAlwaysOff); + scroller->setScrollerProperties(props); + + RefreshGameDirectory(); + } +} + GameList::~GameList() { UnloadController(); } @@ -432,14 +537,20 @@ void GameList::WorkerEvent() { } void GameList::AddDirEntry(GameListDir* entry_items) { - item_model->invisibleRootItem()->appendRow(entry_items); - tree_view->setExpanded( - entry_items->index(), - UISettings::values.game_dirs[entry_items->data(GameListDir::GameDirRole).toInt()].expanded); + if (m_isTreeMode) { + item_model->invisibleRootItem()->appendRow(entry_items); + tree_view->setExpanded( + entry_items->index(), + UISettings::values.game_dirs[entry_items->data(GameListDir::GameDirRole).toInt()] + .expanded); + } } void GameList::AddEntry(const QList& entry_items, GameListDir* parent) { - parent->appendRow(entry_items); + if (!m_isTreeMode) + item_model->invisibleRootItem()->appendRow(entry_items); + else + parent->appendRow(entry_items); } void GameList::ValidateEntry(const QModelIndex& item) { @@ -497,16 +608,18 @@ bool GameList::IsEmpty() const { void GameList::DonePopulating(const QStringList& watch_list) { emit ShowList(!IsEmpty()); - item_model->invisibleRootItem()->appendRow(new GameListAddDir()); - // Add favorites row - item_model->invisibleRootItem()->insertRow(0, new GameListFavorites()); - tree_view->setRowHidden(0, item_model->invisibleRootItem()->index(), - UISettings::values.favorited_ids.size() == 0); - tree_view->setExpanded(item_model->invisibleRootItem()->child(0)->index(), - UISettings::values.favorites_expanded.GetValue()); - for (const auto id : std::as_const(UISettings::values.favorited_ids)) { - AddFavorite(id); + if (m_isTreeMode) { + item_model->invisibleRootItem()->appendRow(new GameListAddDir()); + + item_model->invisibleRootItem()->insertRow(0, new GameListFavorites()); + tree_view->setRowHidden(0, item_model->invisibleRootItem()->index(), + UISettings::values.favorited_ids.size() == 0); + tree_view->setExpanded(item_model->invisibleRootItem()->child(0)->index(), + UISettings::values.favorites_expanded.GetValue()); + for (const auto id : std::as_const(UISettings::values.favorited_ids)) { + AddFavorite(id); + } } // Clear out the old directories to watch for changes and add the new ones @@ -538,7 +651,8 @@ void GameList::DonePopulating(const QStringList& watch_list) { #ifdef __APPLE__ watcher->blockSignals(old_signals_blocked); #endif - tree_view->setEnabled(true); + m_currentView->setEnabled(true); + int children_total = 0; for (int i = 1; i < item_model->rowCount() - 1; ++i) { children_total += item_model->item(i, 0)->rowCount(); @@ -554,9 +668,18 @@ void GameList::DonePopulating(const QStringList& watch_list) { } void GameList::PopupContextMenu(const QPoint& menu_location) { - QModelIndex item = tree_view->indexAt(menu_location); - if (!item.isValid()) + QModelIndex item = m_currentView->indexAt(menu_location); + if (!item.isValid()) { + if (m_isTreeMode) + return; + + QMenu blank_menu; + QAction *addGameDirAction = blank_menu.addAction(tr("&Add New Game Directory")); + + connect(addGameDirAction, &QAction::triggered, this, &GameList::AddDirectory); + blank_menu.exec(m_currentView->viewport()->mapToGlobal(menu_location)); return; + } const auto selected = item.sibling(item.row(), 0); QMenu context_menu; @@ -580,7 +703,7 @@ void GameList::PopupContextMenu(const QPoint& menu_location) { default: break; } - context_menu.exec(tree_view->viewport()->mapToGlobal(menu_location)); + context_menu.exec(m_currentView->viewport()->mapToGlobal(menu_location)); } void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::string& path) { @@ -641,7 +764,8 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id); navigate_to_gamedb_entry->setVisible(it != compatibility_list.end() && program_id != 0); - connect(favorite, &QAction::triggered, this, [this, program_id]() { ToggleFavorite(program_id); }); + connect(favorite, &QAction::triggered, this, + [this, program_id]() { ToggleFavorite(program_id); }); connect(open_save_location, &QAction::triggered, this, [this, program_id, path]() { emit OpenFolderRequested(program_id, GameListOpenTarget::SaveData, path); }); @@ -661,26 +785,32 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri emit RemoveInstalledEntryRequested(program_id, QtCommon::Game::InstalledEntryType::Update); }); connect(remove_dlc, &QAction::triggered, this, [this, program_id]() { - emit RemoveInstalledEntryRequested(program_id, QtCommon::Game::InstalledEntryType::AddOnContent); + emit RemoveInstalledEntryRequested(program_id, + QtCommon::Game::InstalledEntryType::AddOnContent); }); connect(remove_gl_shader_cache, &QAction::triggered, this, [this, program_id, path]() { - emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::GlShaderCache, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::GlShaderCache, + path); }); connect(remove_vk_shader_cache, &QAction::triggered, this, [this, program_id, path]() { - emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::VkShaderCache, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::VkShaderCache, + path); }); connect(remove_shader_cache, &QAction::triggered, this, [this, program_id, path]() { - emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::AllShaderCache, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::AllShaderCache, + path); }); connect(remove_custom_config, &QAction::triggered, this, [this, program_id, path]() { - emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::CustomConfiguration, path); + emit RemoveFileRequested(program_id, + QtCommon::Game::GameListRemoveTarget::CustomConfiguration, path); }); connect(set_play_time, &QAction::triggered, this, [this, program_id]() { emit SetPlayTimeRequested(program_id); }); connect(remove_play_time_data, &QAction::triggered, this, [this, program_id]() { emit RemovePlayTimeRequested(program_id); }); connect(remove_cache_storage, &QAction::triggered, this, [this, program_id, path] { - emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::CacheStorage, path); + emit RemoveFileRequested(program_id, QtCommon::Game::GameListRemoveTarget::CacheStorage, + path); }); connect(dump_romfs, &QAction::triggered, this, [this, program_id, path]() { emit DumpRomFSRequested(program_id, path, DumpRomFSTarget::Normal); @@ -700,15 +830,16 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri connect(create_desktop_shortcut, &QAction::triggered, this, [this, program_id, path]() { emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Desktop); }); - connect(create_applications_menu_shortcut, &QAction::triggered, this, [this, program_id, path]() { - emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Applications); - }); + connect(create_applications_menu_shortcut, &QAction::triggered, this, + [this, program_id, path]() { + emit CreateShortcut(program_id, path, QtCommon::Game::ShortcutTarget::Applications); + }); #endif connect(properties, &QAction::triggered, this, [this, path]() { emit OpenPerGameGeneralRequested(path); }); - connect(ryujinx, &QAction::triggered, this, [this, program_id]() { emit LinkToRyujinxRequested(program_id); - }); + connect(ryujinx, &QAction::triggered, this, + [this, program_id]() { emit LinkToRyujinxRequested(program_id); }); }; void GameList::AddCustomDirPopup(QMenu& context_menu, QModelIndex selected) { @@ -816,7 +947,7 @@ void GameList::LoadCompatibilityList() { const QJsonDocument json = QJsonDocument::fromJson(content); const QJsonArray arr = json.array(); - for (const QJsonValue &value : arr) { + for (const QJsonValue& value : arr) { const QJsonObject game = value.toObject(); const QString compatibility_key = QStringLiteral("compatibility"); @@ -828,7 +959,7 @@ void GameList::LoadCompatibilityList() { const QString directory = game[QStringLiteral("directory")].toString(); const QJsonArray ids = game[QStringLiteral("releases")].toArray(); - for (const QJsonValue &id_ref : ids) { + for (const QJsonValue& id_ref : ids) { const QJsonObject id_object = id_ref.toObject(); const QString id = id_object[QStringLiteral("id")].toString(); @@ -872,9 +1003,38 @@ QStandardItemModel* GameList::GetModel() const { return item_model; } -void GameList::PopulateAsync(QVector& game_dirs) -{ - tree_view->setEnabled(false); +void GameList::UpdateIconSize() { + // Update sizes and stuff for the list view + const u32 icon_size = UISettings::values.game_icon_size.GetValue(); + + // the scaling on the card is kinda abysmal. + // TODO(crueter): refactor + int heightMargin = 0; + int widthMargin = 80; + switch (icon_size) { + case 128: + heightMargin = 70; + break; + case 0: + widthMargin = 120; + heightMargin = 120; + break; + case 64: + heightMargin = 80; + break; + case 32: + case 256: + heightMargin = 81; + break; + } + + // TODO(crueter): Auto size + list_view->setGridSize(QSize(icon_size + widthMargin, icon_size + heightMargin)); + m_gameCard->setSize(list_view->gridSize()); +} + +void GameList::PopulateAsync(QVector& game_dirs) { + m_currentView->setEnabled(false); // Update the columns in case UISettings has changed tree_view->setColumnHidden(COLUMN_ADD_ONS, !UISettings::values.show_add_ons); @@ -883,6 +1043,8 @@ void GameList::PopulateAsync(QVector& game_dirs) tree_view->setColumnHidden(COLUMN_SIZE, !UISettings::values.show_size); tree_view->setColumnHidden(COLUMN_PLAY_TIME, !UISettings::values.show_play_time); + UpdateIconSize(); + // Cancel any existing worker. current_worker.reset(); @@ -890,12 +1052,8 @@ void GameList::PopulateAsync(QVector& game_dirs) item_model->removeRows(0, item_model->rowCount()); search_field->clear(); - current_worker = std::make_unique(vfs, - provider, - game_dirs, - compatibility_list, - play_time_manager, - system); + current_worker = std::make_unique(vfs, provider, game_dirs, compatibility_list, + play_time_manager, system); // Get events from the worker as data becomes available connect(current_worker.get(), &GameListWorker::DataAvailable, this, &GameList::WorkerEvent, @@ -1048,9 +1206,8 @@ void GameList::SetupScrollAnimation() { // animation handles moving the bar instead of Qt's built in crap anim->setEasingCurve(QEasingCurve::OutCubic); anim->setDuration(200); - connect(anim, &QVariantAnimation::valueChanged, this, [bar](const QVariant& value) { - bar->setValue(value.toInt()); - }); + connect(anim, &QVariantAnimation::valueChanged, this, + [bar](const QVariant& value) { bar->setValue(value.toInt()); }); }; vertical_scroll = new QVariantAnimation(this); @@ -1058,10 +1215,13 @@ void GameList::SetupScrollAnimation() { setup(vertical_scroll, tree_view->verticalScrollBar()); setup(horizontal_scroll, tree_view->horizontalScrollBar()); + + setup(vertical_scroll, list_view->verticalScrollBar()); + setup(horizontal_scroll, list_view->horizontalScrollBar()); } bool GameList::eventFilter(QObject* obj, QEvent* event) { - if (obj == tree_view->viewport() && event->type() == QEvent::Wheel) { + if (obj == m_currentView->viewport() && event->type() == QEvent::Wheel) { QWheelEvent* wheelEvent = static_cast(event); bool horizontal = wheelEvent->modifiers() & Qt::ShiftModifier; @@ -1078,26 +1238,28 @@ bool GameList::eventFilter(QObject* obj, QEvent* event) { // TODO(crueter): dedup this if (deltaY != 0) { if (vertical_scroll->state() == QAbstractAnimation::Stopped) - vertical_scroll_target = tree_view->verticalScrollBar()->value(); + vertical_scroll_target = m_currentView->verticalScrollBar()->value(); vertical_scroll_target -= deltaY; - vertical_scroll_target = qBound(0, vertical_scroll_target, tree_view->verticalScrollBar()->maximum()); + vertical_scroll_target = + qBound(0, vertical_scroll_target, m_currentView->verticalScrollBar()->maximum()); vertical_scroll->stop(); - vertical_scroll->setStartValue(tree_view->verticalScrollBar()->value()); + vertical_scroll->setStartValue(m_currentView->verticalScrollBar()->value()); vertical_scroll->setEndValue(vertical_scroll_target); vertical_scroll->start(); } if (deltaX != 0) { if (horizontal_scroll->state() == QAbstractAnimation::Stopped) - horizontal_scroll_target = tree_view->horizontalScrollBar()->value(); + horizontal_scroll_target = m_currentView->horizontalScrollBar()->value(); horizontal_scroll_target -= deltaX; - horizontal_scroll_target = qBound(0, horizontal_scroll_target, tree_view->horizontalScrollBar()->maximum()); + horizontal_scroll_target = + qBound(0, horizontal_scroll_target, m_currentView->horizontalScrollBar()->maximum()); horizontal_scroll->stop(); - horizontal_scroll->setStartValue(tree_view->horizontalScrollBar()->value()); + horizontal_scroll->setStartValue(m_currentView->horizontalScrollBar()->value()); horizontal_scroll->setEndValue(horizontal_scroll_target); horizontal_scroll->start(); } diff --git a/src/yuzu/game_list.h b/src/yuzu/game/game_list.h similarity index 95% rename from src/yuzu/game_list.h rename to src/yuzu/game/game_list.h index 9b00e270cd..7de622b714 100644 --- a/src/yuzu/game_list.h +++ b/src/yuzu/game/game_list.h @@ -17,6 +17,7 @@ #include #include #include +#include #include "common/common_types.h" #include "core/core.h" @@ -26,6 +27,10 @@ #include "frontend_common/play_time_manager.h" class QVariantAnimation; + +class QListView; + +class GameCard; namespace Core { class System; } @@ -92,6 +97,9 @@ public: static const QStringList supported_file_extensions; + bool IsTreeMode(); + void ResetViewMode(); + public slots: void RefreshGameDirectory(); void RefreshExternalContent(); @@ -129,6 +137,8 @@ private slots: void OnFilterCloseClicked(); void OnUpdateThemedIcons(); + void UpdateIconSize(); + private: friend class GameListWorker; void WorkerEvent(); @@ -158,7 +168,11 @@ private: GameListSearchField* search_field; MainWindow* main_window = nullptr; QVBoxLayout* layout = nullptr; + QTreeView* tree_view = nullptr; + QListView *list_view = nullptr; + GameCard *m_gameCard = nullptr; + QStandardItemModel* item_model = nullptr; std::unique_ptr current_worker; QFileSystemWatcher* watcher = nullptr; @@ -178,6 +192,9 @@ private: const PlayTime::PlayTimeManager& play_time_manager; Core::System& system; + + bool m_isTreeMode = true; + QAbstractItemView *m_currentView = tree_view; }; class GameListPlaceholder : public QWidget { diff --git a/src/yuzu/game_list_p.h b/src/yuzu/game/game_list_p.h similarity index 92% rename from src/yuzu/game_list_p.h rename to src/yuzu/game/game_list_p.h index ea11d34865..95f5f7eb78 100644 --- a/src/yuzu/game_list_p.h +++ b/src/yuzu/game/game_list_p.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2015 Citra Emulator Project @@ -75,13 +75,17 @@ public: GameListItemPath() = default; GameListItemPath(const QString& game_path, const std::vector& picture_data, - const QString& game_name, const QString& game_type, u64 program_id) { + const QString& game_name, const QString& game_type, u64 program_id, + u64 play_time) { setData(type(), TypeRole); setData(game_path, FullPathRole); setData(game_name, TitleRole); setData(qulonglong(program_id), ProgramIdRole); setData(game_type, FileTypeRole); + setData(QString::fromStdString(PlayTime::PlayTimeManager::GetReadablePlayTime(play_time)), + Qt::ToolTipRole); + const u32 size = UISettings::values.game_icon_size.GetValue(); QPixmap picture; @@ -111,24 +115,35 @@ public: }}; const auto& row1 = row_data.at(UISettings::values.row_1_text_id.GetValue()); - const int row2_id = UISettings::values.row_2_text_id.GetValue(); + // don't show row 2 on grid view + switch (UISettings::values.game_list_mode.GetValue()) { - if (role == SortRole) { - return row1.toLower(); + case Settings::GameListMode::TreeView: { + const int row2_id = UISettings::values.row_2_text_id.GetValue(); + + if (role == SortRole) { + return row1.toLower(); + } + + // None + if (row2_id == 4) { + return row1; + } + + const auto& row2 = row_data.at(row2_id); + + if (row1 == row2) { + return row1; + } + + return QStringLiteral("%1\n %2").arg(row1, row2); } - - // None - if (row2_id == 4) { + case Settings::GameListMode::GridView: return row1; + default: + break; } - const auto& row2 = row_data.at(row2_id); - - if (row1 == row2) { - return row1; - } - - return QStringLiteral("%1\n %2").arg(row1, row2); } return GameListItem::data(role); @@ -241,7 +256,9 @@ public: void setData(const QVariant& value, int role) override { qulonglong time_seconds = value.toULongLong(); - GameListItem::setData(QString::fromStdString(PlayTime::PlayTimeManager::GetReadablePlayTime(time_seconds)), Qt::DisplayRole); + GameListItem::setData( + QString::fromStdString(PlayTime::PlayTimeManager::GetReadablePlayTime(time_seconds)), + Qt::DisplayRole); GameListItem::setData(value, PlayTimeRole); } diff --git a/src/yuzu/game_list_worker.cpp b/src/yuzu/game/game_list_worker.cpp similarity index 98% rename from src/yuzu/game_list_worker.cpp rename to src/yuzu/game/game_list_worker.cpp index 131d6e6db4..d9c91334e1 100644 --- a/src/yuzu/game_list_worker.cpp +++ b/src/yuzu/game/game_list_worker.cpp @@ -27,9 +27,9 @@ #include "core/file_sys/submission_package.h" #include "core/loader/loader.h" #include "yuzu/compatibility_list.h" -#include "yuzu/game_list.h" -#include "yuzu/game_list_p.h" -#include "yuzu/game_list_worker.h" +#include "yuzu/game/game_list.h" +#include "yuzu/game/game_list_p.h" +#include "yuzu/game/game_list_worker.h" #include "qt_common/config/uisettings.h" namespace { @@ -214,11 +214,14 @@ QList MakeGameListEntry(const std::string& path, QString patch_versions = GetGameListCachedObject(fmt::format("{:016X}", patch.GetTitleID()), "pv.txt", [&patch, &loader] { return FormatPatchNameVersions(patch, loader, loader.IsRomFSUpdatable()); }); + + u64 play_time = play_time_manager.GetPlayTime(program_id); return QList{ - new GameListItemPath(FormatGameName(path), icon, QString::fromStdString(name), file_type_string, program_id), + new GameListItemPath(FormatGameName(path), icon, QString::fromStdString(name), + file_type_string, program_id, play_time), new GameListItem(file_type_string), new GameListItemSize(size), - new GameListItemPlayTime(play_time_manager.GetPlayTime(program_id)), + new GameListItemPlayTime(play_time), new GameListItem(patch_versions), new GameListItemCompat(compatibility), }; diff --git a/src/yuzu/game_list_worker.h b/src/yuzu/game/game_list_worker.h similarity index 97% rename from src/yuzu/game_list_worker.h rename to src/yuzu/game/game_list_worker.h index 1bbb024df3..76153f7917 100644 --- a/src/yuzu/game_list_worker.h +++ b/src/yuzu/game/game_list_worker.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 2f968f2b01..54fc778f80 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -105,6 +105,13 @@ &Debugging + + + &Game List Mode + + + + Reset Window Size to &720p @@ -137,6 +144,7 @@ + @@ -562,6 +570,22 @@ &Data Manager + + + true + + + &Tree View + + + + + true + + + &Grid View + + diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index e44696b6a3..def24ef5d3 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -3,6 +3,7 @@ // Qt on macOS doesn't define VMA shit #include +#include "common/settings_enums.h" #include "frontend_common/settings_generator.h" #include "qt_common/qt_string_lookup.h" #if defined(QT_STATICPLUGIN) && !defined(__APPLE__) @@ -25,7 +26,7 @@ #include "install_dialog.h" #include "bootmanager.h" -#include "game_list.h" +#include "yuzu/game/game_list.h" #include "loading_screen.h" #include "ryujinx_dialog.h" #include "set_play_time_dialog.h" @@ -550,6 +551,9 @@ MainWindow::MainWindow(bool has_broken_vulkan) game_list->LoadCompatibilityList(); game_list->PopulateAsync(UISettings::values.game_dirs); + // Set up game list mode checkboxes. + SetGameListMode(UISettings::values.game_list_mode.GetValue()); + // make sure menubar has the arrow cursor instead of inheriting from this ui->menubar->setCursor(QCursor()); statusBar()->setCursor(QCursor()); @@ -1600,6 +1604,9 @@ void MainWindow::ConnectMenuEvents() { ui->action_Reset_Window_Size_900, ui->action_Reset_Window_Size_1080}); + connect_menu(ui->action_Grid_View, &MainWindow::SetGridView); + connect_menu(ui->action_Tree_View, &MainWindow::SetTreeView); + // Multiplayer connect(ui->action_View_Lobby, &QAction::triggered, multiplayer_state, &MultiplayerState::OnViewLobby); @@ -3373,6 +3380,22 @@ void MainWindow::ResetWindowSize1080() { ResetWindowSize(Layout::ScreenDocked::Width, Layout::ScreenDocked::Height); } +void MainWindow::SetGameListMode(Settings::GameListMode mode) { + ui->action_Grid_View->setChecked(mode == Settings::GameListMode::GridView); + ui->action_Tree_View->setChecked(mode == Settings::GameListMode::TreeView); + + UISettings::values.game_list_mode = mode; + game_list->ResetViewMode(); +} + +void MainWindow::SetGridView() { + SetGameListMode(Settings::GameListMode::GridView); +} + +void MainWindow::SetTreeView() { + SetGameListMode(Settings::GameListMode::TreeView); +} + void MainWindow::OnConfigure() { const auto old_theme = UISettings::values.theme; const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 41c2f4fea0..3261ccc9a1 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -17,6 +17,7 @@ #include #include "common/common_types.h" +#include "common/settings_enums.h" #include "frontend_common/content_manager.h" #include "frontend_common/update_checker.h" #include "input_common/drivers/tas_input.h" @@ -401,6 +402,11 @@ private slots: void ResetWindowSize720(); void ResetWindowSize900(); void ResetWindowSize1080(); + + void SetGameListMode(Settings::GameListMode mode); + void SetGridView(); + void SetTreeView(); + void LaunchFirmwareApplet(u64 program_id, std::optional mode); void OnCreateHomeMenuDesktopShortcut(); void OnCreateHomeMenuApplicationMenuShortcut(); diff --git a/src/yuzu/multiplayer/chat_room.cpp b/src/yuzu/multiplayer/chat_room.cpp index 53beda0f8e..a4d343f3a3 100644 --- a/src/yuzu/multiplayer/chat_room.cpp +++ b/src/yuzu/multiplayer/chat_room.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,7 +20,7 @@ #include "common/logging/log.h" #include "network/announce_multiplayer_session.h" #include "ui_chat_room.h" -#include "yuzu/game_list_p.h" +#include "yuzu/game/game_list_p.h" #include "yuzu/multiplayer/chat_room.h" #include "yuzu/multiplayer/message.h" #ifdef ENABLE_WEB_SERVICE diff --git a/src/yuzu/multiplayer/client_room.cpp b/src/yuzu/multiplayer/client_room.cpp index 4e995c044f..2d6bcd3bad 100644 --- a/src/yuzu/multiplayer/client_room.cpp +++ b/src/yuzu/multiplayer/client_room.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -14,7 +14,7 @@ #include "common/logging/log.h" #include "network/announce_multiplayer_session.h" #include "ui_client_room.h" -#include "yuzu/game_list_p.h" +#include "yuzu/game/game_list_p.h" #include "yuzu/multiplayer/client_room.h" #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/moderation_dialog.h" diff --git a/src/yuzu/multiplayer/host_room.cpp b/src/yuzu/multiplayer/host_room.cpp index 8b811d8878..3e5e42e442 100644 --- a/src/yuzu/multiplayer/host_room.cpp +++ b/src/yuzu/multiplayer/host_room.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project @@ -19,7 +19,7 @@ #include "core/internal_network/network_interface.h" #include "network/announce_multiplayer_session.h" #include "ui_host_room.h" -#include "yuzu/game_list_p.h" +#include "yuzu/game/game_list_p.h" #include "yuzu/main_window.h" #include "yuzu/multiplayer/host_room.h" #include "yuzu/multiplayer/message.h" diff --git a/src/yuzu/multiplayer/lobby.cpp b/src/yuzu/multiplayer/lobby.cpp index fab9a56b2c..f28374f75f 100644 --- a/src/yuzu/multiplayer/lobby.cpp +++ b/src/yuzu/multiplayer/lobby.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project @@ -14,7 +14,7 @@ #include "core/internal_network/network_interface.h" #include "network/network.h" #include "ui_lobby.h" -#include "yuzu/game_list_p.h" +#include "yuzu/game/game_list_p.h" #include "yuzu/main_window.h" #include "yuzu/multiplayer/client_room.h" #include "yuzu/multiplayer/lobby.h" diff --git a/src/yuzu/multiplayer/state.cpp b/src/yuzu/multiplayer/state.cpp index 7549194848..c344bcb8a3 100644 --- a/src/yuzu/multiplayer/state.cpp +++ b/src/yuzu/multiplayer/state.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,7 +11,7 @@ #include "common/announce_multiplayer_room.h" #include "common/logging/log.h" #include "core/core.h" -#include "yuzu/game_list.h" +#include "yuzu/game/game_list.h" #include "yuzu/multiplayer/client_room.h" #include "yuzu/multiplayer/direct_connect.h" #include "yuzu/multiplayer/host_room.h" From 75fda70db293123817b8852632fd47a6984741a4 Mon Sep 17 00:00:00 2001 From: Nekle <224100951+ne-kle@users.noreply.github.com> Date: Sat, 7 Feb 2026 01:37:47 +0100 Subject: [PATCH 021/170] [vk] Simplified layouts per driver configuration (#3271) Replaces VK_PIPELINE_STAGE_ALL_COMMANDS_BIT with more specific pipeline stage flags in Vulkan pipeline barriers across renderer modules. Co-authored-by: DraVee Co-authored-by: Caio Oliveira Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3271 Reviewed-by: CamilleLaVey Reviewed-by: crueter Reviewed-by: DraVee Co-authored-by: Nekle <224100951+ne-kle@users.noreply.github.com> Co-committed-by: Nekle <224100951+ne-kle@users.noreply.github.com> --- src/video_core/renderer_vulkan/blit_image.cpp | 18 ++- .../renderer_vulkan/present/util.cpp | 32 ++++- .../renderer_vulkan/vk_buffer_cache.cpp | 57 +++++++- .../renderer_vulkan/vk_compute_pass.cpp | 47 ++++++- .../renderer_vulkan/vk_present_manager.cpp | 10 +- .../renderer_vulkan/vk_query_cache.cpp | 39 +++++- .../renderer_vulkan/vk_rasterizer.cpp | 17 ++- .../renderer_vulkan/vk_render_pass_cache.cpp | 22 +-- .../renderer_vulkan/vk_scheduler.cpp | 94 ++++++++++--- .../renderer_vulkan/vk_texture_cache.cpp | 132 +++++++++++++++--- 10 files changed, 385 insertions(+), 83 deletions(-) diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index 07611ef98c..62c69c67b0 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp @@ -436,7 +436,23 @@ void TransitionImageLayout(vk::CommandBuffer& cmdbuf, VkImage image, VkImageLayo .layerCount = 1, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Blit image barrier - transition can happen at any stage + // Using specific stages for better parallelism, but keeping broad since this is a general utility + const VkPipelineStageFlags src_stages_blit = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + const VkPipelineStageFlags dst_stages_blit = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_blit, dst_stages_blit, 0, barrier); } diff --git a/src/video_core/renderer_vulkan/present/util.cpp b/src/video_core/renderer_vulkan/present/util.cpp index 29a1c34976..c85af50060 100644 --- a/src/video_core/renderer_vulkan/present/util.cpp +++ b/src/video_core/renderer_vulkan/present/util.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -68,7 +68,16 @@ void TransitionImageLayout(vk::CommandBuffer& cmdbuf, VkImage image, VkImageLayo .layerCount = 1, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Present path - use specific stages for better parallelism on tile-based GPUs + const VkPipelineStageFlags src_stages = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + const VkPipelineStageFlags dst_stages = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages, dst_stages, 0, barrier); } @@ -151,11 +160,12 @@ void DownloadColorImage(vk::CommandBuffer& cmdbuf, VkImage image, VkBuffer buffe .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; + // Host will read the downloaded data static constexpr VkMemoryBarrier memory_write_barrier{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, - .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_HOST_READ_BIT, }; const VkBufferImageCopy copy{ .bufferOffset = 0, @@ -170,10 +180,20 @@ void DownloadColorImage(vk::CommandBuffer& cmdbuf, VkImage image, VkBuffer buffe .imageOffset{.x = 0, .y = 0, .z = 0}, .imageExtent{extent}, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, + const VkPipelineStageFlags src_stages_copy = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_copy, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, read_barrier); cmdbuf.CopyImageToBuffer(image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer, copy); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, + const VkPipelineStageFlags dst_stages_copy = + VK_PIPELINE_STAGE_HOST_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_copy, 0, memory_write_barrier, nullptr, image_write_barrier); } diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 6256bc8bd8..b10031de10 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -436,13 +436,27 @@ void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([src_buffer, dst_buffer, vk_copies, barrier](vk::CommandBuffer cmdbuf) { if (barrier) { - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Buffer writes can come from vertex input, shaders, or compute + const VkPipelineStageFlags src_stages = + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); } cmdbuf.CopyBuffer(src_buffer, dst_buffer, VideoCommon::FixSmallVectorADL(vk_copies)); if (barrier) { + // Buffer reads can go to vertex input, shaders, or compute + const VkPipelineStageFlags dst_stages = + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER); + dst_stages, 0, WRITE_BARRIER); } }); } @@ -456,21 +470,36 @@ void BufferCacheRuntime::PreCopyBarrier() { }; scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([](vk::CommandBuffer cmdbuf) { - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + const VkPipelineStageFlags src_stages = + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); }); } void BufferCacheRuntime::PostCopyBarrier() { + // Specific access flags for buffer destinations: vertex input, uniforms, storage, index static constexpr VkMemoryBarrier WRITE_BARRIER{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_INDEX_READ_BIT | + VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_SHADER_READ_BIT | + VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT, }; scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([](vk::CommandBuffer cmdbuf) { - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + const VkPipelineStageFlags dst_stages = + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages, 0, WRITE_BARRIER); }); } @@ -494,10 +523,24 @@ void BufferCacheRuntime::ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t si scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([dest_buffer, offset, size, value](vk::CommandBuffer cmdbuf) { - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + // Buffer writes can come from vertex input, shaders, or compute + const VkPipelineStageFlags src_stages_clear = + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_clear, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); cmdbuf.FillBuffer(dest_buffer, offset, size, value); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Buffer reads can go to vertex input, shaders, or compute + const VkPipelineStageFlags dst_stages_clear = + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_clear, 0, WRITE_BARRIER); }); } diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp index 22e646afe9..c978906c38 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp @@ -446,13 +446,26 @@ void ConditionalRenderingResolvePass::Resolve(VkBuffer dst_buffer, VkBuffer src_ const VkDescriptorSet set = descriptor_allocator.Commit(); device.GetLogical().UpdateDescriptorSet(set, *descriptor_template, descriptor_data); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Memory writes can come from graphics or compute stages + const VkPipelineStageFlags src_stages_compute = + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_compute, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, read_barrier); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_COMPUTE, *layout, 0, set, {}); cmdbuf.Dispatch(1, 1, 1); + // Conditional rendering result used by draw indirect or conditional rendering + const VkPipelineStageFlags dst_stages_cond = + VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | + VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, write_barrier); + dst_stages_cond, 0, write_barrier); }); } @@ -520,14 +533,29 @@ void QueriesPrefixScanPass::Run(VkBuffer accumulation_buffer, VkBuffer dst_buffe const VkDescriptorSet set = descriptor_allocator.Commit(); device.GetLogical().UpdateDescriptorSet(set, *descriptor_template, descriptor_data); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Memory writes can come from graphics or compute stages + const VkPipelineStageFlags src_stages_scan = + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_scan, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, read_barrier); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_COMPUTE, *layout, 0, set, {}); cmdbuf.PushConstants(*layout, VK_SHADER_STAGE_COMPUTE_BIT, uniforms); cmdbuf.Dispatch(1, 1, 1); + // Query prefix scan results used by draw indirect, conditional rendering, or shaders + const VkPipelineStageFlags dst_stages_scan = + VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | + VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT | + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, write_barrier); + dst_stages_scan, 0, write_barrier); }); } } @@ -579,8 +607,15 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map, .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; - cmdbuf.PipelineBarrier(is_initialized ? VK_PIPELINE_STAGE_ALL_COMMANDS_BIT - : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + // If initialized, memory writes can come from graphics or compute stages + const VkPipelineStageFlags src_stages_astc = is_initialized ? + (VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT) : + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + cmdbuf.PipelineBarrier(src_stages_astc, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, image_barrier); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, vk_pipeline); }); diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 3b5c2e3c01..3960f78343 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -441,7 +441,13 @@ void PresentManager::CopyToSwapchainImpl(Frame* frame) { }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, {}, + // Previous operations that might have written to the frame image + const VkPipelineStageFlags src_stages_present = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_present, VK_PIPELINE_STAGE_TRANSFER_BIT, {}, {}, {}, pre_barriers); if (blit_supported) { diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 414c270c8e..b9ff4cd00e 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -809,12 +809,19 @@ public: .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_SHADER_READ_BIT, }; scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([](vk::CommandBuffer cmdbuf) { + // After transfer, results may be read by host or used in subsequent operations + const VkPipelineStageFlags dst_stages_query = + VK_PIPELINE_STAGE_HOST_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER); + dst_stages_query, 0, WRITE_BARRIER); }); std::scoped_lock lk(flush_guard); @@ -942,7 +949,7 @@ private: .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, }; scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([dst_buffer = current_bank->GetBuffer(), @@ -1475,22 +1482,40 @@ void QueryCacheRuntime::Barriers(bool is_prebarrier) { .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, }; + // Query results may be read by host or used in shaders/indirect commands static constexpr VkMemoryBarrier WRITE_BARRIER{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_SHADER_READ_BIT | + VK_ACCESS_INDIRECT_COMMAND_READ_BIT, }; impl->scheduler.RequestOutsideRenderPassOperationContext(); if (is_prebarrier) { impl->scheduler.Record([](vk::CommandBuffer cmdbuf) { - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // Query data can be written by graphics or compute stages + const VkPipelineStageFlags src_stages_query = + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_query, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); }); } else { impl->scheduler.Record([](vk::CommandBuffer cmdbuf) { + // Query results may be read by host or used in shaders/indirect commands + const VkPipelineStageFlags dst_stages_query = + VK_PIPELINE_STAGE_HOST_BIT | + VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER); + dst_stages_query, 0, WRITE_BARRIER); }); } } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 60b899a811..4d508fc2f2 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -586,14 +586,23 @@ void RasterizerVulkan::DispatchCompute() { } const std::array dim{qmd.grid_dim_x, qmd.grid_dim_y, qmd.grid_dim_z}; scheduler.RequestOutsideRenderPassOperationContext(); + // Compute shader reads from storage buffers, uniforms, and images static constexpr VkMemoryBarrier READ_BARRIER{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, - .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT, + .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT, }; - scheduler.Record([](vk::CommandBuffer cmdbuf) { cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, - 0, READ_BARRIER); }); + scheduler.Record([](vk::CommandBuffer cmdbuf) { + // Memory writes can come from graphics or compute stages + const VkPipelineStageFlags src_stages = + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + cmdbuf.PipelineBarrier(src_stages, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + 0, READ_BARRIER); + }); scheduler.Record([dim](vk::CommandBuffer cmdbuf) { cmdbuf.Dispatch(dim[0], dim[1], dim[2]); }); // Log compute dispatch diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp index 80ff75e3b9..f1e15595b3 100644 --- a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -44,13 +44,19 @@ using VideoCore::Surface::SurfaceType; } VkAttachmentDescription AttachmentDescription(const Device& device, PixelFormat format, - VkSampleCountFlagBits samples) { + VkSampleCountFlagBits samples, + bool is_depth_stencil) { using MaxwellToVK::SurfaceFormat; const SurfaceType surface_type = GetSurfaceType(format); const bool has_stencil = surface_type == SurfaceType::DepthStencil || surface_type == SurfaceType::Stencil; + // Use optimal layouts for attachments - this allows drivers to optimize tiling and access patterns + const VkImageLayout attachment_layout = is_depth_stencil + ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL + : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + return { .flags = {}, .format = SurfaceFormat(device, FormatType::Optimal, true, format).format, @@ -61,8 +67,8 @@ using VideoCore::Surface::SurfaceType; : VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = has_stencil ? VK_ATTACHMENT_STORE_OP_STORE : VK_ATTACHMENT_STORE_OP_DONT_CARE, - .initialLayout = VK_IMAGE_LAYOUT_GENERAL, - .finalLayout = VK_IMAGE_LAYOUT_GENERAL, + .initialLayout = attachment_layout, + .finalLayout = attachment_layout, }; } } // Anonymous namespace @@ -84,10 +90,10 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) { const bool is_valid{format != PixelFormat::Invalid}; references[index] = VkAttachmentReference{ .attachment = is_valid ? num_colors : VK_ATTACHMENT_UNUSED, - .layout = VK_IMAGE_LAYOUT_GENERAL, + .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }; if (is_valid) { - descriptions.push_back(AttachmentDescription(*device, format, key.samples)); + descriptions.push_back(AttachmentDescription(*device, format, key.samples, false)); num_attachments = static_cast(index + 1); ++num_colors; } @@ -97,9 +103,9 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) { if (key.depth_format != PixelFormat::Invalid) { depth_reference = VkAttachmentReference{ .attachment = num_colors, - .layout = VK_IMAGE_LAYOUT_GENERAL, + .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }; - descriptions.push_back(AttachmentDescription(*device, key.depth_format, key.samples)); + descriptions.push_back(AttachmentDescription(*device, key.depth_format, key.samples, true)); } const VkSubpassDescription subpass{ .flags = 0, diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index e526d606dc..aafcfdf65b 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -264,14 +264,26 @@ u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_se const u64 signal_value = master_semaphore->NextTick(); RecordWithUploadBuffer([signal_semaphore, wait_semaphore, signal_value, this](vk::CommandBuffer cmdbuf, vk::CommandBuffer upload_cmdbuf) { + // Specific access flags for upload destinations: vertex input, uniforms, storage, index, textures static constexpr VkMemoryBarrier WRITE_BARRIER{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_INDEX_READ_BIT | + VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_SHADER_READ_BIT | + VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, }; + // Specify exact stages that need the transfer results instead of ALL_COMMANDS_BIT upload_cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER); + VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + 0, WRITE_BARRIER); upload_cmdbuf.End(); cmdbuf.End(); @@ -332,11 +344,11 @@ void Scheduler::EndRenderPass() query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false); query_cache->NotifySegment(false); - Record([num_images = num_renderpass_images, images = renderpass_images, ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) { std::array barriers; + VkPipelineStageFlags src_stages = 0; for (size_t i = 0; i < num_images; ++i) { const VkImageSubresourceRange& range = ranges[i]; const bool is_color = (range.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != 0; @@ -344,38 +356,76 @@ void Scheduler::EndRenderPass() & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) !=0; + // Determine optimal destination layout based on image usage + // After render pass, images may be used as shader resources or as attachments again + // Use optimal layouts to allow driver optimizations VkAccessFlags src_access = 0; + VkAccessFlags dst_access = 0; + VkPipelineStageFlags this_stage = 0; + VkImageLayout new_layout; - if (is_color) - src_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - else if (is_depth_stencil) - src_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - else - src_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT - | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - + if (is_color) { + // Color attachments can be read as textures or used as attachments again + src_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + this_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + dst_access = VK_ACCESS_SHADER_READ_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT + | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + } else if (is_depth_stencil) { + // Depth attachments can be read as textures or used as attachments again + src_access = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + this_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT + | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + dst_access = VK_ACCESS_SHADER_READ_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + } else { + // Fallback to GENERAL for unknown usage + src_access = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + this_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT + | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT + | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + new_layout = VK_IMAGE_LAYOUT_GENERAL; + dst_access = VK_ACCESS_SHADER_READ_BIT + | VK_ACCESS_SHADER_WRITE_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT + | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + } + src_stages |= this_stage; barriers[i] = VkImageMemoryBarrier{ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = src_access, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT - | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT - | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT - | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT - | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - .oldLayout = VK_IMAGE_LAYOUT_GENERAL, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, + .dstAccessMask = dst_access, + .oldLayout = is_color ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL + : (is_depth_stencil ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL + : VK_IMAGE_LAYOUT_GENERAL), + .newLayout = new_layout, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = images[i], .subresourceRange = range, }; } + cmdbuf.EndRenderPass(); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | - VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + + // Use specific pipeline stages instead of ALL_COMMANDS_BIT for better parallelism + // The destination stages depend on how the images will be used next + const VkPipelineStageFlags dst_stages = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + + cmdbuf.PipelineBarrier(src_stages, + dst_stages, 0, nullptr, nullptr, diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 39a43d5950..988ab53266 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -810,7 +810,8 @@ void BlitScale(Scheduler& scheduler, VkImage src_image, VkImage dst_image, const .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = 0, - .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -822,7 +823,8 @@ void BlitScale(Scheduler& scheduler, VkImage src_image, VkImage dst_image, const .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -831,11 +833,26 @@ void BlitScale(Scheduler& scheduler, VkImage src_image, VkImage dst_image, const .subresourceRange = subresource_range, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + // Use specific pipeline stages for better parallelism + const VkPipelineStageFlags src_stages = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, nullptr, nullptr, read_barriers); cmdbuf.BlitImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, regions, vk_filter); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // After transfer, images may be used in graphics, compute, or as attachments + const VkPipelineStageFlags dst_stages = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages, 0, nullptr, nullptr, write_barriers); }); } @@ -1021,11 +1038,12 @@ void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, }; + // After reinterpret, buffers used as transfer source, uniforms, or storage static constexpr VkMemoryBarrier WRITE_BARRIER{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_SHADER_READ_BIT, }; const std::array pre_barriers{ VkImageMemoryBarrier{ @@ -1092,18 +1110,39 @@ void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, .subresourceRange = dst_range.SubresourceRange(dst_aspect_mask), }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + const VkPipelineStageFlags src_stages_transfer = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_transfer, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, {}, {}, pre_barriers); cmdbuf.CopyImageToBuffer(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, copy_buffer, vk_in_copies); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + const VkPipelineStageFlags dst_stages_transfer = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_transfer, 0, WRITE_BARRIER, nullptr, middle_in_barrier); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + cmdbuf.PipelineBarrier(src_stages_transfer, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER, {}, middle_out_barrier); cmdbuf.CopyBufferToImage(copy_buffer, dst_image, VK_IMAGE_LAYOUT_GENERAL, vk_out_copies); - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // After reinterpret copy, image may be used in shaders or as attachment + const VkPipelineStageFlags dst_stages_post = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_post, 0, {}, {}, post_barriers); }); } @@ -1230,7 +1269,12 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + const VkPipelineStageFlags src_stages_resolve = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_resolve, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, nullptr, nullptr, read_barriers); if (is_resolve) { cmdbuf.ResolveImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, @@ -1243,7 +1287,14 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, MakeImageBlit(dst_region, src_region, dst_layers, src_layers), vk_filter); } - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // After blit/resolve, image may be used in shaders or as attachment + const VkPipelineStageFlags dst_stages_blit = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_blit, 0, write_barrier); }); } @@ -1821,7 +1872,14 @@ void Image::DownloadMemory(std::span buffers_span, std::span o .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + const VkPipelineStageFlags src_stages_download = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_download, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, read_barrier); for (size_t index = 0; index < buffers.size(); index++) { @@ -1829,17 +1887,20 @@ void Image::DownloadMemory(std::span buffers_span, std::span o vk_copies[index]); } + // Host will read the downloaded data const VkMemoryBarrier memory_write_barrier{ .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, .pNext = nullptr, - .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_HOST_READ_BIT, }; + // Image will be used for shaders or as attachment const VkImageMemoryBarrier image_write_barrier{ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = 0, - .dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -1853,7 +1914,13 @@ void Image::DownloadMemory(std::span buffers_span, std::span o .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + const VkPipelineStageFlags dst_stages_download = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_download, 0, memory_write_barrier, nullptr, image_write_barrier); }); return; @@ -1888,7 +1955,15 @@ void Image::DownloadMemory(std::span buffers_span, std::span o .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, + // Image writes can come from graphics or compute stages + const VkPipelineStageFlags src_stages_img = + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; + cmdbuf.PipelineBarrier(src_stages_img, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, read_barrier); for (size_t index = 0; index < buffers.size(); index++) { @@ -1920,7 +1995,14 @@ void Image::DownloadMemory(std::span buffers_span, std::span o .layerCount = VK_REMAINING_ARRAY_LAYERS, }, }; - cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + // After download, image may be used in shaders or as attachment + const VkPipelineStageFlags dst_stages_img = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stages_img, 0, memory_write_barrier, nullptr, image_write_barrier); }); } @@ -2474,7 +2556,9 @@ void TextureCacheRuntime::TransitionImageLayout(Image& image) { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .pNext = nullptr, .srcAccessMask = VK_ACCESS_NONE, - .dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, .newLayout = VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -2490,8 +2574,16 @@ void TextureCacheRuntime::TransitionImageLayout(Image& image) { }; scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([barrier](vk::CommandBuffer cmdbuf) { + // After layout transition, image may be used in shaders or as attachment + const VkPipelineStageFlags dst_stages_layout = + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT; cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, barrier); + dst_stages_layout, 0, barrier); }); } } From 16f25644788e38d32665529e884c2f5987effaf8 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sat, 7 Feb 2026 02:12:04 +0100 Subject: [PATCH 022/170] [am] terminate app, if caller applet is available (#3486) Changes ExitProcessAndReturn to terminate process if caller is available (e.g. a parent applet) and start program_index 0 if not. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3486 Reviewed-by: DraVee Reviewed-by: crueter Co-authored-by: Maufeat Co-committed-by: Maufeat --- .../hle/service/am/service/library_applet_self_accessor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp index 0335ae5be6..4a1d1f97d3 100644 --- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp @@ -181,12 +181,12 @@ Result ILibraryAppletSelfAccessor::ExitProcessAndReturn() { LOG_INFO(Service_AM, "called"); if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { - system.GetUserChannel() = caller_applet->user_channel_launch_parameter; + m_applet->process->Terminate(); } else { system.GetUserChannel() = m_applet->user_channel_launch_parameter; + system.ExecuteProgram(0); } - system.ExecuteProgram(0); R_SUCCEED(); } From 71e035f83be0cc806ed3352452be27e3fec57aa9 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sat, 7 Feb 2026 03:02:36 +0100 Subject: [PATCH 023/170] [android] Fix nightly build download URLs (#3487) It should work now, I hope. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3487 Reviewed-by: crueter Reviewed-by: Maufeat Co-authored-by: PavelBARABANOV Co-committed-by: PavelBARABANOV --- .../src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 3 +-- src/android/app/src/main/jni/native.cpp | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 8edec4ff46..8a4262ebe7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -200,8 +200,7 @@ class MainActivity : AppCompatActivity(), ThemeProvider { var artifact = tag // Nightly builds have a slightly different format if (NativeLibrary.isNightlyBuild()) { - val splitTag = tag.split('.') - artifact = splitTag.subList(1, splitTag.size - 1).joinToString(".") + artifact = tag.substringAfter('.', tag) } downloadAndInstallUpdate(tag, artifact) } diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 195a100983..9cb44bbd3a 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1776,7 +1776,7 @@ JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getUpdateApkUrl( #endif } - const std::string apk_filename = fmt::format("Eden-Android-{}-{}.apk", version_str, variant); + const std::string apk_filename = fmt::format("Eden-Android-{}-{}.apk", artifact_str, variant); const std::string url = fmt::format("{}/{}/releases/download/{}/{}", std::string{Common::g_build_auto_update_website}, std::string{Common::g_build_auto_update_repo}, @@ -1784,6 +1784,7 @@ JNIEXPORT jstring JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_getUpdateApkUrl( apk_filename); env->ReleaseStringUTFChars(tag, version_str); + env->ReleaseStringUTFChars(artifact, artifact_str); env->ReleaseStringUTFChars(packageId, package_id_str); return env->NewStringUTF(url.c_str()); } From e10f55d9db903fb51651ed8c5b9280e7724d18db Mon Sep 17 00:00:00 2001 From: wildcard Date: Sat, 7 Feb 2026 22:44:32 +0100 Subject: [PATCH 024/170] [host_shaders] Store the value of results instead of discarding it (#3464) the function generated the value but we never stored it effectively discarding the result. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3464 Reviewed-by: MaranBr Reviewed-by: Maufeat Co-authored-by: wildcard Co-committed-by: wildcard --- src/video_core/host_shaders/queries_prefix_scan_sum.comp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/host_shaders/queries_prefix_scan_sum.comp b/src/video_core/host_shaders/queries_prefix_scan_sum.comp index 6faa8981f2..7ecd5a096d 100644 --- a/src/video_core/host_shaders/queries_prefix_scan_sum.comp +++ b/src/video_core/host_shaders/queries_prefix_scan_sum.comp @@ -86,7 +86,7 @@ void WriteResults(uvec2 results[LOCAL_RESULTS]) { const uvec2 accum = accumulated_data; for (uint i = 0; i < LOCAL_RESULTS; i++) { uvec2 base_data = current_id * LOCAL_RESULTS + i < min_accumulation_base ? accum : uvec2(0, 0); - AddUint64(results[i], base_data); + results[i] = AddUint64(results[i], base_data); } for (uint i = 0; i < LOCAL_RESULTS; i++) { output_data[buffer_offset + current_id * LOCAL_RESULTS + i] = results[i]; From ca9f2d43beeb03ca2127a21ef34ead9f497bcb03 Mon Sep 17 00:00:00 2001 From: crueter Date: Sat, 7 Feb 2026 22:48:39 +0100 Subject: [PATCH 025/170] [desktop] Add icon-only mode to grid and improve design (#3485) - Move Game Icon Size to the main toolbar. It's cleaner that way - Add a "Show Game Name" toggle that does as it says. Disabling it basically creates an "icons-only" mode. Useful for controller-only nav with big icons (TODO: maybe make a 192 size?) - Fixed a crash with controller nav. Oops - Rounded corners of the game icon in grid mode - Fixed the scroll bar creating extra clamping range on the grid icons - Item can be deselected if user clicks on the blank space outside of the view As a bonus fixed a crash on mod manager Future TODOs for design: - [ ] Row 1 type. Not sure what to do here tbh. - [ ] Move around game list settings in configure_ui to make it clear that nothing there affects the grid view. - [ ] 192x192 size? 256 feels too big on my 1440p screen whereas 128 feels too small. - Set text space as a function of fontMetrics. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3485 Reviewed-by: DraVee Reviewed-by: Maufeat --- src/frontend_common/mod_manager.cpp | 8 +- src/qt_common/config/uisettings.h | 1 + src/qt_common/util/mod.cpp | 2 + .../configure_per_game_addons.cpp | 8 +- .../configuration/configure_per_game_addons.h | 2 +- src/yuzu/configuration/configure_ui.cpp | 29 +--- src/yuzu/configuration/configure_ui.ui | 20 +-- src/yuzu/game/game_card.cpp | 61 +++++--- src/yuzu/game/game_card.h | 3 +- src/yuzu/game/game_list.cpp | 147 ++++++++++++------ src/yuzu/main.ui | 25 +++ src/yuzu/main_window.cpp | 91 ++++++++++- src/yuzu/main_window.h | 6 + 13 files changed, 273 insertions(+), 130 deletions(-) diff --git a/src/frontend_common/mod_manager.cpp b/src/frontend_common/mod_manager.cpp index 6ac79d22e2..cbbb3b3400 100644 --- a/src/frontend_common/mod_manager.cpp +++ b/src/frontend_common/mod_manager.cpp @@ -18,10 +18,10 @@ std::vector GetModFolder(const std::string& root) { auto callback = [&paths](const std::filesystem::directory_entry& entry) -> bool { const auto name = entry.path().filename().string(); - static constexpr const std::array valid_names = {"exefs", - "romfs" - "romfs_ext", - "cheats", "romfslite"}; + static const std::array valid_names = {"exefs", + "romfs" + "romfs_ext", + "cheats", "romfslite"}; if (std::ranges::find(valid_names, name) != valid_names.end()) { paths.emplace_back(entry.path().parent_path()); diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h index 89e3833508..3c75268377 100644 --- a/src/qt_common/config/uisettings.h +++ b/src/qt_common/config/uisettings.h @@ -211,6 +211,7 @@ struct Values { Setting row_1_text_id{linkage, 3, "row_1_text_id", Category::UiGameList}; Setting row_2_text_id{linkage, 2, "row_2_text_id", Category::UiGameList}; Setting game_list_mode{linkage, Settings::GameListMode::TreeView, "game_list_mode", Category::UiGameList}; + Setting show_game_name{linkage, true, "show_game_name", Category::UiGameList}; std::atomic_bool is_game_list_reload_pending{false}; Setting cache_game_list{linkage, true, "cache_game_list", Category::UiGameList}; diff --git a/src/qt_common/util/mod.cpp b/src/qt_common/util/mod.cpp index 1168bde2f6..f32076fada 100644 --- a/src/qt_common/util/mod.cpp +++ b/src/qt_common/util/mod.cpp @@ -43,6 +43,8 @@ QStringList GetModFolders(const QString& root, const QString& fallbackName) { QString name = QtCommon::Frontend::GetTextInput( tr("Mod Name"), tr("What should this mod be called?"), default_name); + if (name.isEmpty()) return {}; + // if std_path is empty, frontend_common could not determine mod type and/or name. // so we have to prompt the user and set up the structure ourselves if (paths.empty()) { diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index ecafa6826a..da84d23876 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -161,14 +161,14 @@ void ConfigurePerGameAddons::InstallMods(const QStringList& mods) { } } -void ConfigurePerGameAddons::InstallModPath(const QString& path) { - const auto mods = QtCommon::Mod::GetModFolders(path, {}); +void ConfigurePerGameAddons::InstallModPath(const QString& path, const QString &fallbackName) { + const auto mods = QtCommon::Mod::GetModFolders(path, fallbackName); if (mods.size() > 1) { ModSelectDialog* dialog = new ModSelectDialog(mods, this); connect(dialog, &ModSelectDialog::modsSelected, this, &ConfigurePerGameAddons::InstallMods); dialog->show(); - } else { + } else if (!mods.empty()) { InstallMods(mods); } } @@ -194,7 +194,7 @@ void ConfigurePerGameAddons::InstallModZip() { const QString extracted = QtCommon::Mod::ExtractMod(path); if (!extracted.isEmpty()) - InstallModPath(extracted); + InstallModPath(extracted, QFileInfo(path).baseName()); } void ConfigurePerGameAddons::changeEvent(QEvent* event) { diff --git a/src/yuzu/configuration/configure_per_game_addons.h b/src/yuzu/configuration/configure_per_game_addons.h index 3c7c0b0ff0..d2f361139b 100644 --- a/src/yuzu/configuration/configure_per_game_addons.h +++ b/src/yuzu/configuration/configure_per_game_addons.h @@ -44,7 +44,7 @@ public: public slots: void InstallMods(const QStringList &mods); - void InstallModPath(const QString& path); + void InstallModPath(const QString& path, const QString& fallbackName = {}); void InstallModFolder(); void InstallModZip(); diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index b88f41b756..0e91a1a9fd 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "yuzu/configuration/configure_ui.h" @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -21,7 +20,6 @@ #include "common/common_types.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" #include "common/settings.h" #include "common/settings_enums.h" #include "core/core.h" @@ -32,13 +30,6 @@ #include "qt_common/config/uisettings.h" namespace { -constexpr std::array default_game_icon_sizes{ - std::make_pair(0, QT_TRANSLATE_NOOP("ConfigureUI", "None")), - std::make_pair(32, QT_TRANSLATE_NOOP("ConfigureUI", "Small (32x32)")), - std::make_pair(64, QT_TRANSLATE_NOOP("ConfigureUI", "Standard (64x64)")), - std::make_pair(128, QT_TRANSLATE_NOOP("ConfigureUI", "Large (128x128)")), - std::make_pair(256, QT_TRANSLATE_NOOP("ConfigureUI", "Full Size (256x256)")), -}; constexpr std::array default_folder_icon_sizes{ std::make_pair(0, QT_TRANSLATE_NOOP("ConfigureUI", "None")), @@ -57,10 +48,6 @@ constexpr std::array row_text_names{ }; // clang-format on -QString GetTranslatedGameIconSize(size_t index) { - return QCoreApplication::translate("ConfigureUI", default_game_icon_sizes[index].second); -} - QString GetTranslatedFolderIconSize(size_t index) { return QCoreApplication::translate("ConfigureUI", default_folder_icon_sizes[index].second); } @@ -127,8 +114,6 @@ ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) connect(ui->show_types, &QCheckBox::STATE_CHANGED, this, &ConfigureUi::RequestGameListUpdate); connect(ui->show_play_time, &QCheckBox::STATE_CHANGED, this, &ConfigureUi::RequestGameListUpdate); - connect(ui->game_icon_size_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, - &ConfigureUi::RequestGameListUpdate); connect(ui->folder_icon_size_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, &ConfigureUi::RequestGameListUpdate); connect(ui->row_1_text_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, @@ -172,7 +157,6 @@ void ConfigureUi::ApplyConfiguration() { UISettings::values.show_size = ui->show_size->isChecked(); UISettings::values.show_types = ui->show_types->isChecked(); UISettings::values.show_play_time = ui->show_play_time->isChecked(); - UISettings::values.game_icon_size = ui->game_icon_size_combobox->currentData().toUInt(); UISettings::values.folder_icon_size = ui->folder_icon_size_combobox->currentData().toUInt(); UISettings::values.row_1_text_id = ui->row_1_text_combobox->currentData().toUInt(); UISettings::values.row_2_text_id = ui->row_2_text_combobox->currentData().toUInt(); @@ -202,8 +186,6 @@ void ConfigureUi::SetConfiguration() { ui->show_size->setChecked(UISettings::values.show_size.GetValue()); ui->show_types->setChecked(UISettings::values.show_types.GetValue()); ui->show_play_time->setChecked(UISettings::values.show_play_time.GetValue()); - ui->game_icon_size_combobox->setCurrentIndex( - ui->game_icon_size_combobox->findData(UISettings::values.game_icon_size.GetValue())); ui->folder_icon_size_combobox->setCurrentIndex( ui->folder_icon_size_combobox->findData(UISettings::values.folder_icon_size.GetValue())); @@ -231,11 +213,6 @@ void ConfigureUi::changeEvent(QEvent* event) { void ConfigureUi::RetranslateUI() { ui->retranslateUi(this); - for (int i = 0; i < ui->game_icon_size_combobox->count(); i++) { - ui->game_icon_size_combobox->setItemText(i, - GetTranslatedGameIconSize(static_cast(i))); - } - for (int i = 0; i < ui->folder_icon_size_combobox->count(); i++) { ui->folder_icon_size_combobox->setItemText( i, GetTranslatedFolderIconSize(static_cast(i))); @@ -270,10 +247,6 @@ void ConfigureUi::InitializeLanguageComboBox() { } void ConfigureUi::InitializeIconSizeComboBox() { - for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { - const auto size = default_game_icon_sizes[i].first; - ui->game_icon_size_combobox->addItem(GetTranslatedGameIconSize(i), size); - } for (size_t i = 0; i < default_folder_icon_sizes.size(); i++) { const auto size = default_folder_icon_sizes[i].first; ui->folder_icon_size_combobox->addItem(GetTranslatedFolderIconSize(i), size); diff --git a/src/yuzu/configuration/configure_ui.ui b/src/yuzu/configuration/configure_ui.ui index b8e6483814..123068c9e2 100644 --- a/src/yuzu/configuration/configure_ui.ui +++ b/src/yuzu/configuration/configure_ui.ui @@ -7,7 +7,7 @@ 0 0 363 - 603 + 613 @@ -111,20 +111,6 @@ - - - - - - Game Icon Size: - - - - - - - - @@ -221,7 +207,7 @@ TextLabel - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -251,7 +237,7 @@ - Qt::Vertical + Qt::Orientation::Vertical diff --git a/src/yuzu/game/game_card.cpp b/src/yuzu/game/game_card.cpp index d172d3e535..26ab99faaf 100644 --- a/src/yuzu/game/game_card.cpp +++ b/src/yuzu/game/game_card.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include +#include #include "game_card.h" #include "qt_common/config/uisettings.h" @@ -18,7 +19,7 @@ void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, painter->setRenderHint(QPainter::Antialiasing); // padding - QRect cardRect = option.rect.adjusted(4, 4, -4, -4); + QRect cardRect = option.rect.adjusted(4 + m_padding / 2, 4, -4 - m_padding / 2, -4); // colors QPalette palette = option.palette; @@ -32,7 +33,7 @@ void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, borderColor = palette.highlight().color().lighter(150); textColor = palette.highlightedText().color(); } else if (option.state & QStyle::State_MouseOver) { - backgroundColor = backgroundColor.lighter(110); + backgroundColor = backgroundColor.lighter(120); } // bg @@ -40,7 +41,7 @@ void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, painter->setPen(QPen(borderColor, 1)); painter->drawRoundedRect(cardRect, 10, 10); - static constexpr const int padding = 10; + static constexpr const int padding = 8; // icon int _iconsize = UISettings::values.game_icon_size.GetValue(); @@ -58,7 +59,18 @@ void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, iconRect = QRect(x, y, scaledSize.width(), scaledSize.height()); painter->setRenderHint(QPainter::SmoothPixmapTransform, true); + + // Put this in a separate thing on the painter stack to prevent clipping the text. + painter->save(); + + // round image edges + QPainterPath path; + path.addRoundedRect(iconRect, 10, 10); + painter->setClipPath(path); + painter->drawPixmap(iconRect, iconPixmap); + + painter->restore(); } else { // if there is no icon just draw a blank rect iconRect = QRect(cardRect.left() + padding, @@ -66,31 +78,33 @@ void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, _iconsize, _iconsize); } - // if "none" is selected, pretend there's a - _iconsize = _iconsize ? _iconsize : 96; + if (UISettings::values.show_game_name.GetValue()) { + // if "none" is selected, pretend there's a + _iconsize = _iconsize ? _iconsize : 96; - // padding + text - QRect textRect = cardRect; - textRect.setTop(iconRect.bottom() + 8); - textRect.adjust(padding, 0, -padding, -padding); + // padding + text + QRect textRect = cardRect; + textRect.setTop(iconRect.bottom() + 8); + textRect.adjust(padding, 0, -padding, -padding); - // We are already crammed on space, ignore the row 2 - QString title = index.data(Qt::DisplayRole).toString(); - title = title.split(QLatin1Char('\n')).first(); + // We are already crammed on space, ignore the row 2 + QString title = index.data(Qt::DisplayRole).toString(); + title = title.split(QLatin1Char('\n')).first(); - // now draw text - painter->setPen(textColor); - QFont font = option.font; - font.setBold(true); + // now draw text + painter->setPen(textColor); + QFont font = option.font; + font.setBold(true); - // TODO(crueter): fix this abysmal scaling - // If "none" is selected, then default to 8.5 point font. - font.setPointSize(1 + std::max(7.0, _iconsize ? std::sqrt(_iconsize * 0.6) : 7.5)); + // TODO(crueter): fix this abysmal scaling + // If "none" is selected, then default to 8.5 point font. + font.setPointSize(1 + std::max(7.0, _iconsize ? std::sqrt(_iconsize * 0.6) : 7.5)); - // TODO(crueter): elide mode - painter->setFont(font); + // TODO(crueter): elide mode + painter->setFont(font); - painter->drawText(textRect, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, title); + painter->drawText(textRect, Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, title); + } painter->restore(); } @@ -99,6 +113,7 @@ QSize GameCard::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& return m_size; } -void GameCard::setSize(const QSize& newSize) { +void GameCard::setSize(const QSize& newSize, const int padding) { m_size = newSize; + m_padding = padding; } diff --git a/src/yuzu/game/game_card.h b/src/yuzu/game/game_card.h index 3c695c9047..9fd0ec081a 100644 --- a/src/yuzu/game/game_card.h +++ b/src/yuzu/game/game_card.h @@ -20,8 +20,9 @@ public: QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; - void setSize(const QSize& newSize); + void setSize(const QSize& newSize, const int padding); private: QSize m_size; + int m_padding; }; diff --git a/src/yuzu/game/game_list.cpp b/src/yuzu/game/game_list.cpp index 515fed1a8d..80995a0e79 100644 --- a/src/yuzu/game/game_list.cpp +++ b/src/yuzu/game/game_list.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +#include #include #include #include @@ -13,13 +14,12 @@ #include #include #include +#include #include #include #include #include -#include -#include -#include +#include #include "common/common_types.h" #include "common/logging/log.h" #include "common/settings.h" @@ -28,6 +28,7 @@ #include "core/file_sys/registered_cache.h" #include "game/game_card.h" #include "qt_common/config/uisettings.h" +#include "qt_common/qt_common.h" #include "qt_common/util/game.h" #include "yuzu/compatibility_list.h" #include "yuzu/game/game_list.h" @@ -35,7 +36,6 @@ #include "yuzu/game/game_list_worker.h" #include "yuzu/main_window.h" #include "yuzu/util/controller_navigation.h" -#include "qt_common/qt_common.h" GameListSearchField::KeyReleaseEater::KeyReleaseEater(GameList* gamelist_, QObject* parent) : QObject(parent), gamelist{gamelist_} {} @@ -393,16 +393,21 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid tree_view->setStyleSheet(QStringLiteral("QTreeView{ border: none; }")); // list view setup - list_view->setViewMode(QListView::IconMode); - list_view->setResizeMode(QListView::Adjust); - list_view->setUniformItemSizes(false); + list_view->setViewMode(QListView::ListMode); + list_view->setResizeMode(QListView::Fixed); + list_view->setUniformItemSizes(true); list_view->setSelectionMode(QAbstractItemView::SingleSelection); list_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); list_view->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + + // Forcefully disable scroll bar, prevents thing where game list items + // will start clamping prematurely. + list_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + list_view->setEditTriggers(QAbstractItemView::NoEditTriggers); list_view->setContextMenuPolicy(Qt::CustomContextMenu); list_view->setGridSize(QSize(140, 160)); - m_gameCard->setSize(list_view->gridSize()); + m_gameCard->setSize(list_view->gridSize(), 0); list_view->setSpacing(10); list_view->setWordWrap(true); @@ -438,8 +443,8 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid return; } QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier); - QCoreApplication::postEvent(tree_view, event); - QCoreApplication::postEvent(list_view, event); + + QCoreApplication::postEvent(m_currentView, event); }); // We must register all custom types with the Qt Automoc system so that we are able to use @@ -488,28 +493,27 @@ void GameList::ResetViewMode() { break; } + auto view = m_currentView->viewport(); + view->installEventFilter(this); + + // touch gestures + view->grabGesture(Qt::SwipeGesture); + view->grabGesture(Qt::PanGesture); + + // TODO: touch? + QScroller::grabGesture(view, QScroller::LeftMouseButtonGesture); + + auto scroller = QScroller::scroller(view); + QScrollerProperties props; + props.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, + QScrollerProperties::OvershootAlwaysOff); + props.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, + QScrollerProperties::OvershootAlwaysOff); + scroller->setScrollerProperties(props); + if (m_isTreeMode != newTreeMode) { m_isTreeMode = newTreeMode; - auto view = m_currentView->viewport(); - - view->installEventFilter(this); - - // touch gestures - view->grabGesture(Qt::SwipeGesture); - view->grabGesture(Qt::PanGesture); - - // TODO: touch? - QScroller::grabGesture(view, QScroller::LeftMouseButtonGesture); - - auto scroller = QScroller::scroller(view); - QScrollerProperties props; - props.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, - QScrollerProperties::OvershootAlwaysOff); - props.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, - QScrollerProperties::OvershootAlwaysOff); - scroller->setScrollerProperties(props); - RefreshGameDirectory(); } } @@ -1007,30 +1011,55 @@ void GameList::UpdateIconSize() { // Update sizes and stuff for the list view const u32 icon_size = UISettings::values.game_icon_size.GetValue(); - // the scaling on the card is kinda abysmal. - // TODO(crueter): refactor int heightMargin = 0; int widthMargin = 80; - switch (icon_size) { - case 128: - heightMargin = 70; - break; - case 0: - widthMargin = 120; - heightMargin = 120; - break; - case 64: - heightMargin = 80; - break; - case 32: - case 256: - heightMargin = 81; - break; + + if (UISettings::values.show_game_name) { + // the scaling on the card is kinda abysmal. + // TODO(crueter): refactor + switch (icon_size) { + case 128: + heightMargin = 65; + break; + case 0: + widthMargin = 120; + heightMargin = 120; + break; + case 64: + heightMargin = 77; + break; + case 32: + case 256: + heightMargin = 81; + break; + } + } else { + widthMargin = 24; + heightMargin = 24; } - // TODO(crueter): Auto size - list_view->setGridSize(QSize(icon_size + widthMargin, icon_size + heightMargin)); - m_gameCard->setSize(list_view->gridSize()); + // "auto" resize // + const int view_width = list_view->viewport()->width(); + + // Tiny space padding to prevent the list view from forcing its own resize operation. + const double spacing = 0.01; + const int min_item_width = icon_size + widthMargin; + + // And now stretch it a bit to fill out remaining space. + // Not perfect but works well enough for now + int columns = std::max(1, view_width / min_item_width); + int stretched_width = (view_width - (spacing * (columns - 1))) / columns; + + // only updates things if grid size is changed + QSize grid_size(stretched_width, icon_size + heightMargin); + if (list_view->gridSize() != grid_size) { + list_view->setUpdatesEnabled(false); + + list_view->setGridSize(grid_size); + m_gameCard->setSize(grid_size, stretched_width - min_item_width); + + list_view->setUpdatesEnabled(true); + } } void GameList::PopulateAsync(QVector& game_dirs) { @@ -1043,7 +1072,8 @@ void GameList::PopulateAsync(QVector& game_dirs) { tree_view->setColumnHidden(COLUMN_SIZE, !UISettings::values.show_size); tree_view->setColumnHidden(COLUMN_PLAY_TIME, !UISettings::values.show_play_time); - UpdateIconSize(); + if (!m_isTreeMode) + UpdateIconSize(); // Cancel any existing worker. current_worker.reset(); @@ -1266,6 +1296,23 @@ bool GameList::eventFilter(QObject* obj, QEvent* event) { return true; } + + if (obj == m_currentView->viewport() && event->type() == QEvent::MouseButtonPress) { + QMouseEvent* mouseEvent = static_cast(event); + + // if the user clicks outside of the list, deselect the current item. + QModelIndex index = m_currentView->indexAt(mouseEvent->pos()); + if (!index.isValid()) { + m_currentView->selectionModel()->clearSelection(); + m_currentView->setCurrentIndex(QModelIndex()); + } + } + + if (obj == list_view->viewport() && event->type() == QEvent::Resize) { + UpdateIconSize(); + return true; + } + return QWidget::eventFilter(obj, event); } diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 54fc778f80..327a7dffd2 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -112,6 +112,11 @@ + + + Game &Icon Size + + Reset Window Size to &720p @@ -145,6 +150,8 @@ + + @@ -586,6 +593,24 @@ &Grid View + + + Game Icon Size + + + + + None + + + + + true + + + Show Game &Name + + diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index def24ef5d3..2e5548c775 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -73,6 +73,7 @@ #include #include #include +#include // Qt Common // #include "qt_common/config/uisettings.h" @@ -377,6 +378,22 @@ static QString PrettyProductName() { return QSysInfo::prettyProductName(); } +namespace { + +constexpr std::array, 5> default_game_icon_sizes{ + std::make_pair(0, QT_TRANSLATE_NOOP("MainWindow", "None")), + std::make_pair(32, QT_TRANSLATE_NOOP("MainWindow", "Small (32x32)")), + std::make_pair(64, QT_TRANSLATE_NOOP("MainWindow", "Standard (64x64)")), + std::make_pair(128, QT_TRANSLATE_NOOP("MainWindow", "Large (128x128)")), + std::make_pair(256, QT_TRANSLATE_NOOP("MainWindow", "Full Size (256x256)")), +}; + +QString GetTranslatedGameIconSize(size_t index) { + return QCoreApplication::translate("MainWindow", default_game_icon_sizes[index].second); +} + +} + #ifndef _WIN32 // TODO(crueter): carboxyl does this, is it needed in qml? inline static bool isDarkMode() { @@ -1607,6 +1624,33 @@ void MainWindow::ConnectMenuEvents() { connect_menu(ui->action_Grid_View, &MainWindow::SetGridView); connect_menu(ui->action_Tree_View, &MainWindow::SetTreeView); + game_size_actions = new QActionGroup(this); + game_size_actions->setExclusive(true); + + for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { + const auto current_size = UISettings::values.game_icon_size.GetValue(); + const auto size = default_game_icon_sizes[i].first; + QAction *action = ui->menuGame_Icon_Size->addAction(GetTranslatedGameIconSize(i)); + action->setCheckable(true); + + if (current_size == size) action->setChecked(true); + + game_size_actions->addAction(action); + + connect(action, &QAction::triggered, this, [this, size](bool checked) { + if (checked) { + UISettings::values.game_icon_size.SetValue(size); + CheckIconSize(); + game_list->RefreshGameDirectory(); + } + }); + } + + CheckIconSize(); + + ui->action_Show_Game_Name->setChecked(UISettings::values.show_game_name.GetValue()); + connect(ui->action_Show_Game_Name, &QAction::triggered, this, &MainWindow::ToggleShowGameName); + // Multiplayer connect(ui->action_View_Lobby, &QAction::triggered, multiplayer_state, &MultiplayerState::OnViewLobby); @@ -3385,6 +3429,9 @@ void MainWindow::SetGameListMode(Settings::GameListMode mode) { ui->action_Tree_View->setChecked(mode == Settings::GameListMode::TreeView); UISettings::values.game_list_mode = mode; + ui->action_Show_Game_Name->setEnabled(mode == Settings::GameListMode::GridView); + + CheckIconSize(); game_list->ResetViewMode(); } @@ -3396,6 +3443,43 @@ void MainWindow::SetTreeView() { SetGameListMode(Settings::GameListMode::TreeView); } +void MainWindow::CheckIconSize() { + // When in grid view mode, with text off + // there is no point in having icons turned off.. + auto actions = game_size_actions->actions(); + if (UISettings::values.game_list_mode.GetValue() == Settings::GameListMode::GridView && + !UISettings::values.show_game_name.GetValue()) { + u32 newSize = UISettings::values.game_icon_size.GetValue(); + if (newSize == 0) { + newSize = 64; + UISettings::values.game_icon_size.SetValue(newSize); + } + + // Then disable the "none" action and update that menu. + for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { + const auto current_size = newSize; + const auto size = default_game_icon_sizes[i].first; + if (current_size == size) actions.at(i)->setChecked(true); + } + + // Update this if you add anything before None. + actions.at(0)->setEnabled(false); + } else { + actions.at(0)->setEnabled(true); + } +} + +void MainWindow::ToggleShowGameName() { + auto &setting = UISettings::values.show_game_name; + const bool newValue = !setting.GetValue(); + ui->action_Show_Game_Name->setChecked(newValue); + setting.SetValue(newValue); + + CheckIconSize(); + + game_list->RefreshGameDirectory(); +} + void MainWindow::OnConfigure() { const auto old_theme = UISettings::values.theme; const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); @@ -3916,7 +4000,6 @@ void MainWindow::OnDataDialog() { // refresh stuff in case it was cleared OnGameListRefresh(); - } void MainWindow::OnToggleFilterBar() { @@ -3939,7 +4022,6 @@ void MainWindow::OnGameListRefresh() { SetFirmwareVersion(); } - void MainWindow::LaunchFirmwareApplet(u64 raw_program_id, std::optional cabinet_mode) { auto const program_id = Service::AM::AppletProgramId(raw_program_id); auto result = FirmwareManager::VerifyFirmware(*QtCommon::system.get()); @@ -4658,6 +4740,11 @@ void MainWindow::OnLanguageChanged(const QString& locale) { qApp->removeTranslator(&translator); } + QList actions = game_size_actions->actions(); + for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { + actions.at(i)->setText(GetTranslatedGameIconSize(i)); + } + UISettings::values.language = locale.toStdString(); LoadTranslation(); ui->retranslateUi(this); diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 3261ccc9a1..ddabe21ae0 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -15,6 +15,7 @@ #include #include #include +#include #include "common/common_types.h" #include "common/settings_enums.h" @@ -407,6 +408,9 @@ private slots: void SetGridView(); void SetTreeView(); + void CheckIconSize(); + void ToggleShowGameName(); + void LaunchFirmwareApplet(u64 program_id, std::optional mode); void OnCreateHomeMenuDesktopShortcut(); void OnCreateHomeMenuApplicationMenuShortcut(); @@ -532,6 +536,8 @@ private: QString startup_icon_theme; + QActionGroup *game_size_actions; + // Debugger panes ControllerDialog* controller_dialog = nullptr; From e544cb3cf6702fdec9ce2edc9f601a9e37d91153 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sat, 7 Feb 2026 22:59:38 +0100 Subject: [PATCH 026/170] [nce] add split patch mode to support modules bigger than 128MB (#3489) nce patcher was extended to support modules larger than 128MB due to ARM64 branch limit. now added a pre-patch and (existing) post-patch module code. Allowwing MRS/MSR/SVC handler to remain within branch branch range Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3489 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey Co-authored-by: Maufeat Co-committed-by: Maufeat --- src/core/arm/nce/patcher.cpp | 479 ++++++++++++++++++++---------- src/core/arm/nce/patcher.h | 54 +++- src/core/hle/kernel/code_set.h | 12 + src/core/hle/kernel/k_process.cpp | 11 +- src/core/loader/nso.cpp | 36 ++- 5 files changed, 424 insertions(+), 168 deletions(-) diff --git a/src/core/arm/nce/patcher.cpp b/src/core/arm/nce/patcher.cpp index 28862c80b9..3a620bff12 100644 --- a/src/core/arm/nce/patcher.cpp +++ b/src/core/arm/nce/patcher.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -20,9 +20,13 @@ namespace Core::NCE { Patcher::Patcher(Patcher&& other) noexcept : patch_cache(std::move(other.patch_cache)), m_patch_instructions(std::move(other.m_patch_instructions)), + m_patch_instructions_pre(std::move(other.m_patch_instructions_pre)), c(m_patch_instructions), + c_pre(m_patch_instructions_pre), m_save_context(other.m_save_context), m_load_context(other.m_load_context), + m_save_context_pre(other.m_save_context_pre), + m_load_context_pre(other.m_load_context_pre), mode(other.mode), total_program_size(other.total_program_size), m_relocate_module_index(other.m_relocate_module_index), @@ -42,20 +46,25 @@ using NativeExecutionParameters = Kernel::KThread::NativeExecutionParameters; constexpr size_t MaxRelativeBranch = 128_MiB; constexpr u32 ModuleCodeIndex = 0x24 / sizeof(u32); -Patcher::Patcher() : c(m_patch_instructions) { +Patcher::Patcher() : c(m_patch_instructions), c_pre(m_patch_instructions_pre) { LOG_WARNING(Core_ARM, "Patcher initialized with LRU cache {}", patch_cache.isEnabled() ? "enabled" : "disabled"); // The first word of the patch section is always a branch to the first instruction of the // module. c.dw(0); + c_pre.dw(0); // Write save context helper function. c.l(m_save_context); WriteSaveContext(); + c_pre.l(m_save_context_pre); + WriteSaveContext(c_pre); // Write load context helper function. c.l(m_load_context); WriteLoadContext(); + c_pre.l(m_load_context_pre); + WriteLoadContext(c_pre); } Patcher::~Patcher() = default; @@ -64,7 +73,16 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, const Kernel::CodeSet::Segment& code) { // If we have patched modules but cannot reach the new module, then it needs its own patcher. const size_t image_size = program_image.size(); - if (total_program_size + image_size > MaxRelativeBranch && total_program_size > 0) { + + // Check if we need split mode for large modules. A64 max takes 128MB + // tests showed that, with update, some are larger. (In this case 208MB) + bool use_split = false; + if (image_size > MaxRelativeBranch) { + if (total_program_size > 0) { + return false; + } + use_split = true; + } else if (total_program_size + image_size > MaxRelativeBranch && total_program_size > 0) { return false; } @@ -74,7 +92,12 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, // The first word of the patch section is always a branch to the first instruction of the // module. - curr_patch->m_branch_to_module_relocations.push_back({0, 0}); + if (use_split) { + // curr_patch->m_branch_to_module_relocations.push_back({0, 0}); + curr_patch->m_branch_to_module_relocations_pre.push_back({0, 0}); + } else { + curr_patch->m_branch_to_module_relocations.push_back({0, 0}); + } // Retrieve text segment data. const auto text = std::span{program_image}.subspan(code.offset, code.size); @@ -85,12 +108,18 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, for (u32 i = ModuleCodeIndex; i < static_cast(text_words.size()); i++) { const u32 inst = text_words[i]; - const auto AddRelocations = [&] { + const auto AddRelocations = [&](bool& pre_buffer) { const uintptr_t this_offset = i * sizeof(u32); const uintptr_t next_offset = this_offset + sizeof(u32); - // Relocate from here to patch. - this->BranchToPatch(this_offset); + pre_buffer = use_split && (this_offset < MaxRelativeBranch); + + // Relocate to pre- or post-patch + if (pre_buffer) { + this->BranchToPatchPre(this_offset); + } else { + this->BranchToPatch(this_offset); + } // Relocate from patch to next instruction. return next_offset; @@ -98,7 +127,13 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, // SVC if (auto svc = SVC{inst}; svc.Verify()) { - WriteSvcTrampoline(AddRelocations(), svc.GetValue()); + bool pre_buffer = false; + auto ret = AddRelocations(pre_buffer); + if (pre_buffer) { + WriteSvcTrampoline(ret, svc.GetValue(), c_pre, m_save_context_pre, m_load_context_pre); + } else { + WriteSvcTrampoline(ret, svc.GetValue(), c, m_save_context, m_load_context); + } continue; } @@ -109,13 +144,25 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, const auto src_reg = mrs.GetSystemReg() == TpidrroEl0 ? oaknut::SystemReg::TPIDRRO_EL0 : oaknut::SystemReg::TPIDR_EL0; const auto dest_reg = oaknut::XReg{static_cast(mrs.GetRt())}; - WriteMrsHandler(AddRelocations(), dest_reg, src_reg); + bool pre_buffer = false; + auto ret = AddRelocations(pre_buffer); + if (pre_buffer) { + WriteMrsHandler(ret, dest_reg, src_reg, c_pre); + } else { + WriteMrsHandler(ret, dest_reg, src_reg, c); + } continue; } // MRS Xn, CNTPCT_EL0 if (auto mrs = MRS{inst}; mrs.Verify() && mrs.GetSystemReg() == CntpctEl0) { - WriteCntpctHandler(AddRelocations(), oaknut::XReg{static_cast(mrs.GetRt())}); + bool pre_buffer = false; + auto ret = AddRelocations(pre_buffer); + if (pre_buffer) { + WriteCntpctHandler(ret, oaknut::XReg{static_cast(mrs.GetRt())}, c_pre); + } else { + WriteCntpctHandler(ret, oaknut::XReg{static_cast(mrs.GetRt())}, c); + } continue; } @@ -126,7 +173,13 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, // MSR TPIDR_EL0, Xn if (auto msr = MSR{inst}; msr.Verify() && msr.GetSystemReg() == TpidrEl0) { - WriteMsrHandler(AddRelocations(), oaknut::XReg{static_cast(msr.GetRt())}); + bool pre_buffer = false; + auto ret = AddRelocations(pre_buffer); + if (pre_buffer) { + WriteMsrHandler(ret, oaknut::XReg{static_cast(msr.GetRt())}, c_pre); + } else { + WriteMsrHandler(ret, oaknut::XReg{static_cast(msr.GetRt())}, c); + } continue; } @@ -137,7 +190,11 @@ bool Patcher::PatchText(const Kernel::PhysicalMemory& program_image, // Determine patching mode for the final relocation step total_program_size += image_size; - this->mode = image_size > MaxRelativeBranch ? PatchMode::PreText : PatchMode::PostData; + if (use_split) { + this->mode = PatchMode::Split; + } else { + this->mode = image_size > MaxRelativeBranch ? PatchMode::PreText : PatchMode::PostData; + } return true; } @@ -146,7 +203,9 @@ bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, Kernel::PhysicalMemory& program_image, EntryTrampolines* out_trampolines) { const size_t patch_size = GetSectionSize(); - const size_t image_size = program_image.size(); + const size_t pre_patch_size = GetPreSectionSize(); + + const size_t image_size = (mode == PatchMode::Split) ? program_image.size() - pre_patch_size : program_image.size(); // Retrieve text segment data. const auto text = std::span{program_image}.subspan(code.offset, code.size); @@ -162,6 +221,16 @@ bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, } }; + const auto ApplyBranchToPatchRelocationPre = [&](u32* target, const Relocation& rel) { + oaknut::CodeGenerator rc{target}; + rc.B(static_cast(rel.patch_offset) - static_cast(pre_patch_size) - static_cast(rel.module_offset)); + }; + + const auto ApplyBranchToPatchRelocationPostSplit = [&](u32* target, const Relocation& rel) { + oaknut::CodeGenerator rc{target}; + rc.B(static_cast(image_size) + static_cast(rel.patch_offset) - static_cast(rel.module_offset)); + }; + const auto ApplyBranchToModuleRelocation = [&](u32* target, const Relocation& rel) { oaknut::CodeGenerator rc{target}; if (mode == PatchMode::PreText) { @@ -171,6 +240,16 @@ bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, } }; + const auto ApplyBranchToModuleRelocationPre = [&](u32* target, const Relocation& rel) { + oaknut::CodeGenerator rc{target}; + rc.B(static_cast(pre_patch_size) + static_cast(rel.module_offset) - static_cast(rel.patch_offset)); + }; + + const auto ApplyBranchToModuleRelocationPostSplit = [&](u32* target, const Relocation& rel) { + oaknut::CodeGenerator rc{target}; + rc.B(static_cast(rel.module_offset) - static_cast(image_size) - static_cast(rel.patch_offset)); + }; + const auto RebasePatch = [&](ptrdiff_t patch_offset) { if (mode == PatchMode::PreText) { return GetInteger(load_base) + patch_offset; @@ -182,28 +261,87 @@ bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, const auto RebasePc = [&](uintptr_t module_offset) { if (mode == PatchMode::PreText) { return GetInteger(load_base) + patch_size + module_offset; - } else { - return GetInteger(load_base) + module_offset; } + if (mode == PatchMode::Split) { + return GetInteger(load_base) + pre_patch_size + module_offset; + } + + return GetInteger(load_base) + module_offset; }; // We are now ready to relocate! auto& patch = modules[m_relocate_module_index++]; - for (const Relocation& rel : patch.m_branch_to_patch_relocations) { - ApplyBranchToPatchRelocation(text_words.data() + rel.module_offset / sizeof(u32), rel); - } - for (const Relocation& rel : patch.m_branch_to_module_relocations) { - ApplyBranchToModuleRelocation(m_patch_instructions.data() + rel.patch_offset / sizeof(u32), - rel); + + if (mode == PatchMode::Split) { + for (const Relocation& rel : patch.m_branch_to_pre_patch_relocations) { + ApplyBranchToPatchRelocationPre(text_words.data() + rel.module_offset / sizeof(u32), rel); + } + LOG_DEBUG(Core_ARM, "applied Pre: {}", patch.m_branch_to_pre_patch_relocations.size()); + + for (const Relocation& rel : patch.m_branch_to_patch_relocations) { + ApplyBranchToPatchRelocationPostSplit(text_words.data() + rel.module_offset / sizeof(u32), rel); + } + LOG_DEBUG(Core_ARM, "applied Post: {}", patch.m_branch_to_patch_relocations.size()); + + for (const Relocation& rel : patch.m_branch_to_module_relocations_pre) { + ApplyBranchToModuleRelocationPre(m_patch_instructions_pre.data() + rel.patch_offset / sizeof(u32), rel); + } + LOG_DEBUG(Core_ARM, "aplied Pre-module {}", patch.m_branch_to_module_relocations_pre.size()); + + for (const Relocation& rel : patch.m_branch_to_module_relocations) { + ApplyBranchToModuleRelocationPostSplit(m_patch_instructions.data() + rel.patch_offset / sizeof(u32), rel); + } + LOG_DEBUG(Core_ARM, "applied Post-module {}", patch.m_branch_to_module_relocations.size()); + + // Pre + for (const Relocation& rel : patch.m_write_module_pc_relocations_pre) { + oaknut::CodeGenerator rc{m_patch_instructions_pre.data() + rel.patch_offset / sizeof(u32)}; + rc.dx(RebasePc(rel.module_offset)); + } + // Post + for (const Relocation& rel : patch.m_write_module_pc_relocations) { + oaknut::CodeGenerator rc{m_patch_instructions.data() + rel.patch_offset / sizeof(u32)}; + rc.dx(RebasePc(rel.module_offset)); + } + + // Trampolines (split pre + post) + for (const Trampoline& rel : patch.m_trampolines_pre) { + out_trampolines->insert({RebasePc(rel.module_offset), + GetInteger(load_base) + rel.patch_offset}); + } + for (const Trampoline& rel : patch.m_trampolines) { + out_trampolines->insert({RebasePc(rel.module_offset), + GetInteger(load_base) + pre_patch_size + image_size + rel.patch_offset}); + } + + if (!m_patch_instructions_pre.empty()) { + u32 insn = m_patch_instructions_pre[0]; + if ((insn & 0xFC000000) == 0x14000000) { + s32 imm26 = insn & 0x3FFFFFF; + // Sign extend + if (imm26 & 0x2000000) imm26 |= 0xFC000000; + } + } + } else { + for (const Relocation& rel : patch.m_branch_to_patch_relocations) { + ApplyBranchToPatchRelocation(text_words.data() + rel.module_offset / sizeof(u32), rel); + } + for (const Relocation& rel : patch.m_branch_to_module_relocations) { + ApplyBranchToModuleRelocation(m_patch_instructions.data() + rel.patch_offset / sizeof(u32), + rel); + } + + // Rewrite PC constants + for (const Relocation& rel : patch.m_write_module_pc_relocations) { + oaknut::CodeGenerator rc{m_patch_instructions.data() + rel.patch_offset / sizeof(u32)}; + rc.dx(RebasePc(rel.module_offset)); + } } - // Rewrite PC constants and record post trampolines - for (const Relocation& rel : patch.m_write_module_pc_relocations) { - oaknut::CodeGenerator rc{m_patch_instructions.data() + rel.patch_offset / sizeof(u32)}; - rc.dx(RebasePc(rel.module_offset)); - } - for (const Trampoline& rel : patch.m_trampolines) { - out_trampolines->insert({RebasePc(rel.module_offset), RebasePatch(rel.patch_offset)}); + if (mode != PatchMode::Split) { + for (const Trampoline& rel : patch.m_trampolines) { + out_trampolines->insert({RebasePc(rel.module_offset), RebasePatch(rel.patch_offset)}); + } } // Cortex-A57 seems to treat all exclusives as ordered, but newer processors do not. @@ -223,6 +361,15 @@ bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, ASSERT(image_size == total_program_size); std::memcpy(program_image.data(), m_patch_instructions.data(), m_patch_instructions.size() * sizeof(u32)); + } else if (this->mode == PatchMode::Split) { + const size_t current_size = program_image.size(); + program_image.resize(current_size + patch_size); + // Copy pre-patch buffer to the beginning + std::memcpy(program_image.data(), m_patch_instructions_pre.data(), + m_patch_instructions_pre.size() * sizeof(u32)); + // Same for post-patch buffer to the end + std::memcpy(program_image.data() + current_size, m_patch_instructions.data(), + m_patch_instructions.size() * sizeof(u32)); } else { program_image.resize(image_size + patch_size); std::memcpy(program_image.data() + image_size, m_patch_instructions.data(), @@ -238,202 +385,225 @@ size_t Patcher::GetSectionSize() const noexcept { return Common::AlignUp(m_patch_instructions.size() * sizeof(u32), Core::Memory::YUZU_PAGESIZE); } -void Patcher::WriteLoadContext() { +size_t Patcher::GetPreSectionSize() const noexcept { + return Common::AlignUp(m_patch_instructions_pre.size() * sizeof(u32), Core::Memory::YUZU_PAGESIZE); +} + +void Patcher::WriteLoadContext(oaknut::VectorCodeGenerator& cg) { // This function was called, which modifies X30, so use that as a scratch register. // SP contains the guest X30, so save our return X30 to SP + 8, since we have allocated 16 bytes // of stack. - c.STR(X30, SP, 8); - c.MRS(X30, oaknut::SystemReg::TPIDR_EL0); - c.LDR(X30, X30, offsetof(NativeExecutionParameters, native_context)); + cg.STR(X30, SP, 8); + cg.MRS(X30, oaknut::SystemReg::TPIDR_EL0); + cg.LDR(X30, X30, offsetof(NativeExecutionParameters, native_context)); // Load system registers. - c.LDR(W0, X30, offsetof(GuestContext, fpsr)); - c.MSR(oaknut::SystemReg::FPSR, X0); - c.LDR(W0, X30, offsetof(GuestContext, fpcr)); - c.MSR(oaknut::SystemReg::FPCR, X0); - c.LDR(W0, X30, offsetof(GuestContext, nzcv)); - c.MSR(oaknut::SystemReg::NZCV, X0); + cg.LDR(W0, X30, offsetof(GuestContext, fpsr)); + cg.MSR(oaknut::SystemReg::FPSR, X0); + cg.LDR(W0, X30, offsetof(GuestContext, fpcr)); + cg.MSR(oaknut::SystemReg::FPCR, X0); + cg.LDR(W0, X30, offsetof(GuestContext, nzcv)); + cg.MSR(oaknut::SystemReg::NZCV, X0); // Load all vector registers. static constexpr size_t VEC_OFF = offsetof(GuestContext, vector_registers); for (int i = 0; i <= 30; i += 2) { - c.LDP(oaknut::QReg{i}, oaknut::QReg{i + 1}, X30, VEC_OFF + 16 * i); + cg.LDP(oaknut::QReg{i}, oaknut::QReg{i + 1}, X30, VEC_OFF + 16 * i); } // Load all general-purpose registers except X30. for (int i = 0; i <= 28; i += 2) { - c.LDP(oaknut::XReg{i}, oaknut::XReg{i + 1}, X30, 8 * i); + cg.LDP(oaknut::XReg{i}, oaknut::XReg{i + 1}, X30, 8 * i); } // Reload our return X30 from the stack and return. // The patch code will reload the guest X30 for us. - c.LDR(X30, SP, 8); - c.RET(); + cg.LDR(X30, SP, 8); + cg.RET(); } -void Patcher::WriteSaveContext() { +void Patcher::WriteSaveContext(oaknut::VectorCodeGenerator& cg) { // This function was called, which modifies X30, so use that as a scratch register. // SP contains the guest X30, so save our X30 to SP + 8, since we have allocated 16 bytes of // stack. - c.STR(X30, SP, 8); - c.MRS(X30, oaknut::SystemReg::TPIDR_EL0); - c.LDR(X30, X30, offsetof(NativeExecutionParameters, native_context)); + cg.STR(X30, SP, 8); + cg.MRS(X30, oaknut::SystemReg::TPIDR_EL0); + cg.LDR(X30, X30, offsetof(NativeExecutionParameters, native_context)); // Store all general-purpose registers except X30. for (int i = 0; i <= 28; i += 2) { - c.STP(oaknut::XReg{i}, oaknut::XReg{i + 1}, X30, 8 * i); + cg.STP(oaknut::XReg{i}, oaknut::XReg{i + 1}, X30, 8 * i); } // Store all vector registers. static constexpr size_t VEC_OFF = offsetof(GuestContext, vector_registers); for (int i = 0; i <= 30; i += 2) { - c.STP(oaknut::QReg{i}, oaknut::QReg{i + 1}, X30, VEC_OFF + 16 * i); + cg.STP(oaknut::QReg{i}, oaknut::QReg{i + 1}, X30, VEC_OFF + 16 * i); } // Store guest system registers, X30 and SP, using X0 as a scratch register. - c.STR(X0, SP, PRE_INDEXED, -16); - c.LDR(X0, SP, 16); - c.STR(X0, X30, 8 * 30); - c.ADD(X0, SP, 32); - c.STR(X0, X30, offsetof(GuestContext, sp)); - c.MRS(X0, oaknut::SystemReg::FPSR); - c.STR(W0, X30, offsetof(GuestContext, fpsr)); - c.MRS(X0, oaknut::SystemReg::FPCR); - c.STR(W0, X30, offsetof(GuestContext, fpcr)); - c.MRS(X0, oaknut::SystemReg::NZCV); - c.STR(W0, X30, offsetof(GuestContext, nzcv)); - c.LDR(X0, SP, POST_INDEXED, 16); + cg.STR(X0, SP, PRE_INDEXED, -16); + cg.LDR(X0, SP, 16); + cg.STR(X0, X30, 8 * 30); + cg.ADD(X0, SP, 32); + cg.STR(X0, X30, offsetof(GuestContext, sp)); + cg.MRS(X0, oaknut::SystemReg::FPSR); + cg.STR(W0, X30, offsetof(GuestContext, fpsr)); + cg.MRS(X0, oaknut::SystemReg::FPCR); + cg.STR(W0, X30, offsetof(GuestContext, fpcr)); + cg.MRS(X0, oaknut::SystemReg::NZCV); + cg.STR(W0, X30, offsetof(GuestContext, nzcv)); + cg.LDR(X0, SP, POST_INDEXED, 16); // Reload our return X30 from the stack, and return. - c.LDR(X30, SP, 8); - c.RET(); + cg.LDR(X30, SP, 8); + cg.RET(); } -void Patcher::WriteSvcTrampoline(ModuleDestLabel module_dest, u32 svc_id) { +void Patcher::WriteSvcTrampoline(ModuleDestLabel module_dest, u32 svc_id, oaknut::VectorCodeGenerator& cg, oaknut::Label& save_ctx, oaknut::Label& load_ctx) { + // Determine if we're writing to the pre-patch buffer + const bool is_pre = (&cg == &c_pre); + // We are about to start saving state, so we need to lock the context. - this->LockContext(); + this->LockContext(cg); // Store guest X30 to the stack. Then, save the context and restore the stack. // This will save all registers except PC, but we know PC at patch time. - c.STR(X30, SP, PRE_INDEXED, -16); - c.BL(m_save_context); - c.LDR(X30, SP, POST_INDEXED, 16); + cg.STR(X30, SP, PRE_INDEXED, -16); + cg.BL(save_ctx); + cg.LDR(X30, SP, POST_INDEXED, 16); // Now that we've saved all registers, we can use any registers as scratch. // Store PC + 4 to arm interface, since we know the instruction offset from the entry point. oaknut::Label pc_after_svc; - c.MRS(X1, oaknut::SystemReg::TPIDR_EL0); - c.LDR(X1, X1, offsetof(NativeExecutionParameters, native_context)); - c.LDR(X2, pc_after_svc); - c.STR(X2, X1, offsetof(GuestContext, pc)); + cg.MRS(X1, oaknut::SystemReg::TPIDR_EL0); + cg.LDR(X1, X1, offsetof(NativeExecutionParameters, native_context)); + cg.LDR(X2, pc_after_svc); + cg.STR(X2, X1, offsetof(GuestContext, pc)); // Store SVC number to execute when we return - c.MOV(X2, svc_id); - c.STR(W2, X1, offsetof(GuestContext, svc)); + cg.MOV(X2, svc_id); + cg.STR(W2, X1, offsetof(GuestContext, svc)); // We are calling a SVC. Clear esr_el1 and return it. static_assert(std::is_same_v, u64>); oaknut::Label retry; - c.ADD(X2, X1, offsetof(GuestContext, esr_el1)); - c.l(retry); - c.LDAXR(X0, X2); - c.STLXR(W3, XZR, X2); - c.CBNZ(W3, retry); + cg.ADD(X2, X1, offsetof(GuestContext, esr_el1)); + cg.l(retry); + cg.LDAXR(X0, X2); + cg.STLXR(W3, XZR, X2); + cg.CBNZ(W3, retry); // Add "calling SVC" flag. Since this is X0, this is now our return value. - c.ORR(X0, X0, static_cast(HaltReason::SupervisorCall)); + cg.ORR(X0, X0, static_cast(HaltReason::SupervisorCall)); // Offset the GuestContext pointer to the HostContext member. // STP has limited range of [-512, 504] which we can't reach otherwise // NB: Due to this all offsets below are from the start of HostContext. - c.ADD(X1, X1, offsetof(GuestContext, host_ctx)); + cg.ADD(X1, X1, offsetof(GuestContext, host_ctx)); // Reload host TPIDR_EL0 and SP. static_assert(offsetof(HostContext, host_sp) + 8 == offsetof(HostContext, host_tpidr_el0)); - c.LDP(X2, X3, X1, offsetof(HostContext, host_sp)); - c.MOV(SP, X2); - c.MSR(oaknut::SystemReg::TPIDR_EL0, X3); + cg.LDP(X2, X3, X1, offsetof(HostContext, host_sp)); + cg.MOV(SP, X2); + cg.MSR(oaknut::SystemReg::TPIDR_EL0, X3); // Load callee-saved host registers and return to host. static constexpr size_t HOST_REGS_OFF = offsetof(HostContext, host_saved_regs); static constexpr size_t HOST_VREGS_OFF = offsetof(HostContext, host_saved_vregs); - c.LDP(X19, X20, X1, HOST_REGS_OFF); - c.LDP(X21, X22, X1, HOST_REGS_OFF + 2 * sizeof(u64)); - c.LDP(X23, X24, X1, HOST_REGS_OFF + 4 * sizeof(u64)); - c.LDP(X25, X26, X1, HOST_REGS_OFF + 6 * sizeof(u64)); - c.LDP(X27, X28, X1, HOST_REGS_OFF + 8 * sizeof(u64)); - c.LDP(X29, X30, X1, HOST_REGS_OFF + 10 * sizeof(u64)); - c.LDP(Q8, Q9, X1, HOST_VREGS_OFF); - c.LDP(Q10, Q11, X1, HOST_VREGS_OFF + 2 * sizeof(u128)); - c.LDP(Q12, Q13, X1, HOST_VREGS_OFF + 4 * sizeof(u128)); - c.LDP(Q14, Q15, X1, HOST_VREGS_OFF + 6 * sizeof(u128)); - c.RET(); + cg.LDP(X19, X20, X1, HOST_REGS_OFF); + cg.LDP(X21, X22, X1, HOST_REGS_OFF + 2 * sizeof(u64)); + cg.LDP(X23, X24, X1, HOST_REGS_OFF + 4 * sizeof(u64)); + cg.LDP(X25, X26, X1, HOST_REGS_OFF + 6 * sizeof(u64)); + cg.LDP(X27, X28, X1, HOST_REGS_OFF + 8 * sizeof(u64)); + cg.LDP(X29, X30, X1, HOST_REGS_OFF + 10 * sizeof(u64)); + cg.LDP(Q8, Q9, X1, HOST_VREGS_OFF); + cg.LDP(Q10, Q11, X1, HOST_VREGS_OFF + 2 * sizeof(u128)); + cg.LDP(Q12, Q13, X1, HOST_VREGS_OFF + 4 * sizeof(u128)); + cg.LDP(Q14, Q15, X1, HOST_VREGS_OFF + 6 * sizeof(u128)); + cg.RET(); // Write the post-SVC trampoline address, which will jump back to the guest after restoring its // state. - curr_patch->m_trampolines.push_back({c.offset(), module_dest}); + if (is_pre) { + curr_patch->m_trampolines_pre.push_back({cg.offset(), module_dest}); + } else { + curr_patch->m_trampolines.push_back({cg.offset(), module_dest}); + } // Host called this location. Save the return address so we can // unwind the stack properly when jumping back. - c.MRS(X2, oaknut::SystemReg::TPIDR_EL0); - c.LDR(X2, X2, offsetof(NativeExecutionParameters, native_context)); - c.ADD(X0, X2, offsetof(GuestContext, host_ctx)); - c.STR(X30, X0, offsetof(HostContext, host_saved_regs) + 11 * sizeof(u64)); + cg.MRS(X2, oaknut::SystemReg::TPIDR_EL0); + cg.LDR(X2, X2, offsetof(NativeExecutionParameters, native_context)); + cg.ADD(X0, X2, offsetof(GuestContext, host_ctx)); + cg.STR(X30, X0, offsetof(HostContext, host_saved_regs) + 11 * sizeof(u64)); // Reload all guest registers except X30 and PC. // The function also expects 16 bytes of stack already allocated. - c.STR(X30, SP, PRE_INDEXED, -16); - c.BL(m_load_context); - c.LDR(X30, SP, POST_INDEXED, 16); + cg.STR(X30, SP, PRE_INDEXED, -16); + cg.BL(load_ctx); + cg.LDR(X30, SP, POST_INDEXED, 16); // Use X1 as a scratch register to restore X30. - c.STR(X1, SP, PRE_INDEXED, -16); - c.MRS(X1, oaknut::SystemReg::TPIDR_EL0); - c.LDR(X1, X1, offsetof(NativeExecutionParameters, native_context)); - c.LDR(X30, X1, offsetof(GuestContext, cpu_registers) + sizeof(u64) * 30); - c.LDR(X1, SP, POST_INDEXED, 16); + cg.STR(X1, SP, PRE_INDEXED, -16); + cg.MRS(X1, oaknut::SystemReg::TPIDR_EL0); + cg.LDR(X1, X1, offsetof(NativeExecutionParameters, native_context)); + cg.LDR(X30, X1, offsetof(GuestContext, cpu_registers) + sizeof(u64) * 30); + cg.LDR(X1, SP, POST_INDEXED, 16); // Unlock the context. - this->UnlockContext(); + this->UnlockContext(cg); // Jump back to the instruction after the emulated SVC. - this->BranchToModule(module_dest); + if (&cg == &c_pre) + this->BranchToModulePre(module_dest); + else + this->BranchToModule(module_dest); // Store PC after call. - c.l(pc_after_svc); - this->WriteModulePc(module_dest); + cg.l(pc_after_svc); + if (&cg == &c_pre) + this->WriteModulePcPre(module_dest); + else + this->WriteModulePc(module_dest); } void Patcher::WriteMrsHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg, - oaknut::SystemReg src_reg) { + oaknut::SystemReg src_reg, oaknut::VectorCodeGenerator& cg) { // Retrieve emulated TLS register from GuestContext. - c.MRS(dest_reg, oaknut::SystemReg::TPIDR_EL0); + cg.MRS(dest_reg, oaknut::SystemReg::TPIDR_EL0); if (src_reg == oaknut::SystemReg::TPIDRRO_EL0) { - c.LDR(dest_reg, dest_reg, offsetof(NativeExecutionParameters, tpidrro_el0)); + cg.LDR(dest_reg, dest_reg, offsetof(NativeExecutionParameters, tpidrro_el0)); } else { - c.LDR(dest_reg, dest_reg, offsetof(NativeExecutionParameters, tpidr_el0)); + cg.LDR(dest_reg, dest_reg, offsetof(NativeExecutionParameters, tpidr_el0)); } // Jump back to the instruction after the emulated MRS. - this->BranchToModule(module_dest); + if (&cg == &c_pre) + this->BranchToModulePre(module_dest); + else + this->BranchToModule(module_dest); } -void Patcher::WriteMsrHandler(ModuleDestLabel module_dest, oaknut::XReg src_reg) { +void Patcher::WriteMsrHandler(ModuleDestLabel module_dest, oaknut::XReg src_reg, oaknut::VectorCodeGenerator& cg) { const auto scratch_reg = src_reg.index() == 0 ? X1 : X0; - c.STR(scratch_reg, SP, PRE_INDEXED, -16); + cg.STR(scratch_reg, SP, PRE_INDEXED, -16); // Save guest value to NativeExecutionParameters::tpidr_el0. - c.MRS(scratch_reg, oaknut::SystemReg::TPIDR_EL0); - c.STR(src_reg, scratch_reg, offsetof(NativeExecutionParameters, tpidr_el0)); + cg.MRS(scratch_reg, oaknut::SystemReg::TPIDR_EL0); + cg.STR(src_reg, scratch_reg, offsetof(NativeExecutionParameters, tpidr_el0)); // Restore scratch register. - c.LDR(scratch_reg, SP, POST_INDEXED, 16); + cg.LDR(scratch_reg, SP, POST_INDEXED, 16); // Jump back to the instruction after the emulated MSR. - this->BranchToModule(module_dest); + if (&cg == &c_pre) + this->BranchToModulePre(module_dest); + else + this->BranchToModule(module_dest); } -void Patcher::WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg) { +void Patcher::WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg, oaknut::VectorCodeGenerator& cg) { static Common::Arm64::NativeClock clock{}; const auto factor = clock.GetGuestCNTFRQFactor(); const auto raw_factor = std::bit_cast>(factor); @@ -446,80 +616,83 @@ void Patcher::WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_ oaknut::Label factorhi; // Save scratches. - c.STP(scratch0, scratch1, SP, PRE_INDEXED, -16); + cg.STP(scratch0, scratch1, SP, PRE_INDEXED, -16); // Load counter value. - c.MRS(dest_reg, oaknut::SystemReg::CNTVCT_EL0); + cg.MRS(dest_reg, oaknut::SystemReg::CNTVCT_EL0); // Load scaling factor. - c.LDR(scratch0, factorlo); - c.LDR(scratch1, factorhi); + cg.LDR(scratch0, factorlo); + cg.LDR(scratch1, factorhi); // Multiply low bits and get result. - c.UMULH(scratch0, dest_reg, scratch0); + cg.UMULH(scratch0, dest_reg, scratch0); // Multiply high bits and add low bit result. - c.MADD(dest_reg, dest_reg, scratch1, scratch0); + cg.MADD(dest_reg, dest_reg, scratch1, scratch0); // Reload scratches. - c.LDP(scratch0, scratch1, SP, POST_INDEXED, 16); + cg.LDP(scratch0, scratch1, SP, POST_INDEXED, 16); // Jump back to the instruction after the emulated MRS. - this->BranchToModule(module_dest); + if (&cg == &c_pre) + this->BranchToModulePre(module_dest); + else + this->BranchToModule(module_dest); // Scaling factor constant values. - c.l(factorlo); - c.dx(raw_factor[0]); - c.l(factorhi); - c.dx(raw_factor[1]); + cg.l(factorlo); + cg.dx(raw_factor[0]); + cg.l(factorhi); + cg.dx(raw_factor[1]); } -void Patcher::LockContext() { +void Patcher::LockContext(oaknut::VectorCodeGenerator& cg) { oaknut::Label retry; // Save scratches. - c.STP(X0, X1, SP, PRE_INDEXED, -16); + cg.STP(X0, X1, SP, PRE_INDEXED, -16); // Reload lock pointer. - c.l(retry); - c.CLREX(); - c.MRS(X0, oaknut::SystemReg::TPIDR_EL0); - c.ADD(X0, X0, offsetof(NativeExecutionParameters, lock)); + cg.l(retry); + cg.CLREX(); + cg.MRS(X0, oaknut::SystemReg::TPIDR_EL0); + cg.ADD(X0, X0, offsetof(NativeExecutionParameters, lock)); static_assert(SpinLockLocked == 0); // Load-linked with acquire ordering. - c.LDAXR(W1, X0); + cg.LDAXR(W1, X0); // If the value was SpinLockLocked, clear monitor and retry. - c.CBZ(W1, retry); + cg.CBZ(W1, retry); // Store-conditional SpinLockLocked with relaxed ordering. - c.STXR(W1, WZR, X0); + cg.STXR(W1, WZR, X0); // If we failed to store, retry. - c.CBNZ(W1, retry); + cg.CBNZ(W1, retry); // We succeeded! Reload scratches. - c.LDP(X0, X1, SP, POST_INDEXED, 16); + cg.LDP(X0, X1, SP, POST_INDEXED, 16); } -void Patcher::UnlockContext() { +void Patcher::UnlockContext(oaknut::VectorCodeGenerator& cg) { // Save scratches. - c.STP(X0, X1, SP, PRE_INDEXED, -16); + cg.STP(X0, X1, SP, PRE_INDEXED, -16); // Load lock pointer. - c.MRS(X0, oaknut::SystemReg::TPIDR_EL0); - c.ADD(X0, X0, offsetof(NativeExecutionParameters, lock)); + cg.MRS(X0, oaknut::SystemReg::TPIDR_EL0); + cg.ADD(X0, X0, offsetof(NativeExecutionParameters, lock)); // Load SpinLockUnlocked. - c.MOV(W1, SpinLockUnlocked); + cg.MOV(W1, SpinLockUnlocked); // Store value with release ordering. - c.STLR(W1, X0); + cg.STLR(W1, X0); // Load scratches. - c.LDP(X0, X1, SP, POST_INDEXED, 16); + cg.LDP(X0, X1, SP, POST_INDEXED, 16); } } // namespace Core::NCE diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index 31b122477f..f2b11fcda0 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -41,6 +41,7 @@ enum class PatchMode : u32 { None, PreText, ///< Patch section is inserted before .text PostData, ///< Patch section is inserted after .data + Split, ///< Patch sections are inserted before .text and after .data }; using ModuleTextAddress = u64; @@ -63,6 +64,7 @@ public: bool RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, Kernel::PhysicalMemory& program_image, EntryTrampolines* out_trampolines); size_t GetSectionSize() const noexcept; + size_t GetPreSectionSize() const noexcept; [[nodiscard]] PatchMode GetPatchMode() const noexcept { return mode; @@ -76,15 +78,25 @@ private: uintptr_t module_offset; }; - void WriteLoadContext(); - void WriteSaveContext(); - void LockContext(); - void UnlockContext(); - void WriteSvcTrampoline(ModuleDestLabel module_dest, u32 svc_id); - void WriteMrsHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg, - oaknut::SystemReg src_reg); - void WriteMsrHandler(ModuleDestLabel module_dest, oaknut::XReg src_reg); - void WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg); + // Core implementations with explicit code generator + void WriteLoadContext(oaknut::VectorCodeGenerator& code); + void WriteSaveContext(oaknut::VectorCodeGenerator& code); + void LockContext(oaknut::VectorCodeGenerator& code); + void UnlockContext(oaknut::VectorCodeGenerator& code); + void WriteSvcTrampoline(ModuleDestLabel module_dest, u32 svc_id, oaknut::VectorCodeGenerator& code, oaknut::Label& save_ctx, oaknut::Label& load_ctx); + void WriteMrsHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg, oaknut::SystemReg src_reg, oaknut::VectorCodeGenerator& code); + void WriteMsrHandler(ModuleDestLabel module_dest, oaknut::XReg src_reg, oaknut::VectorCodeGenerator& code); + void WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg, oaknut::VectorCodeGenerator& code); + + // Convenience wrappers using default code generator + void WriteLoadContext() { WriteLoadContext(c); } + void WriteSaveContext() { WriteSaveContext(c); } + void LockContext() { LockContext(c); } + void UnlockContext() { UnlockContext(c); } + void WriteSvcTrampoline(ModuleDestLabel module_dest, u32 svc_id) { WriteSvcTrampoline(module_dest, svc_id, c, m_save_context, m_load_context); } + void WriteMrsHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg, oaknut::SystemReg src_reg) { WriteMrsHandler(module_dest, dest_reg, src_reg, c); } + void WriteMsrHandler(ModuleDestLabel module_dest, oaknut::XReg src_reg) { WriteMsrHandler(module_dest, src_reg, c); } + void WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg) { WriteCntpctHandler(module_dest, dest_reg, c); } private: static constexpr size_t CACHE_SIZE = 16384; // Cache size for patch entries @@ -111,19 +123,34 @@ private: } } + void BranchToPatchPre(uintptr_t module_dest) { + curr_patch->m_branch_to_pre_patch_relocations.push_back({c_pre.offset(), module_dest}); + } + void BranchToModule(uintptr_t module_dest) { curr_patch->m_branch_to_module_relocations.push_back({c.offset(), module_dest}); c.dw(0); } + void BranchToModulePre(uintptr_t module_dest) { + curr_patch->m_branch_to_module_relocations_pre.push_back({c_pre.offset(), module_dest}); + c_pre.dw(0); + } + void WriteModulePc(uintptr_t module_dest) { curr_patch->m_write_module_pc_relocations.push_back({c.offset(), module_dest}); c.dx(0); } + void WriteModulePcPre(uintptr_t module_dest) { + curr_patch->m_write_module_pc_relocations_pre.push_back({c_pre.offset(), module_dest}); + c_pre.dx(0); + } + private: // List of patch instructions we have generated. std::vector m_patch_instructions{}; + std::vector m_patch_instructions_pre{}; // Relocation type for relative branch from module to patch. struct Relocation { @@ -133,15 +160,22 @@ private: struct ModulePatch { std::vector m_trampolines; + std::vector m_trampolines_pre; std::vector m_branch_to_patch_relocations{}; + std::vector m_branch_to_pre_patch_relocations{}; std::vector m_branch_to_module_relocations{}; + std::vector m_branch_to_module_relocations_pre{}; std::vector m_write_module_pc_relocations{}; + std::vector m_write_module_pc_relocations_pre{}; std::vector m_exclusives{}; }; oaknut::VectorCodeGenerator c; + oaknut::VectorCodeGenerator c_pre; oaknut::Label m_save_context{}; oaknut::Label m_load_context{}; + oaknut::Label m_save_context_pre{}; + oaknut::Label m_load_context_pre{}; PatchMode mode{PatchMode::None}; size_t total_program_size{}; size_t m_relocate_module_index{}; diff --git a/src/core/hle/kernel/code_set.h b/src/core/hle/kernel/code_set.h index 4d2d0098e7..1416fc52b1 100644 --- a/src/core/hle/kernel/code_set.h +++ b/src/core/hle/kernel/code_set.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -83,6 +86,14 @@ struct CodeSet final { const Segment& PatchSegment() const { return patch_segment; } + + Segment& PostPatchSegment() { + return post_patch_segment; + } + + const Segment& PostPatchSegment() const { + return post_patch_segment; + } #endif /// The overall data that backs this code set. @@ -93,6 +104,7 @@ struct CodeSet final { #ifdef HAS_NCE Segment patch_segment; + Segment post_patch_segment; #endif /// The entry point address for this code set. diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index 082049f957..bd50f74c27 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -1258,6 +1258,7 @@ void KProcess::LoadModule(CodeSet code_set, KProcessAddress base_addr) { #ifdef HAS_NCE const auto& patch = code_set.PatchSegment(); + const auto& post_patch = code_set.PostPatchSegment(); if (this->IsApplication() && Settings::IsNceEnabled() && patch.size != 0) { auto& buffer = m_kernel.System().DeviceMemory().buffer; const auto& code = code_set.CodeSegment(); @@ -1265,7 +1266,15 @@ void KProcess::LoadModule(CodeSet code_set, KProcessAddress base_addr) { Common::MemoryPermission::Read | Common::MemoryPermission::Execute); buffer.Protect(GetInteger(base_addr + patch.addr), patch.size, Common::MemoryPermission::Read | Common::MemoryPermission::Execute); + // Protect post-patch segment if it exists like abve + if (post_patch.size != 0) { + buffer.Protect(GetInteger(base_addr + post_patch.addr), post_patch.size, + Common::MemoryPermission::Read | Common::MemoryPermission::Execute); + } ReprotectSegment(code_set.PatchSegment(), Svc::MemoryPermission::None); + if (post_patch.size != 0) { + ReprotectSegment(code_set.PostPatchSegment(), Svc::MemoryPermission::None); + } } #endif } diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index e3e3f83ca2..458df110b6 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -102,6 +102,8 @@ std::optional AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core:: auto* patch = &patches->operator[](patch_index); if (patch->GetPatchMode() == Core::NCE::PatchMode::PreText) { return patch->GetSectionSize(); + } else if (patch->GetPatchMode() == Core::NCE::PatchMode::Split) { + return patch->GetPreSectionSize(); } } #endif @@ -178,12 +180,26 @@ std::optional AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core:: } } else if (patch) { // Relocate code patch and copy to the program_image. + // Save size before RelocateAndCopy (which may resize) + const size_t size_before_relocate = program_image.size(); if (patch->RelocateAndCopy(load_base, code, program_image, &process.GetPostHandlers())) { // Update patch section. auto& patch_segment = codeset.PatchSegment(); - patch_segment.addr = - patch->GetPatchMode() == Core::NCE::PatchMode::PreText ? 0 : image_size; - patch_segment.size = static_cast(patch->GetSectionSize()); + auto& post_patch_segment = codeset.PostPatchSegment(); + const auto patch_mode = patch->GetPatchMode(); + if (patch_mode == Core::NCE::PatchMode::PreText) { + patch_segment.addr = 0; + patch_segment.size = static_cast(patch->GetSectionSize()); + } else if (patch_mode == Core::NCE::PatchMode::Split) { + // For Split-mode, we are using pre-patch buffer at start, post-patch buffer at end + patch_segment.addr = 0; + patch_segment.size = static_cast(patch->GetPreSectionSize()); + post_patch_segment.addr = size_before_relocate; + post_patch_segment.size = static_cast(patch->GetSectionSize()); + } else { + patch_segment.addr = image_size; + patch_segment.size = static_cast(patch->GetSectionSize()); + } } // Refresh image_size to take account the patch section if it was added by RelocateAndCopy @@ -193,6 +209,18 @@ std::optional AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core:: // If we aren't actually loading (i.e. just computing the process code layout), we are done if (!load_into_process) { +#ifdef HAS_NCE + // Ok, so for Split mode, we need to account for pre-patch and post-patch space + // which will be added during RelocateAndCopy in the second pass. Where it crashed + // in Android Studio at PreText. May be a better way. Works for now. + if (patch && patch->GetPatchMode() == Core::NCE::PatchMode::Split) { + return load_base + patch->GetPreSectionSize() + image_size + patch->GetSectionSize(); + } else if (patch && patch->GetPatchMode() == Core::NCE::PatchMode::PreText) { + return load_base + patch->GetSectionSize() + image_size; + } else if (patch && patch->GetPatchMode() == Core::NCE::PatchMode::PostData) { + return load_base + image_size + patch->GetSectionSize(); + } +#endif return load_base + image_size; } From a56b8d3de8af670fb1d8c70211ca5275c1aa4c52 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 9 Feb 2026 01:14:32 +0100 Subject: [PATCH 027/170] [core, windows] remove microSleep() and simply wait on events like on linux (#3498) we shall see if the original code was put there for a reason or if the microsleeps actually are horrid Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3498 Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/CMakeLists.txt | 4 +- src/common/x64/cpu_wait.cpp | 78 ------------------------------------- src/common/x64/cpu_wait.h | 10 ----- src/core/core_timing.cpp | 29 +------------- 4 files changed, 3 insertions(+), 118 deletions(-) delete mode 100644 src/common/x64/cpu_wait.cpp delete mode 100644 src/common/x64/cpu_wait.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 3d09c1caea..042f5c7bd9 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2018 yuzu Emulator Project SPDX-License-Identifier: @@ -186,8 +186,6 @@ if(ARCHITECTURE_x86_64) common PRIVATE x64/cpu_detect.cpp x64/cpu_detect.h - x64/cpu_wait.cpp - x64/cpu_wait.h x64/native_clock.cpp x64/native_clock.h x64/rdtsc.cpp diff --git a/src/common/x64/cpu_wait.cpp b/src/common/x64/cpu_wait.cpp deleted file mode 100644 index 12f2e9d4b1..0000000000 --- a/src/common/x64/cpu_wait.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#ifdef _MSC_VER -#include -#endif - -#include "common/x64/cpu_detect.h" -#include "common/x64/cpu_wait.h" -#include "common/x64/rdtsc.h" - -namespace Common::X64 { - -namespace { - -// 100,000 cycles is a reasonable amount of time to wait to save on CPU resources. -// For reference: -// At 1 GHz, 100K cycles is 100us -// At 2 GHz, 100K cycles is 50us -// At 4 GHz, 100K cycles is 25us -constexpr auto PauseCycles = 100'000U; - -} // Anonymous namespace - -#if defined(_MSC_VER) && !defined(__clang__) -__forceinline static void TPAUSE() { - static constexpr auto RequestC02State = 0U; - _tpause(RequestC02State, FencedRDTSC() + PauseCycles); -} - -__forceinline static void MWAITX() { - static constexpr auto EnableWaitTimeFlag = 1U << 1; - static constexpr auto RequestC1State = 0U; - - // monitor_var should be aligned to a cache line. - alignas(64) u64 monitor_var{}; - _mm_monitorx(&monitor_var, 0, 0); - _mm_mwaitx(EnableWaitTimeFlag, RequestC1State, PauseCycles); -} -#else -static void TPAUSE() { - static constexpr auto RequestC02State = 0U; - const auto tsc = FencedRDTSC() + PauseCycles; - const auto eax = static_cast(tsc & 0xFFFFFFFF); - const auto edx = static_cast(tsc >> 32); - asm volatile("tpause %0" : : "r"(RequestC02State), "d"(edx), "a"(eax)); -} - -static void MWAITX() { - static constexpr auto EnableWaitTimeFlag = 1U << 1; - static constexpr auto RequestC1State = 0U; - - // monitor_var should be aligned to a cache line. - alignas(64) u64 monitor_var{}; - asm volatile("monitorx" : : "a"(&monitor_var), "c"(0), "d"(0)); - asm volatile("mwaitx" : : "a"(RequestC1State), "b"(PauseCycles), "c"(EnableWaitTimeFlag)); -} -#endif - -void MicroSleep() { - static const bool has_waitpkg = GetCPUCaps().waitpkg; - static const bool has_monitorx = GetCPUCaps().monitorx; - - if (has_waitpkg) { - TPAUSE(); - } else if (has_monitorx) { - MWAITX(); - } else { - std::this_thread::yield(); - } -} - -} // namespace Common::X64 diff --git a/src/common/x64/cpu_wait.h b/src/common/x64/cpu_wait.h deleted file mode 100644 index 99d3757a76..0000000000 --- a/src/common/x64/cpu_wait.h +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -namespace Common::X64 { - -void MicroSleep(); - -} // namespace Common::X64 diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 5a582c8cff..b0fa7cd503 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -13,10 +13,6 @@ #include "common/windows/timer_resolution.h" #endif -#ifdef ARCHITECTURE_x86_64 -#include "common/x64/cpu_wait.h" -#endif - #include "common/settings.h" #include "core/core_timing.h" #include "core/hardware_properties.h" @@ -287,28 +283,7 @@ void CoreTiming::ThreadLoop() { if (next_time) { // There are more events left in the queue, wait until the next event. auto wait_time = *next_time - GetGlobalTimeNs().count(); - if (wait_time > 0) { -#ifdef _WIN32 - while (!paused && !event.IsSet() && wait_time > 0) { - wait_time = *next_time - GetGlobalTimeNs().count(); - if (wait_time >= timer_resolution_ns) { - Common::Windows::SleepForOneTick(); - } else { -#ifdef ARCHITECTURE_x86_64 - Common::X64::MicroSleep(); -#else - std::this_thread::yield(); -#endif - } - } - - if (event.IsSet()) { - event.Reset(); - } -#else - event.WaitFor(std::chrono::nanoseconds(wait_time)); -#endif - } + event.WaitFor(std::chrono::nanoseconds(wait_time)); } else { // Queue is empty, wait until another event is scheduled and signals us to // continue. From 866881d0e36721f52ce3d788c2a33c28ad1fcaeb Mon Sep 17 00:00:00 2001 From: MrPurple666 Date: Mon, 9 Feb 2026 04:26:43 +0100 Subject: [PATCH 028/170] [android] add FD_DEV_FEATURES in env loader (#3493) This environment variable fixes some glitches in OneUI 7 and HyperOS 3. Thanks StevenMX for letting me know. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3493 Reviewed-by: CamilleLaVey Co-authored-by: MrPurple666 Co-committed-by: MrPurple666 --- .../yuzu_emu/fragments/FreedrenoSettingsFragment.kt | 4 ++-- .../org/yuzu/yuzu_emu/utils/NativeFreedrenoConfig.kt | 12 +++++++++++- src/android/app/src/main/jni/native_freedreno.cpp | 7 ++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt index c86ef0b800..40111272d5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/FreedrenoSettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -110,7 +110,7 @@ class FreedrenoSettingsFragment : Fragment() { val commonVars = listOf( "TU_DEBUG", "FD_MESA_DEBUG", "IR3_SHADER_DEBUG", "FD_RD_DUMP", "FD_RD_DUMP_FRAMES", "FD_RD_DUMP_TESTNAME", - "TU_BREADCRUMBS" + "TU_BREADCRUMBS", "FD_DEV_FEATURES" ) for (varName in commonVars) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeFreedrenoConfig.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeFreedrenoConfig.kt index 44d5ac5b7f..f9c3f71c36 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeFreedrenoConfig.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeFreedrenoConfig.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.utils @@ -144,6 +144,15 @@ object FreedrenoPresets { ) ) + val DEV_FEATURES_UBWC_HINT = FreedrenoPreset( + name = "Dev - UBWC Flag Hint", + description = "Enable TP UBWC flag hint for development", + icon = "ic_dev_features", + variables = mapOf( + "FD_DEV_FEATURES" to "enable_tp_ubwc_flag_hint=1" + ) + ) + val PERFORMANCE_DEFAULT = FreedrenoPreset( name = "Performance - Default", description = "Clear all debug options for performance", @@ -159,6 +168,7 @@ object FreedrenoPresets { CAPTURE_FRAMES, SHADER_DEBUG, GPU_HANG_TRACE, + DEV_FEATURES_UBWC_HINT, PERFORMANCE_DEFAULT ) } diff --git a/src/android/app/src/main/jni/native_freedreno.cpp b/src/android/app/src/main/jni/native_freedreno.cpp index 0879a85ea8..15c798e5ef 100644 --- a/src/android/app/src/main/jni/native_freedreno.cpp +++ b/src/android/app/src/main/jni/native_freedreno.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /** @@ -258,6 +258,11 @@ Java_org_yuzu_yuzu_1emu_utils_NativeFreedrenoConfig_setFreedrenoEnv( } LOG_INFO(Frontend, "[Freedreno] Set {}={}", var_name, value); + + if (var_name == "FD_DEV_FEATURES") { + LOG_INFO(Frontend, "[Freedreno] FD_DEV_FEATURES enabled: {}", value); + } + return JNI_TRUE; } From 0f8b35c4cd0f8d09b38edc52b006472cd98540fc Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 9 Feb 2026 21:21:14 +0100 Subject: [PATCH 029/170] [vk, macos] fix missing VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT sType (#3510) sType wasn't properly set for the creationInfo struct (was init to 0) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3510 Reviewed-by: CamilleLaVey Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- src/video_core/vulkan_common/vulkan_surface.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/video_core/vulkan_common/vulkan_surface.cpp b/src/video_core/vulkan_common/vulkan_surface.cpp index f1b56cc0a8..dc65d3960a 100644 --- a/src/video_core/vulkan_common/vulkan_surface.cpp +++ b/src/video_core/vulkan_common/vulkan_surface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -32,13 +32,15 @@ vk::SurfaceKHR CreateSurface( } #elif defined(__APPLE__) if (window_info.type == Core::Frontend::WindowSystemType::Cocoa) { - const VkMetalSurfaceCreateInfoEXT macos_ci = { + const VkMetalSurfaceCreateInfoEXT metal_ci = { + .sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT, + .pNext = nullptr, + .flags = 0, .pLayer = static_cast(window_info.render_surface), }; - const auto vkCreateMetalSurfaceEXT = reinterpret_cast( - dld.vkGetInstanceProcAddr(*instance, "vkCreateMetalSurfaceEXT")); + const auto vkCreateMetalSurfaceEXT = reinterpret_cast(dld.vkGetInstanceProcAddr(*instance, "vkCreateMetalSurfaceEXT")); if (!vkCreateMetalSurfaceEXT || - vkCreateMetalSurfaceEXT(*instance, &macos_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { + vkCreateMetalSurfaceEXT(*instance, &metal_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { LOG_ERROR(Render_Vulkan, "Failed to initialize Metal surface"); throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); } From a8093c2a3cf98ccccabeb1d6a2c1ccc5e191557f Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 10 Feb 2026 03:34:07 +0100 Subject: [PATCH 030/170] [*] change all std::unordered_map and std::unordered_set into ankerl::unordered_dense::map/set variants (#3442) mainly doing this to reduce memory footprint; we all know how nice ankerl::unordered_dense is in theory 4x faster - in practice these maps arent that "hot" anyways so not likely to have much perf gained i just want to reduce mem fragmentation to ease my porting process, plus it helps other platforms as well (ahem weak Mediatek devices) :) Signed-off-by: lizzie Co-authored-by: Caio Oliveira Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3442 Reviewed-by: DraVee Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- ...-memset-when-clearing-an-empty-table.patch | 26 +++++++++++++++++++ CMakeLists.txt | 1 + externals/CMakeLists.txt | 6 ++--- externals/cpmfile.json | 9 ++++--- .../app/src/main/jni/game_metadata.cpp | 5 +++- src/android/app/src/main/jni/native_input.cpp | 5 +++- src/common/CMakeLists.txt | 2 +- src/common/fs/path_util.cpp | 8 +++--- src/common/host_memory.cpp | 6 ++--- src/common/input.h | 7 +++-- src/common/param_package.h | 7 +++-- src/core/arm/dynarmic/arm_dynarmic_64.h | 4 +-- src/core/arm/nce/lru_cache.h | 6 ++--- src/core/arm/nce/patcher.h | 4 +-- src/core/file_sys/vfs/vfs_layered.cpp | 9 ++++--- src/core/hle/kernel/k_process.h | 6 ++--- src/core/hle/kernel/kernel.cpp | 8 +++--- src/core/hle/kernel/kernel.h | 4 +-- .../am/frontend/applet_web_browser_types.h | 6 ++--- .../hle/service/bcat/news/builtin_news.cpp | 4 +-- src/core/hle/service/bcat/news/news_storage.h | 6 ++--- src/core/hle/service/caps/caps_manager.h | 7 +++-- src/core/hle/service/ldn/lan_discovery.h | 6 ++--- src/core/hle/service/lm/lm.cpp | 6 ++--- src/core/hle/service/nifm/nifm.cpp | 4 +-- src/core/hle/service/nvdrv/core/container.h | 5 +++- src/core/hle/service/nvdrv/core/nvmap.h | 7 +++-- .../hle/service/nvdrv/devices/nvhost_as_gpu.h | 6 ++--- .../hle/service/nvdrv/devices/nvhost_gpu.h | 4 +-- .../nvdrv/devices/nvhost_nvdec_common.h | 7 +++-- src/core/hle/service/nvdrv/devices/nvmap.h | 7 +++-- src/core/hle/service/nvdrv/nvdrv.h | 9 ++++--- .../nvnflinger/hos_binder_driver_server.h | 9 ++++--- src/core/hle/service/olsc/daemon_controller.h | 10 +++---- src/core/hle/service/sm/sm.h | 8 +++--- src/core/hle/service/vi/conductor.h | 7 +++-- src/core/launch_timestamp_cache.cpp | 6 ++--- src/dynarmic/CMakeLists.txt | 1 + src/dynarmic/src/dynarmic/CMakeLists.txt | 18 +++---------- src/dynarmic/tests/A64/fibonacci.cpp | 6 ++--- src/dynarmic/tests/A64/testenv.h | 6 ++--- src/hid_core/frontend/emulated_console.h | 7 +++-- src/hid_core/frontend/emulated_controller.h | 6 ++--- src/hid_core/frontend/emulated_devices.h | 7 +++-- src/input_common/drivers/android.h | 5 +++- src/input_common/drivers/sdl_driver.cpp | 4 +-- src/input_common/drivers/sdl_driver.h | 7 +++-- src/input_common/input_engine.h | 17 +++++++----- src/input_common/main.h | 11 +++++--- src/shader_recompiler/environment.h | 8 +++--- .../maxwell/structured_control_flow.cpp | 6 ++--- .../ir_opt/ssa_rewrite_pass.cpp | 14 +++++++--- src/shader_recompiler/ir_opt/texture_pass.cpp | 2 +- src/tests/common/fibers.cpp | 7 +++-- src/tests/video_core/memory_tracker.cpp | 4 +-- .../buffer_cache/buffer_cache_base.h | 4 +-- .../buffer_cache/memory_tracker_base.h | 4 +-- src/video_core/control/channel_state_cache.h | 8 +++--- src/video_core/control/scheduler.h | 7 +++-- src/video_core/engines/maxwell_3d.h | 4 +-- .../engines/sw_blitter/converter.cpp | 6 ++--- src/video_core/gpu.cpp | 4 +-- src/video_core/gpu_logging/gpu_logging.h | 4 +-- src/video_core/host1x/codecs/decoder.h | 5 +++- src/video_core/host1x/host1x.h | 12 ++++----- src/video_core/macro.h | 8 +++--- src/video_core/query_cache.h | 8 +++--- src/video_core/query_cache/query_cache.h | 4 +-- src/video_core/query_cache/query_cache_base.h | 9 ++++--- .../renderer_opengl/gl_buffer_cache.h | 6 ++--- .../renderer_opengl/gl_shader_cache.h | 9 ++++--- .../renderer_opengl/gl_texture_cache.h | 4 +-- .../renderer_vulkan/vk_pipeline_cache.h | 9 ++++--- .../renderer_vulkan/vk_query_cache.cpp | 8 +++--- .../renderer_vulkan/vk_render_pass_cache.cpp | 2 +- .../renderer_vulkan/vk_render_pass_cache.h | 7 +++-- src/video_core/shader_cache.h | 8 +++--- src/video_core/shader_environment.h | 18 ++++++------- src/video_core/texture_cache/texture_cache.h | 10 +++---- .../texture_cache/texture_cache_base.h | 23 ++++++++-------- .../vulkan_common/vulkan_device.cpp | 10 +++---- src/video_core/vulkan_common/vulkan_device.h | 4 +-- src/yuzu/compatibility_list.h | 7 +++-- src/yuzu/configuration/input_profiles.h | 6 ++--- src/yuzu/loading_screen.cpp | 5 +++- src/yuzu/loading_screen.h | 7 +++-- src/yuzu/multiplayer/chat_room.h | 9 +++---- 87 files changed, 368 insertions(+), 254 deletions(-) create mode 100644 .patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch mode change 100755 => 100644 src/video_core/host1x/codecs/decoder.h diff --git a/.patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch b/.patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch new file mode 100644 index 0000000000..f7d7c7ebe2 --- /dev/null +++ b/.patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch @@ -0,0 +1,26 @@ +From b3622608433c183ba868a1dc8dd9cf285eb3b916 Mon Sep 17 00:00:00 2001 +From: Dario Petrillo +Date: Thu, 27 Nov 2025 23:12:38 +0100 +Subject: [PATCH] avoid extra memset when clearing an empty table + +--- + include/ankerl/unordered_dense.h | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/include/ankerl/unordered_dense.h b/include/ankerl/unordered_dense.h +index 0835342..4938212 100644 +--- a/include/ankerl/unordered_dense.h ++++ b/include/ankerl/unordered_dense.h +@@ -1490,8 +1490,10 @@ class table : public std::conditional_t, base_table_type_map, bas + // modifiers ////////////////////////////////////////////////////////////// + + void clear() { +- m_values.clear(); +- clear_buckets(); ++ if (!empty()) { ++ m_values.clear(); ++ clear_buckets(); ++ } + } + + auto insert(value_type const& value) -> std::pair { diff --git a/CMakeLists.txt b/CMakeLists.txt index dbe947c1bf..0568a49ec8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -576,6 +576,7 @@ add_subdirectory(externals) # pass targets from externals find_package(enet) find_package(MbedTLS) +find_package(unordered_dense REQUIRED) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) find_package(xbyak) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 980d8f668d..739cebe2e9 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -66,6 +66,9 @@ if (NOT TARGET LLVM::Demangle) add_library(LLVM::Demangle ALIAS demangle) endif() +# unordered_dense +AddJsonPackage(unordered-dense) + if (YUZU_STATIC_ROOM) return() endif() @@ -244,9 +247,6 @@ if (ENABLE_WEB_SERVICE OR ENABLE_UPDATE_CHECKER) AddJsonPackage(cpp-jwt) endif() -# unordered_dense -AddJsonPackage(unordered-dense) - # FFMpeg if (YUZU_USE_EXTERNAL_FFMPEG OR YUZU_USE_BUNDLED_FFMPEG) add_subdirectory(ffmpeg) diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 7c04e389e2..cb1cdf3e4a 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -91,10 +91,13 @@ "unordered-dense": { "package": "unordered_dense", "repo": "martinus/unordered_dense", - "tag": "v%VERSION%", - "hash": "b98b5d4d96f8e0081b184d6c4c1181fae4e41723b54bed4296717d7f417348b48fad0bbcc664cac142b8c8a47e95aa57c1eb1cf6caa855fd782fad3e3ab99e5e", + "sha": "7b55cab841", + "hash": "d2106f6640f6bfb81755e4b8bfb64982e46ec4a507cacdb38f940123212ccf35a20b43c70c6f01d7bfb8c246d1a16f7845d8052971949cea9def1475e3fa02c8", "find_args": "CONFIG", - "git_version": "4.8.1" + "bundled": true, + "patches": [ + "0001-avoid-memset-when-clearing-an-empty-table.patch" + ] }, "mbedtls": { "package": "MbedTLS", diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index c33763b471..e9c03b6440 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,7 +21,7 @@ struct RomMetadata { bool isHomebrew; }; -std::unordered_map m_rom_metadata_cache; +ankerl::unordered_dense::map m_rom_metadata_cache; RomMetadata CacheRomMetadata(const std::string& path) { const auto file = diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp index 5b69826c75..730d4f0a27 100644 --- a/src/android/app/src/main/jni/native_input.cpp +++ b/src/android/app/src/main/jni/native_input.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -18,7 +21,7 @@ #include "input_common/drivers/virtual_gamepad.h" #include "native.h" -std::unordered_map> map_profiles; +ankerl::unordered_dense::map> map_profiles; bool IsHandheldOnly() { const auto npad_style_set = diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 042f5c7bd9..58d2b2279e 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -253,7 +253,7 @@ if (lz4_ADDED) target_include_directories(common PRIVATE ${lz4_SOURCE_DIR}/lib) endif() -target_link_libraries(common PUBLIC fmt::fmt stb::headers Threads::Threads) +target_link_libraries(common PUBLIC fmt::fmt stb::headers Threads::Threads unordered_dense::unordered_dense) target_link_libraries(common PRIVATE lz4::lz4 LLVM::Demangle zstd::zstd) if(ANDROID) diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index 9b57fda295..3f928ac327 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include "common/assert.h" #include "common/fs/fs.h" @@ -193,8 +193,8 @@ private: SetLegacyPathImpl(legacy_path, new_path); } - std::unordered_map eden_paths; - std::unordered_map legacy_paths; + ankerl::unordered_dense::map eden_paths; + ankerl::unordered_dense::map legacy_paths; }; bool ValidatePath(const fs::path& path) { diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 51ee0d333b..a1e99a4c9d 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -7,7 +7,7 @@ #ifdef _WIN32 #include -#include +#include #include #include #include "common/dynamic_library.h" @@ -391,7 +391,7 @@ private: std::mutex placeholder_mutex; ///< Mutex for placeholders boost::icl::separate_interval_set placeholders; ///< Mapped placeholders - std::unordered_map placeholder_host_pointers; ///< Placeholder backing offset + ankerl::unordered_dense::map placeholder_host_pointers; ///< Placeholder backing offset }; #else // ^^^ Windows ^^^ vvv POSIX vvv diff --git a/src/common/input.h b/src/common/input.h index 2c4ccea22e..b076fd7e6b 100644 --- a/src/common/input.h +++ b/src/common/input.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include #include #include -#include +#include #include #include #include "common/logging/log.h" @@ -409,7 +412,7 @@ public: namespace Impl { template -using FactoryListType = std::unordered_map>>; +using FactoryListType = ankerl::unordered_dense::map>>; template struct FactoryList { diff --git a/src/common/param_package.h b/src/common/param_package.h index d7c13cb1fc..0216863a39 100644 --- a/src/common/param_package.h +++ b/src/common/param_package.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,14 +8,14 @@ #include #include -#include +#include namespace Common { /// A string-based key-value container supporting serializing to and deserializing from a string class ParamPackage { public: - using DataType = std::unordered_map; + using DataType = ankerl::unordered_dense::map; ParamPackage() = default; explicit ParamPackage(const std::string& serialized); diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index 2ea1505ce7..07f6bb9449 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include "common/common_types.h" diff --git a/src/core/arm/nce/lru_cache.h b/src/core/arm/nce/lru_cache.h index 1bc00c8f14..947b66f675 100644 --- a/src/core/arm/nce/lru_cache.h +++ b/src/core/arm/nce/lru_cache.h @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include -#include +#include #include #include "common/logging/log.h" @@ -144,7 +144,7 @@ private: using list_type = std::list; using list_iterator = typename list_type::iterator; using map_value_type = std::pair; - using map_type = std::unordered_map; + using map_type = ankerl::unordered_dense::map; template void insert_or_update(const key_type& key, V&& value) { diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index f2b11fcda0..8612cfc63d 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -4,7 +4,7 @@ #pragma once #include -#include +#include #include #include #include @@ -46,7 +46,7 @@ enum class PatchMode : u32 { using ModuleTextAddress = u64; using PatchTextAddress = u64; -using EntryTrampolines = std::unordered_map; +using EntryTrampolines = ankerl::unordered_dense::map; class Patcher { public: diff --git a/src/core/file_sys/vfs/vfs_layered.cpp b/src/core/file_sys/vfs/vfs_layered.cpp index 47b2a3c780..8dabe03e16 100644 --- a/src/core/file_sys/vfs/vfs_layered.cpp +++ b/src/core/file_sys/vfs/vfs_layered.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include +#include #include #include "core/file_sys/vfs/vfs_layered.h" @@ -60,7 +63,7 @@ std::string LayeredVfsDirectory::GetFullPath() const { std::vector LayeredVfsDirectory::GetFiles() const { std::vector out; - std::unordered_set out_names; + ankerl::unordered_dense::set out_names; for (const auto& layer : dirs) { for (auto& file : layer->GetFiles()) { @@ -76,7 +79,7 @@ std::vector LayeredVfsDirectory::GetFiles() const { std::vector LayeredVfsDirectory::GetSubdirectories() const { std::vector out; - std::unordered_set out_names; + ankerl::unordered_dense::set out_names; for (const auto& layer : dirs) { for (const auto& sd : layer->GetSubdirectories()) { diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index 13717cc090..975448f0dd 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -78,7 +78,7 @@ private: std::array m_watchpoints{}; std::map m_debug_page_refcounts{}; #ifdef HAS_NCE - std::unordered_map m_post_handlers{}; + ankerl::unordered_dense::map m_post_handlers{}; #endif std::unique_ptr m_exclusive_monitor; Core::Memory::Memory m_memory; @@ -493,7 +493,7 @@ public: static void Switch(KProcess* cur_process, KProcess* next_process); #ifdef HAS_NCE - std::unordered_map& GetPostHandlers() noexcept { + ankerl::unordered_dense::map& GetPostHandlers() noexcept { return m_post_handlers; } #endif diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 6986a98e35..5c2b6a4a88 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/assert.h" @@ -786,8 +786,8 @@ struct KernelCore::Impl { std::optional object_name_global_data; - std::unordered_set registered_objects; - std::unordered_set registered_in_use_objects; + ankerl::unordered_dense::set registered_objects; + ankerl::unordered_dense::set registered_in_use_objects; std::mutex server_lock; std::vector> server_managers; diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 5d1a34281a..3b754e9397 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include "common/polyfill_thread.h" diff --git a/src/core/hle/service/am/frontend/applet_web_browser_types.h b/src/core/hle/service/am/frontend/applet_web_browser_types.h index 0892a6a716..3574568f6f 100644 --- a/src/core/hle/service/am/frontend/applet_web_browser_types.h +++ b/src/core/hle/service/am/frontend/applet_web_browser_types.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include "common/common_funcs.h" @@ -176,6 +176,6 @@ struct WebCommonReturnValue { }; static_assert(sizeof(WebCommonReturnValue) == 0x1010, "WebCommonReturnValue has incorrect size."); -using WebArgInputTLVMap = std::unordered_map>; +using WebArgInputTLVMap = ankerl::unordered_dense::map>; } // namespace Service::AM::Frontend diff --git a/src/core/hle/service/bcat/news/builtin_news.cpp b/src/core/hle/service/bcat/news/builtin_news.cpp index 2c93da71e0..43b0445039 100644 --- a/src/core/hle/service/bcat/news/builtin_news.cpp +++ b/src/core/hle/service/bcat/news/builtin_news.cpp @@ -44,8 +44,8 @@ std::vector default_logo_small; std::vector default_logo_large; bool default_logos_loaded = false; -std::unordered_map> news_images_small; -std::unordered_map> news_images_large; +ankerl::unordered_dense::map> news_images_small; +ankerl::unordered_dense::map> news_images_large; std::mutex images_mutex; diff --git a/src/core/hle/service/bcat/news/news_storage.h b/src/core/hle/service/bcat/news/news_storage.h index ad84e4080c..531e2adb9a 100644 --- a/src/core/hle/service/bcat/news/news_storage.h +++ b/src/core/hle/service/bcat/news/news_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -93,7 +93,7 @@ private: static s64 Now(); mutable std::mutex mtx; - std::unordered_map items; + ankerl::unordered_dense::map items; size_t open_counter{}; }; diff --git a/src/core/hle/service/caps/caps_manager.h b/src/core/hle/service/caps/caps_manager.h index 893a9075a0..22f5672e47 100644 --- a/src/core/hle/service/caps/caps_manager.h +++ b/src/core/hle/service/caps/caps_manager.h @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include +#include #include "common/fs/fs.h" #include "core/hle/result.h" @@ -85,7 +88,7 @@ private: AlbumFileDateTime ConvertToAlbumDateTime(u64 posix_time) const; bool is_mounted{}; - std::unordered_map album_files; + ankerl::unordered_dense::map album_files; Core::System& system; }; diff --git a/src/core/hle/service/ldn/lan_discovery.h b/src/core/hle/service/ldn/lan_discovery.h index 0d15583172..d39197efff 100644 --- a/src/core/hle/service/ldn/lan_discovery.h +++ b/src/core/hle/service/ldn/lan_discovery.h @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include "common/logging/log.h" #include "common/socket_types.h" @@ -119,7 +119,7 @@ protected: std::array stations; std::array node_changes{}; std::array node_last_states{}; - std::unordered_map scan_results{}; + ankerl::unordered_dense::map scan_results{}; NodeInfo node_info{}; NetworkInfo network_info{}; State state{State::None}; diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index b8a34d34eb..2fda8a3b90 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include "common/logging/log.h" #include "core/core.h" @@ -331,7 +331,7 @@ private: }; static_assert(sizeof(LogPacketHeader) == 0x18, "LogPacketHeader is an invalid size"); - std::unordered_map> entries{}; + ankerl::unordered_dense::map> entries{}; LogDestination destination{LogDestination::All}; }; diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 8fecef96d2..710a95a455 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #ifdef _WIN32 diff --git a/src/core/hle/service/nvdrv/core/container.h b/src/core/hle/service/nvdrv/core/container.h index cf549d7f32..62404e14a7 100644 --- a/src/core/hle/service/nvdrv/core/container.h +++ b/src/core/hle/service/nvdrv/core/container.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-FileCopyrightText: 2022 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,7 +9,7 @@ #include #include -#include +#include #include "core/device_memory_manager.h" #include "core/hle/service/nvdrv/nvdata.h" diff --git a/src/core/hle/service/nvdrv/core/nvmap.h b/src/core/hle/service/nvdrv/core/nvmap.h index b8be599ae9..17b9ccd1c7 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.h +++ b/src/core/hle/service/nvdrv/core/nvmap.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-FileCopyrightText: 2022 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -9,7 +12,7 @@ #include #include #include -#include +#include #include #include "common/bit_field.h" @@ -158,7 +161,7 @@ private: std::list> unmap_queue{}; std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue` - std::unordered_map> + ankerl::unordered_dense::map> handles{}; //!< Main owning map of handles std::mutex handles_lock; //!< Protects access to `handles` diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h index c9a6737ba9..7d50fd4c33 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2021 yuzu Emulator Project @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include "common/address_space.h" @@ -113,7 +113,7 @@ private: }; static_assert(sizeof(IoctlRemapEntry) == 20, "IoctlRemapEntry is incorrect size"); - std::unordered_set map_buffer_offsets{}; + ankerl::unordered_dense::set map_buffer_offsets{}; struct IoctlMapBufferEx { MappingFlags flags{}; // bit0: fixed_offset, bit2: cacheable diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index b8854aab95..c29231dc0c 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -210,7 +210,7 @@ private: NvCore::SyncpointManager& syncpoint_manager; NvCore::NvMap& nvmap; std::shared_ptr channel_state; - std::unordered_map sessions; + ankerl::unordered_dense::map sessions; u32 channel_syncpoint; std::mutex channel_mutex; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h index 63e6377603..6b66a0d28d 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include +#include #include #include "common/common_types.h" @@ -128,7 +131,7 @@ protected: NvCore::NvMap& nvmap; NvCore::ChannelType channel_type; std::array device_syncpoints{}; - std::unordered_map sessions; + ankerl::unordered_dense::map sessions; }; }; // namespace Devices } // namespace Service::Nvidia diff --git a/src/core/hle/service/nvdrv/devices/nvmap.h b/src/core/hle/service/nvdrv/devices/nvmap.h index d07d85f888..19c5b479df 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.h +++ b/src/core/hle/service/nvdrv/devices/nvmap.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include +#include #include #include "common/common_funcs.h" #include "common/common_types.h" @@ -115,7 +118,7 @@ private: NvCore::Container& container; NvCore::NvMap& file; - std::unordered_map sessions; + ankerl::unordered_dense::map sessions; }; } // namespace Service::Nvidia::Devices diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index b76f81e594..329ac91c41 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -9,7 +12,7 @@ #include #include #include -#include +#include #include "common/common_types.h" #include "core/hle/service/kernel_helpers.h" @@ -100,7 +103,7 @@ private: /// Id to use for the next open file descriptor. DeviceFD next_fd = 1; - using FilesContainerType = std::unordered_map>; + using FilesContainerType = ankerl::unordered_dense::map>; /// Mapping of file descriptors to the devices they reference. FilesContainerType open_files; @@ -108,7 +111,7 @@ private: EventInterface events_interface; - std::unordered_map> builders; + ankerl::unordered_dense::map> builders; }; void LoopProcess(Core::System& system); diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.h b/src/core/hle/service/nvnflinger/hos_binder_driver_server.h index f4b4060115..b66f1776b0 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -5,7 +8,7 @@ #include #include -#include +#include #include "common/common_types.h" #include "core/hle/service/nvnflinger/binder.h" @@ -36,8 +39,8 @@ private: mutable std::mutex lock; s32 last_id = 0; - std::unordered_map> binders; - std::unordered_map refcounts; + ankerl::unordered_dense::map> binders; + ankerl::unordered_dense::map refcounts; }; } // namespace Service::Nvnflinger diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h index 4a4b89317b..fc7dd7bbcb 100644 --- a/src/core/hle/service/olsc/daemon_controller.h +++ b/src/core/hle/service/olsc/daemon_controller.h @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include +#include #include "common/uuid.h" #include "core/hle/service/cmif_types.h" @@ -54,10 +54,10 @@ private: } }; - std::unordered_map app_auto_transfer_{}; - std::unordered_map global_auto_upload_{}; - std::unordered_map global_auto_download_{}; - std::unordered_map autonomy_task_status_{}; + ankerl::unordered_dense::map app_auto_transfer_{}; + ankerl::unordered_dense::map global_auto_upload_{}; + ankerl::unordered_dense::map global_auto_download_{}; + ankerl::unordered_dense::map autonomy_task_status_{}; }; } // namespace Service::OLSC diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index d5f372b97d..039d53ebf8 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "core/hle/kernel/k_port.h" @@ -97,8 +97,8 @@ private: /// Map of registered services, retrieved using GetServicePort. std::mutex lock; - std::unordered_map registered_services; - std::unordered_map service_ports; + ankerl::unordered_dense::map registered_services; + ankerl::unordered_dense::map service_ports; /// Kernel context Kernel::KernelCore& kernel; diff --git a/src/core/hle/service/vi/conductor.h b/src/core/hle/service/vi/conductor.h index 6dd105dd40..59eb2fd022 100644 --- a/src/core/hle/service/vi/conductor.h +++ b/src/core/hle/service/vi/conductor.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include +#include #include "common/common_types.h" #include "common/polyfill_thread.h" @@ -45,7 +48,7 @@ private: private: Core::System& m_system; Container& m_container; - std::unordered_map m_vsync_managers; + ankerl::unordered_dense::map m_vsync_managers; std::shared_ptr m_event; Common::Event m_signal; std::jthread m_thread; diff --git a/src/core/launch_timestamp_cache.cpp b/src/core/launch_timestamp_cache.cpp index 95b6bc8c41..217b3f28da 100644 --- a/src/core/launch_timestamp_cache.cpp +++ b/src/core/launch_timestamp_cache.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include @@ -21,8 +21,8 @@ namespace Core::LaunchTimestampCache { namespace { -using CacheMap = std::unordered_map; -using CountMap = std::unordered_map; +using CacheMap = ankerl::unordered_dense::map; +using CountMap = ankerl::unordered_dense::map; std::mutex g_mutex; CacheMap g_cache; diff --git a/src/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt index fc22f073f7..e0d1f942f0 100644 --- a/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/CMakeLists.txt @@ -118,6 +118,7 @@ endif() find_package(fmt 8 CONFIG) find_package(mcl 0.1.12 REQUIRED) +find_package(unordered_dense REQUIRED) if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS) find_package(oaknut 2.0.1 CONFIG) diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index f2ea9de455..8b55a864a3 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later include(TargetArchitectureSpecificSources) @@ -356,20 +356,10 @@ set_target_properties(dynarmic PROPERTIES SOVERSION ${dynarmic_VERSION_MAJOR}.${dynarmic_VERSION_MINOR} ) -if (TARGET unordered_dense::unordered_dense) - # weird quirk of system installs - target_link_libraries(dynarmic - PRIVATE - unordered_dense::unordered_dense - ) -endif() - target_compile_options(dynarmic PRIVATE ${DYNARMIC_CXX_FLAGS}) -target_link_libraries(dynarmic - PUBLIC - fmt::fmt - merry::mcl -) + +target_link_libraries(dynarmic PRIVATE unordered_dense::unordered_dense) +target_link_libraries(dynarmic PUBLIC fmt::fmt merry::mcl) if (BOOST_NO_HEADERS) target_link_libraries(dynarmic PRIVATE Boost::variant Boost::icl Boost::pool) diff --git a/src/dynarmic/tests/A64/fibonacci.cpp b/src/dynarmic/tests/A64/fibonacci.cpp index 713a48cab7..9a10f52614 100644 --- a/src/dynarmic/tests/A64/fibonacci.cpp +++ b/src/dynarmic/tests/A64/fibonacci.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include "dynarmic/common/common_types.h" @@ -23,7 +23,7 @@ namespace { class MyEnvironment final : public A64::UserCallbacks { public: u64 ticks_left = 0; - std::unordered_map memory{}; + ankerl::unordered_dense::map memory{}; u8 MemoryRead8(u64 vaddr) override { return memory[vaddr]; diff --git a/src/dynarmic/tests/A64/testenv.h b/src/dynarmic/tests/A64/testenv.h index 05eb0e2d39..67b0f97a65 100644 --- a/src/dynarmic/tests/A64/testenv.h +++ b/src/dynarmic/tests/A64/testenv.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -8,7 +8,7 @@ #pragma once -#include +#include #include "dynarmic/common/assert.h" #include "dynarmic/common/common_types.h" #include "dynarmic/interface/A64/a64.h" @@ -23,7 +23,7 @@ public: u64 code_mem_start_address = 0; std::vector code_mem; - std::unordered_map modified_memory; + ankerl::unordered_dense::map modified_memory; std::vector interrupts; bool IsInCodeMem(u64 vaddr) const { diff --git a/src/hid_core/frontend/emulated_console.h b/src/hid_core/frontend/emulated_console.h index 847551395c..b8ce45f05c 100644 --- a/src/hid_core/frontend/emulated_console.h +++ b/src/hid_core/frontend/emulated_console.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include #include #include -#include +#include #include "common/common_funcs.h" #include "common/common_types.h" @@ -182,7 +185,7 @@ private: mutable std::mutex mutex; mutable std::mutex callback_mutex; - std::unordered_map callback_list; + ankerl::unordered_dense::map callback_list; int last_callback_key = 0; // Stores the current status of all console input diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h index b8eafbae5c..e4256faa3e 100644 --- a/src/hid_core/frontend/emulated_controller.h +++ b/src/hid_core/frontend/emulated_controller.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -636,7 +636,7 @@ private: mutable std::shared_mutex callback_mutex; mutable std::shared_mutex npad_mutex; mutable std::shared_mutex connect_mutex; - std::unordered_map callback_list; + ankerl::unordered_dense::map callback_list; int last_callback_key = 0; // Stores the current status of all controller input diff --git a/src/hid_core/frontend/emulated_devices.h b/src/hid_core/frontend/emulated_devices.h index b2e57318cc..fb6c982a70 100644 --- a/src/hid_core/frontend/emulated_devices.h +++ b/src/hid_core/frontend/emulated_devices.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -202,7 +205,7 @@ private: mutable std::mutex mutex; mutable std::mutex callback_mutex; - std::unordered_map callback_list; + ankerl::unordered_dense::map callback_list; int last_callback_key = 0; // Stores the current status of all external device input diff --git a/src/input_common/drivers/android.h b/src/input_common/drivers/android.h index 03e2b2c983..18678de602 100644 --- a/src/input_common/drivers/android.h +++ b/src/input_common/drivers/android.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -87,7 +90,7 @@ public: Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; private: - std::unordered_map input_devices; + ankerl::unordered_dense::map input_devices; /// Returns the correct identifier corresponding to the player index PadIdentifier GetIdentifier(const std::string& guid, size_t port) const; diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index ddee11035c..81b0a2313a 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -570,7 +570,7 @@ SDLDriver::~SDLDriver() { std::vector SDLDriver::GetInputDevices() const { std::vector devices; - std::unordered_map> joycon_pairs; + ankerl::unordered_dense::map> joycon_pairs; for (const auto& [key, value] : joystick_map) { for (const auto& joystick : value) { if (!joystick->GetSDLJoystick()) { diff --git a/src/input_common/drivers/sdl_driver.h b/src/input_common/drivers/sdl_driver.h index a140ad072c..1677ab8289 100644 --- a/src/input_common/drivers/sdl_driver.h +++ b/src/input_common/drivers/sdl_driver.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include #include #include -#include +#include #include @@ -116,7 +119,7 @@ private: Common::SPSCQueue vibration_queue; /// Map of GUID of a list of corresponding virtual Joysticks - std::unordered_map>> joystick_map; + ankerl::unordered_dense::map>> joystick_map; std::mutex joystick_map_mutex; bool start_thread = false; diff --git a/src/input_common/input_engine.h b/src/input_common/input_engine.h index 3e328509b1..7ad40027e4 100644 --- a/src/input_common/input_engine.h +++ b/src/input_common/input_engine.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include -#include +#include #include "common/common_types.h" #include "common/input.h" @@ -267,10 +270,10 @@ protected: private: struct ControllerData { - std::unordered_map buttons; - std::unordered_map hat_buttons; - std::unordered_map axes; - std::unordered_map motions; + ankerl::unordered_dense::map buttons; + ankerl::unordered_dense::map hat_buttons; + ankerl::unordered_dense::map axes; + ankerl::unordered_dense::map motions; Common::Input::BatteryLevel battery{}; Common::Input::BodyColorStatus color{}; Common::Input::CameraStatus camera{}; @@ -298,8 +301,8 @@ private: bool configuring{false}; const std::string input_engine; int last_callback_key = 0; - std::unordered_map controller_list; - std::unordered_map callback_list; + ankerl::unordered_dense::map controller_list; + ankerl::unordered_dense::map callback_list; MappingCallback mapping_callback; }; diff --git a/src/input_common/main.h b/src/input_common/main.h index 1d19019ee8..d0e447ec2d 100644 --- a/src/input_common/main.h +++ b/src/input_common/main.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include -#include +#include #include namespace Common { @@ -53,9 +56,9 @@ enum class InputType { None, Button, Stick, Motion, Touch }; * Given a ParamPackage for a Device returned from `GetInputDevices`, attempt to get the default * mapping for the device. */ -using AnalogMapping = std::unordered_map; -using ButtonMapping = std::unordered_map; -using MotionMapping = std::unordered_map; +using AnalogMapping = ankerl::unordered_dense::map; +using ButtonMapping = ankerl::unordered_dense::map; +using MotionMapping = ankerl::unordered_dense::map; class InputSubsystem { public: diff --git a/src/shader_recompiler/environment.h b/src/shader_recompiler/environment.h index 106fe8d32d..0a6e4bfcaa 100644 --- a/src/shader_recompiler/environment.h +++ b/src/shader_recompiler/environment.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include "common/common_types.h" #include "shader_recompiler/program_header.h" @@ -125,9 +125,9 @@ protected: u32 start_address{}; bool is_proprietary_driver{}; public: - std::unordered_map cbuf_word_cache; - std::unordered_map handle_cache; - std::unordered_map track_cache; + ankerl::unordered_dense::map cbuf_word_cache; + ankerl::unordered_dense::map handle_cache; + ankerl::unordered_dense::map track_cache; }; } // namespace Shader diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp index 6d325b4aad..eaf1d88f2e 100644 --- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include @@ -390,7 +390,7 @@ private: std::optional return_label) { Statement* const false_stmt{pool.Create(Identity{}, IR::Condition{false}, &root_stmt)}; Tree& root{root_stmt.children}; - std::unordered_map local_labels; + ankerl::unordered_dense::map local_labels; local_labels.reserve(function.blocks.size()); for (Flow::Block& block : function.blocks) { diff --git a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp index 07cabca43e..2bde38a661 100644 --- a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp +++ b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,7 +19,7 @@ #include #include #include -#include +#include #include #include @@ -50,8 +53,8 @@ struct IndirectBranchVariable { auto operator<=>(const IndirectBranchVariable&) const noexcept = default; }; -using Variant = std::variant; +using Variant = std::variant; +// TODO: majority of these require stable iterators, test with XC beforehand using ValueMap = std::unordered_map; struct DefTable { @@ -112,6 +115,7 @@ struct DefTable { } std::array preds; + // TODO: Requires stable iterators std::unordered_map goto_vars; ValueMap indirect_branch_var; ValueMap zero_flag; @@ -165,7 +169,8 @@ public: template IR::Value ReadVariable(Type variable, IR::Block* root_block) { - boost::container::small_vector, 64> stack{ + // TODO: Windows commits sodoku if you use small_vector + std::vector> stack{ ReadState(nullptr), ReadState(root_block), }; @@ -295,6 +300,7 @@ private: return same; } + // TODO: Windows dies with stack exhaustion? std::unordered_map> incomplete_phis; DefTable current_def; }; diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index 0288db0ae1..20b8591072 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/tests/common/fibers.cpp b/src/tests/common/fibers.cpp index 83c0946c9e..ce17a5c52c 100644 --- a/src/tests/common/fibers.cpp +++ b/src/tests/common/fibers.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include #include #include -#include +#include #include #include @@ -36,7 +39,7 @@ public: private: mutable std::mutex mutex; - std::unordered_map ids; + ankerl::unordered_dense::map ids; }; class TestControl1 { diff --git a/src/tests/video_core/memory_tracker.cpp b/src/tests/video_core/memory_tracker.cpp index 08ebf05237..5fd8037446 100644 --- a/src/tests/video_core/memory_tracker.cpp +++ b/src/tests/video_core/memory_tracker.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include @@ -65,7 +65,7 @@ public: } private: - std::unordered_map page_table; + ankerl::unordered_dense::map page_table; std::vector> calls; size_t update_calls = 0; }; diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index ed50634683..3c0bc81758 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" diff --git a/src/video_core/buffer_cache/memory_tracker_base.h b/src/video_core/buffer_cache/memory_tracker_base.h index 4181b0ae54..2c571271d6 100644 --- a/src/video_core/buffer_cache/memory_tracker_base.h +++ b/src/video_core/buffer_cache/memory_tracker_base.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include "common/alignment.h" @@ -257,7 +257,7 @@ private: std::array top_tier{}; std::deque> manager_pool; std::deque free_managers; - std::unordered_set cached_pages; + ankerl::unordered_dense::set cached_pages; DeviceTracker* device_tracker = nullptr; }; diff --git a/src/video_core/control/channel_state_cache.h b/src/video_core/control/channel_state_cache.h index 58f6a34c16..f8b8abcac6 100644 --- a/src/video_core/control/channel_state_cache.h +++ b/src/video_core/control/channel_state_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2022 yuzu Emulator Project @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -88,14 +88,14 @@ protected: std::deque

channel_storage; std::deque free_channel_ids; - std::unordered_map channel_map; + ankerl::unordered_dense::map channel_map; std::vector active_channel_ids; struct AddressSpaceRef { size_t ref_count; size_t storage_id; Tegra::MemoryManager* gpu_memory; }; - std::unordered_map address_spaces; + ankerl::unordered_dense::map address_spaces; mutable std::mutex config_mutex; virtual void OnGPUASRegister([[maybe_unused]] size_t map_id) {} diff --git a/src/video_core/control/scheduler.h b/src/video_core/control/scheduler.h index 44addf61c4..9c2b9de32b 100644 --- a/src/video_core/control/scheduler.h +++ b/src/video_core/control/scheduler.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -5,7 +8,7 @@ #include #include -#include +#include #include "video_core/dma_pusher.h" @@ -27,7 +30,7 @@ public: void DeclareChannel(std::shared_ptr new_channel); private: - std::unordered_map> channels; + ankerl::unordered_dense::map> channels; std::mutex scheduling_guard; GPU& gpu; }; diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 8c50a4ea2f..5312c04b6f 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -3056,7 +3056,7 @@ public: void SetHLEReplacementAttributeType(u32 bank, u32 offset, HLEReplacementAttributeType name); - std::unordered_map replace_table; + ankerl::unordered_dense::map replace_table; static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Maxwell3D Regs has wrong size"); static_assert(std::is_trivially_copyable_v, "Maxwell3D Regs must be trivially copyable"); diff --git a/src/video_core/engines/sw_blitter/converter.cpp b/src/video_core/engines/sw_blitter/converter.cpp index b4722f7976..6682c96444 100644 --- a/src/video_core/engines/sw_blitter/converter.cpp +++ b/src/video_core/engines/sw_blitter/converter.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include "common/assert.h" @@ -924,7 +924,7 @@ public: }; struct ConverterFactory::ConverterFactoryImpl { - std::unordered_map> converters_cache; + ankerl::unordered_dense::map> converters_cache; }; ConverterFactory::ConverterFactory() { diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 36d726c929..d65658323e 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -373,7 +373,7 @@ struct GPU::Impl { std::unique_ptr cpu_context; std::unique_ptr scheduler; - std::unordered_map> channels; + ankerl::unordered_dense::map> channels; Tegra::Control::ChannelState* current_channel; s32 bound_channel{-1}; diff --git a/src/video_core/gpu_logging/gpu_logging.h b/src/video_core/gpu_logging/gpu_logging.h index c248e9b036..134fa94c0f 100644 --- a/src/video_core/gpu_logging/gpu_logging.h +++ b/src/video_core/gpu_logging/gpu_logging.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -154,7 +154,7 @@ private: mutable std::mutex ring_buffer_mutex; // Memory tracking - std::unordered_map memory_allocations; + ankerl::unordered_dense::map memory_allocations; mutable std::mutex memory_mutex; // Statistics diff --git a/src/video_core/host1x/codecs/decoder.h b/src/video_core/host1x/codecs/decoder.h old mode 100755 new mode 100644 index 22e6db8151..d25da81fd4 --- a/src/video_core/host1x/codecs/decoder.h +++ b/src/video_core/host1x/codecs/decoder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" diff --git a/src/video_core/host1x/host1x.h b/src/video_core/host1x/host1x.h index 98dd593185..d7534da23a 100644 --- a/src/video_core/host1x/host1x.h +++ b/src/video_core/host1x/host1x.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2021 yuzu Emulator Project @@ -6,8 +6,8 @@ #pragma once +#include #include -#include #include #include "common/common_types.h" @@ -134,15 +134,15 @@ private: if (it == map->second.end()) { return {}; } - + // TODO: this "mapped" prevents us from fully embracing ankerl return std::move(map->second.extract(it).mapped()); } using FramePtr = std::shared_ptr; std::mutex m_mutex{}; - std::unordered_map>> m_presentation_order; - std::unordered_map> m_decode_order; + ankerl::unordered_dense::map>> m_presentation_order; + ankerl::unordered_dense::map> m_decode_order; static constexpr size_t MAX_PRESENT_QUEUE = 100; static constexpr size_t MAX_DECODE_MAP = 200; @@ -218,7 +218,7 @@ private: Tegra::MemoryManager gmmu_manager; std::unique_ptr> allocator; FrameQueue frame_queue; - std::unordered_map> devices; + ankerl::unordered_dense::map> devices; #ifdef YUZU_LEGACY std::once_flag nvdec_first_init; std::once_flag vic_first_init; diff --git a/src/video_core/macro.h b/src/video_core/macro.h index 685097a693..9bdb4219ce 100644 --- a/src/video_core/macro.h +++ b/src/video_core/macro.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include "common/bit_field.h" #include "common/common_types.h" @@ -147,8 +147,8 @@ private: bool has_hle_program{}; }; - std::unordered_map macro_cache; - std::unordered_map> uploaded_macro_code; + ankerl::unordered_dense::map macro_cache; + ankerl::unordered_dense::map> uploaded_macro_code; std::optional hle_macros; Engines::Maxwell3D& maxwell3d; bool is_interpreted; diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index e1019f2285..ebb87fe65a 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,8 +15,7 @@ #include #include #include -#include -#include +#include #include #include "common/assert.h" @@ -348,7 +350,7 @@ private: mutable std::recursive_mutex mutex; - std::unordered_map> cached_queries; + ankerl::unordered_dense::map> cached_queries; std::array streams; diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h index 6e084cc079..3aeeb8dcab 100644 --- a/src/video_core/query_cache/query_cache.h +++ b/src/video_core/query_cache/query_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/assert.h" diff --git a/src/video_core/query_cache/query_cache_base.h b/src/video_core/query_cache/query_cache_base.h index 00c25c8d63..242e24388f 100644 --- a/src/video_core/query_cache/query_cache_base.h +++ b/src/video_core/query_cache/query_cache_base.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/assert.h" @@ -157,7 +160,7 @@ protected: } } - using ContentCache = std::unordered_map>; + using ContentCache = ankerl::unordered_dense::map>; void InvalidateQuery(QueryLocation location); bool IsQueryDirty(QueryLocation location); @@ -165,7 +168,7 @@ protected: void RequestGuestHostSync(); void UnregisterPending(); - std::unordered_map> cached_queries; + ankerl::unordered_dense::map> cached_queries; std::mutex cache_mutex; struct QueryCacheBaseImpl; diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index 23ebe50196..a0acfc48c1 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -8,7 +8,7 @@ #include #include -#include +#include #include "common/common_types.h" #include "video_core/buffer_cache/buffer_cache_base.h" @@ -242,7 +242,7 @@ private: u32 index_buffer_offset = 0; u64 device_access_memory; - std::unordered_map tfb_objects; + ankerl::unordered_dense::map tfb_objects; }; struct BufferCacheParams { diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h index 2b46c22c70..3398ba6f51 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_cache.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include +#include #include "common/common_types.h" #include "common/thread_worker.h" @@ -79,8 +82,8 @@ private: GraphicsPipeline* current_pipeline{}; ShaderContext::ShaderPools main_pools; - std::unordered_map> graphics_cache; - std::unordered_map> compute_cache; + ankerl::unordered_dense::map> graphics_cache; + ankerl::unordered_dense::map> compute_cache; Shader::Profile profile; Shader::HostTranslateInfo host_info; diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index e2a2022cb2..dfcef4b0b6 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -157,7 +157,7 @@ private: UtilShaders util_shaders; FormatConversionPass format_conversion_pass; - std::array, 3> format_properties; + std::array, 3> format_properties; bool has_broken_texture_view_formats = false; OGLTexture null_image_1d_array; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index 7909bd8cf0..1f7dab935c 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -155,8 +158,8 @@ private: GraphicsPipelineCacheKey graphics_key{}; GraphicsPipeline* current_pipeline{}; - std::unordered_map> compute_cache; - std::unordered_map> graphics_cache; + ankerl::unordered_dense::map> compute_cache; + ankerl::unordered_dense::map> graphics_cache; ShaderPools main_pools; diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index b9ff4cd00e..c035eb7cd9 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include "video_core/renderer_vulkan/vk_texture_cache.h" @@ -230,7 +230,7 @@ public: sync_values_stash.emplace_back(); std::vector* sync_values = &sync_values_stash.back(); sync_values->reserve(num_slots_used); - std::unordered_map> offsets; + ankerl::unordered_dense::map> offsets; resolve_buffers.clear(); size_t resolve_buffer_index = ObtainBuffer(num_slots_used); resolve_buffers.push_back(resolve_buffer_index); @@ -412,7 +412,7 @@ private: template void ApplyBanksWideOp(std::vector& queries, Func&& func) { std::conditional_t>, - std::unordered_map>> + ankerl::unordered_dense::map>> indexer; for (auto q : queries) { auto* query = GetQuery(q); @@ -722,7 +722,7 @@ public: void SyncWrites() override { CloseCounter(); - std::unordered_map> sync_values_stash; + ankerl::unordered_dense::map> sync_values_stash; for (auto q : pending_sync) { auto* query = GetQuery(q); if (True(query->flags & VideoCommon::QueryFlagBits::IsRewritten)) { diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp index f1e15595b3..1d7af349d1 100644 --- a/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.cpp @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include +#include #include diff --git a/src/video_core/renderer_vulkan/vk_render_pass_cache.h b/src/video_core/renderer_vulkan/vk_render_pass_cache.h index 91ad4bf577..5c7b3c2aed 100644 --- a/src/video_core/renderer_vulkan/vk_render_pass_cache.h +++ b/src/video_core/renderer_vulkan/vk_render_pass_cache.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include +#include #include "video_core/surface.h" #include "video_core/vulkan_common/vulkan_wrapper.h" @@ -47,7 +50,7 @@ public: private: const Device* device{}; - std::unordered_map cache; + ankerl::unordered_dense::map cache; std::mutex mutex; }; diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h index 244146fe52..7d93a542ef 100644 --- a/src/video_core/shader_cache.h +++ b/src/video_core/shader_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -148,8 +148,8 @@ private: mutable std::mutex lookup_mutex; std::mutex invalidation_mutex; - std::unordered_map> lookup_cache; - std::unordered_map> invalidation_cache; + ankerl::unordered_dense::map> lookup_cache; + ankerl::unordered_dense::map> invalidation_cache; std::vector> storage; std::vector marked_for_removal; }; diff --git a/src/video_core/shader_environment.h b/src/video_core/shader_environment.h index c5bd0e7339..183b6b903b 100644 --- a/src/video_core/shader_environment.h +++ b/src/video_core/shader_environment.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -79,10 +79,10 @@ protected: GPUVAddr program_base{}; std::vector code; - std::unordered_map texture_types; - std::unordered_map texture_pixel_formats; - std::unordered_map cbuf_values; - std::unordered_map cbuf_replacements; + ankerl::unordered_dense::map texture_types; + ankerl::unordered_dense::map texture_pixel_formats; + ankerl::unordered_dense::map cbuf_values; + ankerl::unordered_dense::map cbuf_replacements; u32 local_memory_size{}; u32 texture_bound{}; @@ -201,10 +201,10 @@ public: private: std::vector code; - std::unordered_map texture_types; - std::unordered_map texture_pixel_formats; - std::unordered_map cbuf_values; - std::unordered_map cbuf_replacements; + ankerl::unordered_dense::map texture_types; + ankerl::unordered_dense::map texture_pixel_formats; + ankerl::unordered_dense::map cbuf_values; + ankerl::unordered_dense::map cbuf_replacements; std::array workgroup_size{}; u32 local_memory_size{}; u32 shared_memory_size{}; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 2564a67780..0ed65e29e9 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include "common/alignment.h" @@ -1989,8 +1989,8 @@ SamplerId TextureCache

::FindSampler(const TSCEntry& config) { } const auto [pair, is_new] = channel_state->samplers.try_emplace(config); if (is_new) { - EnforceSamplerBudget(); pair->second = slot_samplers.insert(runtime, config); + EnforceSamplerBudget(); } return pair->second; } @@ -2035,7 +2035,7 @@ void TextureCache

::TrimInactiveSamplers(size_t budget) { } set.insert(id); }; - std::unordered_set active; + ankerl::unordered_dense::set active; active.reserve(channel_state->graphics_sampler_ids.size() + channel_state->compute_sampler_ids.size()); for (const SamplerId id : channel_state->graphics_sampler_ids) { @@ -2363,9 +2363,7 @@ void TextureCache

::UnregisterImage(ImageId image_id) { image.flags &= ~ImageFlagBits::BadOverlap; lru_cache.Free(image.lru_index); const auto& clear_page_table = - [image_id](u64 page, - std::unordered_map, Common::IdentityHash>& - selected_page_table) { + [image_id](u64 page, ankerl::unordered_dense::map, Common::IdentityHash>& selected_page_table) { const auto page_it = selected_page_table.find(page); if (page_it == selected_page_table.end()) { ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS); diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index 42f1a158d9..cff300da8f 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2023 yuzu Emulator Project @@ -12,8 +12,9 @@ #include #include #include +// TODO: find out which don't require stable iters #include -#include +#include #include #include #include @@ -66,7 +67,7 @@ struct AsyncDecodeContext { std::atomic_bool complete; }; -using TextureCacheGPUMap = std::unordered_map, Common::IdentityHash>; +using TextureCacheGPUMap = ankerl::unordered_dense::map, Common::IdentityHash>; class TextureCacheChannelInfo : public ChannelInfo { public: @@ -85,6 +86,7 @@ public: std::vector compute_sampler_ids; std::vector compute_image_view_ids; + // TODO: still relies on bad iterators :( std::unordered_map image_views; std::unordered_map samplers; @@ -454,10 +456,9 @@ private: RenderTargets render_targets; - std::unordered_map framebuffers; - - std::unordered_map, Common::IdentityHash> page_table; - std::unordered_map> sparse_views; + ankerl::unordered_dense::map framebuffers; + ankerl::unordered_dense::map, Common::IdentityHash> page_table; + ankerl::unordered_dense::map> sparse_views; DAddr virtual_invalid_space{}; @@ -514,7 +515,7 @@ private: DelayedDestructionRing sentenced_image_view; DelayedDestructionRing sentenced_framebuffers; - std::unordered_map image_allocs_table; + ankerl::unordered_dense::map image_allocs_table; Common::ScratchBuffer swizzle_data_buffer; Common::ScratchBuffer unswizzle_data_buffer; @@ -531,17 +532,17 @@ private: // Join caching boost::container::small_vector join_overlap_ids; - std::unordered_set join_overlaps_found; + ankerl::unordered_dense::set join_overlaps_found; boost::container::small_vector join_left_aliased_ids; boost::container::small_vector join_right_aliased_ids; - std::unordered_set join_ignore_textures; + ankerl::unordered_dense::set join_ignore_textures; boost::container::small_vector join_bad_overlap_ids; struct JoinCopy { bool is_alias; ImageId id; }; boost::container::small_vector join_copies_to_do; - std::unordered_map join_alias_indices; + ankerl::unordered_dense::map join_alias_indices; }; } // namespace VideoCommon diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index f06551b91e..8cb2ebfb62 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include @@ -145,7 +145,7 @@ VkFormatFeatureFlags GetFormatFeatures(VkFormatProperties properties, FormatType } } -std::unordered_map GetFormatProperties(vk::PhysicalDevice physical) { +ankerl::unordered_dense::map GetFormatProperties(vk::PhysicalDevice physical) { static constexpr std::array formats{ VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_A2B10G10R10_SINT_PACK32, @@ -287,7 +287,7 @@ std::unordered_map GetFormatProperties(vk::Physica VK_FORMAT_R8_USCALED, VK_FORMAT_S8_UINT, }; - std::unordered_map format_properties; + ankerl::unordered_dense::map format_properties; for (const auto format : formats) { format_properties.emplace(format, physical.GetFormatProperties(format)); } @@ -295,7 +295,7 @@ std::unordered_map GetFormatProperties(vk::Physica } #if defined(ANDROID) && defined(ARCHITECTURE_arm64) -void OverrideBcnFormats(std::unordered_map& format_properties) { +void OverrideBcnFormats(ankerl::unordered_dense::map& format_properties) { // These properties are extracted from Adreno driver 512.687.0 constexpr VkFormatFeatureFlags tiling_features{VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | @@ -1612,7 +1612,7 @@ void Device::CollectToolingInfo() { std::vector Device::GetDeviceQueueCreateInfos() const { static constexpr float QUEUE_PRIORITY = 1.0f; - std::unordered_set unique_queue_families{graphics_family, present_family}; + ankerl::unordered_dense::set unique_queue_families{graphics_family, present_family}; std::vector queue_cis; queue_cis.reserve(unique_queue_families.size()); diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 73a232ddee..7d738a81df 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "common/common_types.h" @@ -1074,7 +1074,7 @@ private: std::vector valid_heap_memory; ///< Heaps used. /// Format properties dictionary. - std::unordered_map format_properties; + ankerl::unordered_dense::map format_properties; /// Nsight Aftermath GPU crash tracker std::unique_ptr nsight_aftermath_tracker; diff --git a/src/yuzu/compatibility_list.h b/src/yuzu/compatibility_list.h index c0675d7936..bb1e4b6205 100644 --- a/src/yuzu/compatibility_list.h +++ b/src/yuzu/compatibility_list.h @@ -1,16 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include +#include #include #include "common/common_types.h" -using CompatibilityList = std::unordered_map>; +using CompatibilityList = ankerl::unordered_dense::map>; CompatibilityList::const_iterator FindMatchingCompatibilityEntry( const CompatibilityList& compatibility_list, u64 program_id); diff --git a/src/yuzu/configuration/input_profiles.h b/src/yuzu/configuration/input_profiles.h index 67f823ec83..326e7f9a1d 100644 --- a/src/yuzu/configuration/input_profiles.h +++ b/src/yuzu/configuration/input_profiles.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include "qt_common/config/qt_config.h" @@ -35,5 +35,5 @@ public: private: bool ProfileExistsInMap(const std::string& profile_name) const; - std::unordered_map> map_profiles; + ankerl::unordered_dense::map> map_profiles; }; diff --git a/src/yuzu/loading_screen.cpp b/src/yuzu/loading_screen.cpp index b081fff6b6..d6550a2c81 100644 --- a/src/yuzu/loading_screen.cpp +++ b/src/yuzu/loading_screen.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include +#include #include #include #include diff --git a/src/yuzu/loading_screen.h b/src/yuzu/loading_screen.h index 17045595d3..a39d5f6605 100644 --- a/src/yuzu/loading_screen.h +++ b/src/yuzu/loading_screen.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -77,8 +80,8 @@ private: std::unique_ptr fadeout_animation; // Definitions for the differences in text and styling for each stage - std::unordered_map progressbar_style; - std::unordered_map stage_translations; + ankerl::unordered_dense::map progressbar_style; + ankerl::unordered_dense::map stage_translations; // newly generated shaders are added to the end of the file, so when loading and compiling // shaders, it will start quickly but end slow if new shaders were added since previous launch. diff --git a/src/yuzu/multiplayer/chat_room.h b/src/yuzu/multiplayer/chat_room.h index e9eb48e824..a94683ef58 100644 --- a/src/yuzu/multiplayer/chat_room.h +++ b/src/yuzu/multiplayer/chat_room.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,8 +6,7 @@ #pragma once #include -#include -#include +#include #include #include #include @@ -66,8 +65,8 @@ private: bool has_mod_perms = false; QStandardItemModel* player_list; std::unique_ptr ui; - std::unordered_set block_list; - std::unordered_map icon_cache; + ankerl::unordered_dense::set block_list; + ankerl::unordered_dense::map icon_cache; }; Q_DECLARE_METATYPE(Network::ChatEntry); From efd26c3e4d400ab87b8d419c6a3c3d895664fdaa Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 10 Feb 2026 03:45:02 +0100 Subject: [PATCH 031/170] [android, nce] Remove LRU-Cache (#3500) This PR removes the obsolete logic of LRU-cache within, removing old and dead code, allows Android to avoid unnecesary usage of memory caching, aside to prevent some old bugs to arise in other systems that allows NCE, improves a small margin of performance and makes memory ram consumption overall better, by 300 - 500mb, revealing that part of the code was still active, even if LRU wasn't enabled. Signed-off-by: lizzie Signed-off-by: CamilleLaVey Co-authored-by: CamilleLaVey Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3500 Reviewed-by: DraVee Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- .../features/settings/model/BooleanSetting.kt | 2 - .../settings/model/view/SettingsItem.kt | 7 - .../settings/ui/SettingsFragmentPresenter.kt | 1 - .../app/src/main/jni/android_settings.h | 4 - .../app/src/main/res/values-ar/strings.xml | 3 - .../app/src/main/res/values-ckb/strings.xml | 3 - .../app/src/main/res/values-cs/strings.xml | 3 - .../app/src/main/res/values-de/strings.xml | 3 - .../app/src/main/res/values-es/strings.xml | 3 - .../app/src/main/res/values-fa/strings.xml | 2 - .../app/src/main/res/values-fr/strings.xml | 3 - .../app/src/main/res/values-he/strings.xml | 3 - .../app/src/main/res/values-hu/strings.xml | 3 - .../app/src/main/res/values-id/strings.xml | 3 - .../app/src/main/res/values-it/strings.xml | 3 - .../app/src/main/res/values-ja/strings.xml | 3 - .../app/src/main/res/values-ko/strings.xml | 3 - .../app/src/main/res/values-nb/strings.xml | 3 - .../app/src/main/res/values-pl/strings.xml | 3 - .../src/main/res/values-pt-rBR/strings.xml | 3 - .../src/main/res/values-pt-rPT/strings.xml | 3 - .../app/src/main/res/values-ru/strings.xml | 3 - .../app/src/main/res/values-sr/strings.xml | 3 - .../app/src/main/res/values-uk/strings.xml | 3 - .../app/src/main/res/values-vi/strings.xml | 3 - .../src/main/res/values-zh-rCN/strings.xml | 3 - .../src/main/res/values-zh-rTW/strings.xml | 3 - .../app/src/main/res/values/strings.xml | 3 - src/common/settings.h | 5 - src/core/arm/nce/lru_cache.h | 187 ------------------ src/core/arm/nce/patcher.cpp | 23 --- src/core/arm/nce/patcher.h | 30 +-- 32 files changed, 4 insertions(+), 326 deletions(-) delete mode 100644 src/core/arm/nce/lru_cache.h diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 157cc502b7..996c67367f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -73,8 +73,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { SHOW_SHADERS_BUILDING("show_shaders_building"), DEBUG_FLUSH_BY_LINE("flush_line"), - USE_LRU_CACHE("use_lru_cache"), - DONT_SHOW_DRIVER_SHADER_WARNING("dont_show_driver_shader_warning"), ENABLE_OVERLAY("enable_overlay"), 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 47932c2dd8..8bb618289e 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 @@ -123,13 +123,6 @@ abstract class SettingsItem( // List of all general val settingsItems = HashMap().apply { put(StringInputSetting(StringSetting.DEVICE_NAME, titleId = R.string.device_name)) - put( - SwitchSetting( - BooleanSetting.USE_LRU_CACHE, - titleId = R.string.use_lru_cache, - descriptionId = R.string.use_lru_cache_description - ) - ) put( SwitchSetting( BooleanSetting.RENDERER_USE_SPEED_LIMIT, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index e7c2dbf609..8135b6043c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -235,7 +235,6 @@ class SettingsFragmentPresenter( add(HeaderSetting(R.string.cpu)) add(IntSetting.FAST_CPU_TIME.key) - add(BooleanSetting.USE_LRU_CACHE.key) add(BooleanSetting.CORE_SYNC_CORE_SPEED.key) add(IntSetting.MEMORY_LAYOUT.key) diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index 7643d49532..ac64251e20 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -54,10 +54,6 @@ namespace AndroidSettings { Settings::SwitchableSetting driver_path{linkage, "", "driver_path", Settings::Category::GpuDriver}; - // LRU Cache - Settings::SwitchableSetting use_lru_cache{linkage, true, "use_lru_cache", - Settings::Category::System}; - Settings::Setting theme{linkage, 0, "theme", Settings::Category::Android}; Settings::Setting theme_mode{linkage, -1, "theme_mode", Settings::Category::Android}; Settings::Setting black_backgrounds{linkage, false, "black_backgrounds", diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index ea8c9c340a..05f65ecf78 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -94,9 +94,6 @@ مزامنة سرعة النواة قم بمزامنة سرعة النواة مع النسبة المئوية للسرعة القصوى لتحسين الأداء دون تغيير السرعة الفعلية للعبة. - تمكين ذاكرة التخزين المؤقتة LRU - قم بتمكين أو تعطيل ذاكرة التخزين المؤقتة الأقل استخدامًا (LRU)، مما يزيد من الأداء عن طريق توفير استخدام معالج وحدة المعالجة المركزية. قد تواجه بعض الألعاب مشكلات مع هذا الإعداد، لذا قم بتعطيله إذا لم يتم تشغيل اللعبة أو تعطلت بشكل عشوائي. - تمكين محاكاة MMU المضيف يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية. مقابض تصحيح الأخطاء diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 3ba262a436..ea5208a26b 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -58,9 +58,6 @@ مزامنة سرعة النواة خێرایی تیکەکانی ناوک ڕێکبخە لەگەڵ ڕێژەی خێرایی بەرزترین بۆ باشترکردنی کارایی بەبێ گۆڕینی خێرایی ڕاستەقینەی یارییەکە. - تمكين ذاكرة التخزين المؤقت LRU - چالاک یان ناچالاککردنی کاشەی LRU، کارایی باشتر دەکات بە هەڵگرتنی بەکارهێنانی پرۆسەی CPU. هەندێک یاری کێشەی لەگەڵ هەیە، بەتایبەتی TotK 1.2.1، بۆیە بیخەوێنە ئەگەر یاریەکە نەگەڕێت یان بە هەڕەمەکی بشکێت. - چالاککردنی میمیکردنی MMU میواندە ئەم باشکردنە خێرایی دەستکەوتنی بیرگە لەلایەن پرۆگرامی میوانەکە زیاد دەکات. چالاککردنی وای لێدەکات کە خوێندنەوە/نووسینەکانی بیرگەی میوانەکە ڕاستەوخۆ لە بیرگە ئەنجام بدرێت و میمیکردنی MMU میواندە بەکاربهێنێت. ناچالاککردنی ئەمە هەموو دەستکەوتنەکانی بیرگە ڕەت دەکاتەوە لە بەکارهێنانی میمیکردنی MMU نەرمەکاڵا. diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 99aa22271b..b56c21c9b0 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -90,9 +90,6 @@ Synchronizovat rychlost jádra Synchronizuje rychlost jádra s nastaveným limitem rychlosti, aby se zlepšil výkon bez zrychlení samotné hry. - Zapnout mezipaměť LRU - Zapne, nebo vypne mezipaměť LRU (Least Recently Used). Ta zvyšuje výkon tím, že šetří využití procesoru. Některé hry s tímto mohou mít problém, takže pokud se hra nespustí, nebo náhodně padá, tuto volbu vypněte. - Povolit emulaci hostitelské MMU Tato optimalizace zrychluje hostovanému programu přístupy do paměti. Zapnutím této funkce se čtení i zápisy do paměti provádějí přímo a využívají hostitelskou MMU. Při vypnutí musí všechny přístupy do paměti použít softwarovou emulaci MMU. Ladící parametry diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 1962a84257..7524402e6e 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -90,9 +90,6 @@ Kern-Geschwindigkeit synchronisieren Synchronisiert die Taktrate des Kerns mit der maximalen Geschwindigkeit, um die Leistung zu verbessern, ohne die tatsächliche Spielgeschwindigkeit zu verändern. - LRU-Cache aktivieren - Aktivieren oder deaktivieren Sie den LRU-Cache, um die Leistung durch Einsparung von CPU-Prozessorauslastung zu verbessern. Einige Spiele haben Probleme damit, insbesondere TotK 1.2.1, deaktivieren Sie es also, wenn das Spiel nicht startet oder zufällig abstürzt. - Host-MMU-Emulation aktivieren Diese Optimierung beschleunigt Speicherzugriffe durch das Gastprogramm. Wenn aktiviert, erfolgen Speicherlese- und -schreibvorgänge des Gastes direkt im Speicher und nutzen die MMU des Hosts. Das Deaktivieren erzwingt die Verwendung der Software-MMU-Emulation für alle Speicherzugriffe. Debug-Regler diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 358b892887..c0334ba8ba 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -75,9 +75,6 @@ Sincronizar la velocidad del núcleo Sincroniza la velocidad del núcleo con el porcentaje máximo de velocidad para mejorar el rendimiento sin alterar la velocidad real del juego. - Habilitar caché LRU - Habilite o deshabilite la caché menos utilizada recientemente (LRU), aumentando el rendimiento al ahorrar el uso del proceso de la CPU. Algunos juegos pueden ver problemas con esta configuración, así que desactívela si el juego no arranca o se bloquea aleatoriamente. - Habilitar emulación de MMU del anfitrión Esta optimización acelera el acceso a la memoria del programa invitado. Al habilitarla, las lecturas y escrituras de la memoria del invitado se realizan directamente en la memoria y utilizan la MMU del anfitrión. Al deshabilitarla, todos los accesos a la memoria utilizan el software de emulación de la MMU. diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 3f123e872a..80e40444c2 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -60,8 +60,6 @@ اطمینان از سازگاری داده‌ها بین عملیات محاسباتی و حافظه. این گزینه ممکن است مشکلات برخی بازی‌ها را رفع کند، اما در برخی موارد ممکن است عملکرد را کاهش دهد. به نظر می‌رسد بازی‌های با Unreal Engine 4 بیشترین تأثیر را داشته باشند. غیرفعال کردن مرتب‌سازی مجدد بافر در صورت انتخاب، مرتب‌سازی مجدد آپلودهای حافظه نگاشت‌شده غیرفعال می‌شود که امکان ارتباط آپلودها با ترسیمات خاص را فراهم می‌کند. ممکن است در برخی موارد عملکرد را کاهش دهد. - فعال‌سازی حافظه نهان LRU - حافظه پنهان LRU را فعال یا غیرفعال کنید تا با کاهش استفاده از پردازنده، عملکرد بهبود یابد. برخی بازی‌ها مانند TotK 1.2.1 با این ویژگی مشکل دارند، در صورت عدم راه‌اندازی یا قطعی تصادفی بازی، آن را غیرفعال کنید. حالت پویای گسترده تعداد قابلیت‌هایی که می‌توان در حالت Extended Dynamic State استفاده کرد را کنترل می‌کند. اعداد بالاتر قابلیت‌های بیشتری را فعال کرده و می‌توانند عملکرد را افزایش دهند، اما ممکن است با برخی درایورها و فروشندگان مشکلاتی ایجاد کنند. مقدار پیش‌فرض بسته به سیستم و قابلیت‌های سخت‌افزاری شما ممکن است متفاوت باشد. این مقدار را می‌توان تغییر داد تا زمانی که پایداری و کیفیت بصری بهتری حاصل شود. غیرفعال diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 5501244f6e..add275870d 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -75,9 +75,6 @@ Synchroniser la vitesse du cœur Synchronise la vitesse du cœur avec le pourcentage de vitesse maximal pour améliorer les performances sans modifier la vitesse réelle du jeu. - Activer le cache LRU - Active ou désactive le cache LRU (Least Recently Used) pour améliorer les performances en réduisant l’utilisation du processeur. Certains jeux peuvent rencontrer des problèmes avec ce réglage ; désactivez-le si le jeu ne démarre pas ou plante de manière aléatoire. - Activer l\'émulation de la MMU hôte Cette optimisation accélère les accès mémoire par le programme invité. L\'activer entraîne que les lectures/écritures mémoire de l\'invité sont effectuées directement en mémoire et utilisent la MMU de l\'hôte. Désactiver cela force tous les accès mémoire à utiliser l\'émulation logicielle de la MMU. Boutons de débogage diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index 978f017fd5..bb156ba308 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -62,9 +62,6 @@ סנכרון מהירות ליבה סנכרן את מהירות הליבה לאחוז המהירות המרבי כדי לשפר ביצועים מבלי לשנות את מהירות המשחק בפועל. - הפעלת מטמון LRU - הפעל או השבת מטמון LRU לשיפור ביצועים על ידי חיסכון בשימוש במעבד. לחלק מהמשחקים כמו TotK 1.2.1 יש בעיות - השבת אם המשחק לא עולה או קורס באקראי. - הפעל אמולציית MMU מארח אופטימיזציה זו מאיצה את גישת הזיכרון על ידי התוכנית האורחת. הפעלתה גורמת לכך שפעולות קריאה/כתיבה לזיכרון האורח מתבצעות ישירות לזיכרון ומשתמשות ב-MMU של המארח. השבתת זאת מאלצת את כל גישות הזיכרון להשתמש באמולציית MMU תוכנתית. לשימוש בפיתוח בלבד. diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index fcfcba403b..606da0b470 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -58,9 +58,6 @@ Magsebesség szinkronizálása A mag sebességének szinkronizálása a maximális sebesség százalékával a teljesítmény javítása érdekében a játék tényleges sebességének megváltoztatása nélkül. - LRU gyorsítótár engedélyezése - Engedélyezi vagy letiltja az LRU gyorsítótárat, növelve a teljesítményt a CPU használat csökkentésével. Néhány játéknak (különösen a TotK 1.2.1-nek) problémája lehet vele - tiltsa le, ha a játék nem indul el vagy véletlenszerűen összeomlik. - Gazda MMU emuláció engedélyezése Ez az optimalizáció gyorsítja a vendégprogram memória-hozzáférését. Engedélyezése esetén a vendég memóriaolvasási/írási műveletei közvetlenül a memóriában történnek, és kihasználják a gazda MMU-ját. Letiltás esetén minden memória-hozzáférés a szoftveres MMU emulációt használja. diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 921030d07b..1189e7444b 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -77,9 +77,6 @@ Sinkronisasi Kecepatan Inti Sinkronkan kecepatan inti dengan persentase kecepatan maksimum untuk meningkatkan performa tanpa mengubah kecepatan sebenarnya dari permainan. - Aktifkan LRU Cache - Aktifkan atau nonaktifkan cache LRU untuk meningkatkan performa dengan mengurangi penggunaan proses CPU. Beberapa game seperti TotK 1.2.1 memiliki masalah - nonaktifkan jika game tidak mau berjalan atau crash acak. - Aktifkan Emulasi MMU Host Optimasi ini mempercepat akses memori oleh program tamu. Mengaktifkannya menyebabkan pembacaan/penulisan memori tamu dilakukan langsung ke memori dan memanfaatkan MMU Host. Menonaktifkan ini memaksa semua akses memori menggunakan Emulasi MMU Perangkat Lunak. diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 9edb175879..cf0efab261 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -75,9 +75,6 @@ Sincronizza velocità core Sincronizza la velocità del core con la percentuale massima di velocità per migliorare le prestazioni senza alterare la velocità effettiva del gioco. - Abilita cache LRU - Abilita o disabilita la cache LRU per migliorare le prestazioni riducendo l\'uso della CPU. Alcuni giochi come TotK 1.2.1 hanno problemi - disabilitalo se il gioco non si avvia o crasha casualmente. - Abilita l\'emulazione della MMU nell\'host Questa ottimizzazione accelera gli accessi alla memoria da parte del programma guest. Abilitandola, le letture/scritture della memoria guest vengono eseguite direttamente in memoria e sfruttano la MMU host. Disabilitandola, tutti gli accessi alla memoria sono costretti a utilizzare l\'emulazione software della MMU. diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index ecfb367728..cf382a9792 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -58,9 +58,6 @@ コア速度の同期 コアの速度を最大速度パーセンテージに同期させ、ゲームの実際の速度を変えずにパフォーマンスを向上させます。 - LRUキャッシュを有効化 - LRUキャッシュを有効/無効にし、CPUプロセスの使用を節約してパフォーマンスを向上させます。TotK 1.2.1など一部のゲームで問題が発生する可能性があるため、ゲームが起動しない場合やランダムにクラッシュする場合は無効にしてください。 - ホストMMUエミュレーションを有効化 この最適化により、ゲストプログラムによるメモリアクセスが高速化されます。有効にすると、ゲストのメモリ読み書きが直接メモリ内で実行され、ホストのMMUを利用します。無効にすると、すべてのメモリアクセスでソフトウェアMMUエミュレーションが使用されます。 diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index 2a094d6996..173d9b5678 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -58,9 +58,6 @@ 코어 속도 동기화 코어 틱 속도를 최대 속도 백분율과 동기화하여 게임의 실제 속도를 변경하지 않고 성능을 향상시킵니다. - LRU 캐시 사용 - LRU 캐시를 활성화 또는 비활성화하여 CPU 프로세스 사용을 절약하고 성능을 향상시킵니다. TotK 1.2.1을 포함한 일부 게임에서 문제가 발생할 수 있으므로 게임이 부팅되지 않거나 무작위로 충돌하는 경우 비활성화하세요. - 호스트 MMU 에뮬레이션 사용 이 최적화는 게스트 프로그램의 메모리 접근 속도를 높입니다. 활성화하면 게스트의 메모리 읽기/쓰기가 메모리에서 직접 수행되고 호스트의 MMU를 활용합니다. 비활성화하면 모든 메모리 접근에 소프트웨어 MMU 에뮬레이션을 사용하게 됩니다. diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index b1be0f3fdc..b3f8f4902c 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -58,9 +58,6 @@ Synkroniser kjernespeed Synkroniser kjernens hastighet med maksimal hastighetsprosent for å forbedre ytelsen uten å endre spillets faktiske hastighet. - Aktiver LRU-mellomlager - Aktiver eller deaktiver LRU-mellomlager for å forbedre ytelsen ved å spare CPU-prosessorbruk. Noen spill som TotK 1.2.1 har problemer med dette - deaktiver hvis spillet ikke starter eller krasjer tilfeldig. - Aktiver verts-MMU-emulering Denne optimaliseringen fremskynder minnetilgang av gjesteprogrammet. Hvis aktivert, utføres gjestens minnelesing/skriving direkte i minnet og bruker vertens MMU. Deaktivering tvinger alle minnetilganger til å bruke programvarebasert MMU-emulering. diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index 0b0c524405..3d69cce8f3 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -90,9 +90,6 @@ Synchronizuj prędkość rdzenia Synchronizuje prędkość rdzenia z maksymalnym procentem prędkości, aby poprawić wydajność bez zmiany rzeczywistej prędkości gry. - Włącz pamięć podręczną LRU - Włącz lub wyłącz pamięć podręczną LRU, aby poprawić wydajność poprzez zmniejszenie użycia procesora. Niektóre gry, takie jak TotK 1.2.1, mogą mieć problemy - wyłącz, jeśli gra się nie uruchamia lub losowo zawiesza. - Włącz emulację MMU hosta Ta optymalizacja przyspiesza dostęp do pamięci przez program gościa. Włączenie powoduje, że odczyty/zapisy pamięci gościa są wykonywane bezpośrednio w pamięci i wykorzystują MMU hosta. Wyłączenie wymusza użycie programowej emulacji MMU dla wszystkich dostępów do pamięci. Przełączniki debugowania diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 55ad2cb098..08e2695d2e 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -84,9 +84,6 @@ Sincronizar Velocidade do Núcleo Aumenta a velocidade do ciclo do núcleo até o máximo para melhorar o desempenho, mantendo a velocidade real do jogo inalterada. - Ativar Cache LRU - O cache Least Recently Used (LRU, ou Itens Menos Usados) aumenta o desempenho, economizando o uso do processador. Alguns jogos podem apresentar problemas com esta configuração. Desative-a caso o jogo não inicie ou trave aleatoriamente. - Ativar Emulação da MMU do Sistema Esta otimização acelera o acesso à memória pelo programa. Ao ativá-la, leituras e gravações são feitas diretamente na memória, usando a MMU (Unidade de Gerenciamento de Memória) do sistema. Ao desativar, todos os acessos passam a utilizar a Emulação de MMU por Software. Controles de Depuração diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 9aba51007e..1cbbb74c34 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -58,9 +58,6 @@ Sincronizar velocidade do núcleo Sincroniza a velocidade do núcleo com a percentagem máxima de velocidade para melhorar o desempenho sem alterar a velocidade real do jogo. - Ativar cache LRU - Ative ou desative a cache LRU para melhorar desempenho poupando uso do processador. Alguns jogos como TotK 1.2.1 têm problemas - desative se o jogo não iniciar ou falhar aleatoriamente. - Ativar Emulação de MMU do Anfitrião Esta otimização acelera os acessos à memória pelo programa convidado. Ativar faz com que as leituras/escritas de memória do convidado sejam efetuadas diretamente na memória e utilizem a MMU do Anfitrião. Desativar força todos os acessos à memória a usar a Emulação de MMU por Software. diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 7b3ae7bdc7..a9a3cceaae 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -92,9 +92,6 @@ Синхронизация скорости ядра Синхронизирует скорость ядра с максимальным процентом скорости для улучшения производительности без изменения фактической скорости игры. - Включить LRU-кеш - Включите или отключите кэш LRU (наименее недавно использованный), повышая производительность за счёт снижения нагрузки на ЦП. Некоторые игры могут работать с ним некорректно (например, TotK 1.2.1), поэтому отключите, если игра не запускается или случайно вылетает. - Включить эмуляцию MMU хоста Эта оптимизация ускоряет доступ к памяти гостевой программой. При включении операции чтения/записи памяти гостя выполняются напрямую в памяти с использованием MMU хоста. Отключение заставляет все обращения к памяти использовать программную эмуляцию MMU. Настройки отладки diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index 306ae44e57..62fe3f2fa3 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -56,9 +56,6 @@ Синхронизујте брзину језгре Синхронизујте језгро Тицк Брзина брзине максималне брзине да бисте побољшали перформансе без измене стварне брзине игре. - Омогући ЛРУ кеш - Омогућите или онемогућите најмање недавно коришћене (ЛРУ) кеш меморије, све веће перформансе штедећи употребу процеса ЦПУ-а. Неке игре са њом имају проблеме, посебно тотк 1.2.1, тако да онемогућите ако се игра не покрене или се руши насумично. - Омогући емулацију MMU домаћина Ова оптимизација убрзава приступ меморији од стране гостујућег програма. Укључивање изазива да се читања/уписа меморије госта обављају директно у меморији и користе MMU домаћина. Искључивање присиљава све приступе меморији да користе софтверску емулацију MMU. diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 9b8b84581d..ada2445d05 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -94,9 +94,6 @@ Синхронізувати швидкість ядра Синхронізує швидкість ядра з максимальним відсотком швидкості для покращення продуктивності без зміни реальної швидкості гри. - Увімкнути LRU-кеш - Увімкніть або вимкніть кеш LRU (Least Recently Used) для покращення продуктивності шляхом зменшення навантаження на CPU. Деякі ігри (зокрема TotK 1.2.1) можуть працювати некоректно - вимкніть, якщо гра не запускається або раптово вилітає. - Увімкнути емуляцію MMU хоста Ця оптимізація пришвидшує доступ до пам\'яті гостьовою програмою. Увімкнення призводить до того, що читання/запис пам\'яті гостя виконуються безпосередньо в пам\'яті та використовують MMU хоста. Вимкнення змушує всі звернення до пам\'яті використовувати програмну емуляцію MMU. Зневаджувальні регулятори diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 5445ded6d0..82331efb1c 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -58,9 +58,6 @@ Đồng bộ tốc độ lõi Đồng bộ tốc độ lõi với tỷ lệ phần trăm tốc độ tối đa để cải thiện hiệu suất mà không làm thay đổi tốc độ thực tế của trò chơi. - Bật bộ nhớ đệm LRU - Bật hoặc tắt bộ nhớ đệm LRU để cải thiện hiệu suất bằng cách tiết kiệm quy trình sử dụng CPU. Một số trò chơi như TotK 1.2.1 có vấn đề - hãy tắt nếu trò chơi không khởi động hoặc bị treo ngẫu nhiên. - Bật giả lập MMU Máy chủ Tối ưu hóa này tăng tốc độ truy cập bộ nhớ của chương trình khách. Bật nó lên khiến các thao tác đọc/ghi bộ nhớ khách được thực hiện trực tiếp vào bộ nhớ và sử dụng MMU của Máy chủ. Tắt tính năng này buộc tất cả quyền truy cập bộ nhớ phải sử dụng Giả lập MMU Phần mềm. diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 34a7eace23..08b55297a7 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -94,9 +94,6 @@ 同步核心速度 将核心速度与最大速度百分比同步,在不改变游戏实际速度的情况下提高性能。 - 启用LRU缓存 - 启用或禁用LRU缓存,通过节省CPU进程使用来提高性能。某些游戏可能存在问题,特别是TotK 1.2.1,如果游戏无法启动或随机崩溃,请禁用此选项。 - 启用主机 MMU 模拟 此优化可加速来宾程序的内存访问。启用后,来宾内存读取/写入将直接在内存中执行并利用主机的 MMU。禁用此功能将强制所有内存访问使用软件 MMU 模拟。 调试开关 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 8c7ec7d172..c7061ebc03 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -90,9 +90,6 @@ 同步核心速度 將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能。 - 啟用LRU快取 - 啟用或停用LRU快取,透過節省CPU進程使用率來提高效能。某些遊戲可能存在問題,特別是薩爾達傳說:王國之淚 v1.2.1(更新),如果遊戲無法啟動或隨機崩潰,請停用此選項。 - 啟用主機 MMU 模擬 此最佳化可加速來賓程式的記憶體存取。啟用後,來賓記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬。 偵錯開關 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 93331ec2d8..97aa054e8a 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -99,9 +99,6 @@ Synchronize Core Speed Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed. - Enable LRU Cache - Enable or disable the Least Recently Used (LRU) cache, increasing performance by saving CPU process usage. Some games may see issues with this setting, so disable it if the game doesn\'t boot or crashes randomly. - Enable Host MMU Emulation This optimization speeds up memory accesses by the guest program. Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host\'s MMU. Disabling this forces all memory accesses to use Software MMU Emulation. Debug knobs diff --git a/src/common/settings.h b/src/common/settings.h index 41f766a5e7..a609894027 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -217,11 +217,6 @@ struct Values { SwitchableSetting sync_core_speed{linkage, false, "sync_core_speed", Category::Core, Specialization::Default}; - // Memory -#ifdef HAS_NCE - SwitchableSetting lru_cache_enabled{linkage, false, "use_lru_cache", Category::System}; -#endif - // Cpu SwitchableSetting cpu_backend{linkage, #ifdef HAS_NCE diff --git a/src/core/arm/nce/lru_cache.h b/src/core/arm/nce/lru_cache.h deleted file mode 100644 index 947b66f675..0000000000 --- a/src/core/arm/nce/lru_cache.h +++ /dev/null @@ -1,187 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once -#include -#include -#include -#include -#include - -#include "common/logging/log.h" - -template -class LRUCache { -public: - using key_type = KeyType; - using value_type = ValueType; - using size_type = std::size_t; - - struct Statistics { - size_type hits = 0; - size_type misses = 0; - void reset() noexcept { hits = misses = 0; } - }; - - explicit LRUCache(size_type capacity, bool enabled = true) - : enabled_{enabled}, capacity_{capacity} { - cache_map_.reserve(capacity_); - LOG_WARNING(Core, "LRU Cache initialised (state: {} | capacity: {})", enabled_ ? "enabled" : "disabled", capacity_); - } - - // Non-movable copy semantics - LRUCache(const LRUCache&) = delete; - LRUCache& operator=(const LRUCache&) = delete; - LRUCache(LRUCache&& other) noexcept { *this = std::move(other); } - LRUCache& operator=(LRUCache&& other) noexcept { - if (this == &other) return *this; - std::unique_lock this_lock(mutex_, std::defer_lock); - std::unique_lock other_lock(other.mutex_, std::defer_lock); - std::lock(this_lock, other_lock); - enabled_ = other.enabled_; - capacity_ = other.capacity_; - cache_list_ = std::move(other.cache_list_); - cache_map_ = std::move(other.cache_map_); - stats_ = other.stats_; - return *this; - } - ~LRUCache() = default; - - [[nodiscard]] value_type* get(const key_type& key) { - if (!enabled_) [[unlikely]] return nullptr; - std::unique_lock lock(mutex_); - auto it = cache_map_.find(key); - if (it == cache_map_.end()) { - ++stats_.misses; - return nullptr; - } - move_to_front(it); - ++stats_.hits; - return &it->second.second; - } - - [[nodiscard]] value_type* peek(const key_type& key) const { - if (!enabled_) [[unlikely]] return nullptr; - std::shared_lock lock(mutex_); - auto it = cache_map_.find(key); - return it == cache_map_.end() ? nullptr : &it->second.second; - } - - template - void put(const key_type& key, V&& value) { - if (!enabled_) [[unlikely]] return; - std::unique_lock lock(mutex_); - insert_or_update(key, std::forward(value)); - } - - template - value_type& get_or_emplace(const key_type& key, ValueFactory&& factory) { - std::unique_lock lock(mutex_); - auto it = cache_map_.find(key); - if (it != cache_map_.end()) { - move_to_front(it); - return it->second.second; - } - value_type new_value = factory(); - insert_or_update(key, std::move(new_value)); - return cache_map_.find(key)->second.second; - } - - [[nodiscard]] bool contains(const key_type& key) const { - if (!enabled_) return false; - std::shared_lock lock(mutex_); - return cache_map_.find(key) != cache_map_.end(); - } - - bool erase(const key_type& key) { - if (!enabled_) return false; - std::unique_lock lock(mutex_); - auto it = cache_map_.find(key); - if (it == cache_map_.end()) return false; - cache_list_.erase(it->second.first); - cache_map_.erase(it); - return true; - } - - void clear() { - std::unique_lock lock(mutex_); - cache_list_.clear(); - cache_map_.clear(); - stats_.reset(); - } - - [[nodiscard]] size_type size() const { - if (!enabled_) return 0; - std::shared_lock lock(mutex_); - return cache_map_.size(); - } - - [[nodiscard]] size_type get_capacity() const { return capacity_; } - - void resize(size_type new_capacity) { - if (!enabled_) return; - std::unique_lock lock(mutex_); - capacity_ = new_capacity; - shrink_if_needed(); - cache_map_.reserve(capacity_); - } - - void setEnabled(bool state) { - std::unique_lock lock(mutex_); - enabled_ = state; - LOG_WARNING(Core, "LRU Cache state changed to: {}", state ? "enabled" : "disabled"); - if (!enabled_) clear(); - } - - [[nodiscard]] bool isEnabled() const { return enabled_; } - - [[nodiscard]] Statistics stats() const { - std::shared_lock lock(mutex_); - return stats_; - } - -private: - using list_type = std::list; - using list_iterator = typename list_type::iterator; - using map_value_type = std::pair; - using map_type = ankerl::unordered_dense::map; - - template - void insert_or_update(const key_type& key, V&& value) { - auto it = cache_map_.find(key); - if (it != cache_map_.end()) { - it->second.second = std::forward(value); - move_to_front(it); - return; - } - // evict LRU if full - if (cache_map_.size() >= capacity_) { - const auto& lru_key = cache_list_.back(); - cache_map_.erase(lru_key); - cache_list_.pop_back(); - } - cache_list_.push_front(key); - cache_map_[key] = {cache_list_.begin(), std::forward(value)}; - } - - void move_to_front(typename map_type::iterator it) { - cache_list_.splice(cache_list_.begin(), cache_list_, it->second.first); - it->second.first = cache_list_.begin(); - } - - void shrink_if_needed() { - while (cache_map_.size() > capacity_) { - const auto& lru_key = cache_list_.back(); - cache_map_.erase(lru_key); - cache_list_.pop_back(); - } - } - -private: - mutable std::shared_mutex mutex_; - bool enabled_{true}; - size_type capacity_; - list_type cache_list_; - map_type cache_map_; - mutable Statistics stats_; -}; diff --git a/src/core/arm/nce/patcher.cpp b/src/core/arm/nce/patcher.cpp index 3a620bff12..bd8e4fd7fb 100644 --- a/src/core/arm/nce/patcher.cpp +++ b/src/core/arm/nce/patcher.cpp @@ -17,27 +17,6 @@ namespace Core::NCE { -Patcher::Patcher(Patcher&& other) noexcept - : patch_cache(std::move(other.patch_cache)), - m_patch_instructions(std::move(other.m_patch_instructions)), - m_patch_instructions_pre(std::move(other.m_patch_instructions_pre)), - c(m_patch_instructions), - c_pre(m_patch_instructions_pre), - m_save_context(other.m_save_context), - m_load_context(other.m_load_context), - m_save_context_pre(other.m_save_context_pre), - m_load_context_pre(other.m_load_context_pre), - mode(other.mode), - total_program_size(other.total_program_size), - m_relocate_module_index(other.m_relocate_module_index), - modules(std::move(other.modules)), - curr_patch(nullptr) { - if (!modules.empty()) { - curr_patch = &modules.back(); - } -} - - using namespace Common::Literals; using namespace oaknut::util; @@ -47,8 +26,6 @@ constexpr size_t MaxRelativeBranch = 128_MiB; constexpr u32 ModuleCodeIndex = 0x24 / sizeof(u32); Patcher::Patcher() : c(m_patch_instructions), c_pre(m_patch_instructions_pre) { - LOG_WARNING(Core_ARM, "Patcher initialized with LRU cache {}", - patch_cache.isEnabled() ? "enabled" : "disabled"); // The first word of the patch section is always a branch to the first instruction of the // module. c.dw(0); diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index 8612cfc63d..303cf68ec6 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -9,12 +9,12 @@ #include #include +#include "common/logging/log.h" #include "common/common_types.h" #include "common/settings.h" #include "core/hle/kernel/code_set.h" #include "core/hle/kernel/k_typed_address.h" #include "core/hle/kernel/physical_memory.h" -#include "lru_cache.h" #include using ModuleID = std::array; // NSO build ID struct PatchCacheKey { @@ -44,6 +44,7 @@ enum class PatchMode : u32 { Split, ///< Patch sections are inserted before .text and after .data }; + using ModuleTextAddress = u64; using PatchTextAddress = u64; using EntryTrampolines = ankerl::unordered_dense::map; @@ -53,10 +54,6 @@ public: void SetModuleID(const ModuleID& id) { module_id = id; } - Patcher(const Patcher&) = delete; - Patcher& operator=(const Patcher&) = delete; - Patcher(Patcher&& other) noexcept; - Patcher& operator=(Patcher&&) noexcept = delete; explicit Patcher(); ~Patcher(); bool PatchText(const Kernel::PhysicalMemory& program_image, @@ -99,28 +96,9 @@ private: void WriteCntpctHandler(ModuleDestLabel module_dest, oaknut::XReg dest_reg) { WriteCntpctHandler(module_dest, dest_reg, c); } private: - static constexpr size_t CACHE_SIZE = 16384; // Cache size for patch entries - LRUCache patch_cache{CACHE_SIZE, Settings::values.lru_cache_enabled.GetValue()}; - void BranchToPatch(uintptr_t module_dest) { - if (patch_cache.isEnabled()) { - PatchCacheKey key{module_id, module_dest}; - LOG_DEBUG(Core_ARM, "LRU cache lookup for module={}, offset={:#x}", fmt::ptr(module_id.data()), module_dest); - // Try to get existing patch entry from cache - if (auto* cached_patch = patch_cache.get(key)) { - LOG_WARNING(Core_ARM, "LRU cache hit for module offset {:#x}", module_dest); - curr_patch->m_branch_to_patch_relocations.push_back({c.offset(), *cached_patch}); - return; - } - LOG_DEBUG(Core_ARM, "LRU cache miss for module offset {:#x}, creating new patch", module_dest); - // Not in cache: create and store - const auto patch_addr = c.offset(); - curr_patch->m_branch_to_patch_relocations.push_back({patch_addr, module_dest}); - patch_cache.put(key, patch_addr); - } else { - LOG_DEBUG(Core_ARM, "LRU cache disabled - direct patch for offset {:#x}", module_dest); - curr_patch->m_branch_to_patch_relocations.push_back({c.offset(), module_dest}); - } + LOG_DEBUG(Core_ARM, "Patch for offset {:#x}", module_dest); + curr_patch->m_branch_to_patch_relocations.push_back({c.offset(), module_dest}); } void BranchToPatchPre(uintptr_t module_dest) { From aacc40254c6e0b93f66c1189cd09a01b9203a0b9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 10 Feb 2026 21:33:22 +0100 Subject: [PATCH 032/170] [cmake, ci/scripts] update missed YUZU_ENABLE_LTO -> ENABLE_LTO (#3503) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3503 Reviewed-by: DraVee Reviewed-by: Maufeat Co-authored-by: lizzie Co-committed-by: lizzie --- .ci/linux/build.sh | 5 ++--- .ci/windows/build.sh | 5 ++--- externals/nx_tzdb/CMakeLists.txt | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) mode change 100644 => 100755 .ci/windows/build.sh diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh index 16eaef394b..2a0a7e58b1 100755 --- a/.ci/linux/build.sh +++ b/.ci/linux/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later case "$1" in @@ -104,8 +104,7 @@ cmake .. -G Ninja \ -DYUZU_USE_QT_MULTIMEDIA=$MULTIMEDIA \ -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ -DYUZU_USE_FASTER_LD=ON \ - -DYUZU_ENABLE_LTO=ON \ - -DDYNARMIC_ENABLE_LTO=ON \ + -DENABLE_LTO=ON \ "${EXTRA_CMAKE_FLAGS[@]}" ninja -j${NPROC} diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh old mode 100644 new mode 100755 index fd1883048c..48cca8eb4d --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -ex -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later if [ "$COMPILER" == "clang" ] @@ -32,9 +32,8 @@ cmake .. -G Ninja \ -DYUZU_ROOM_STANDALONE=OFF \ -DYUZU_USE_QT_MULTIMEDIA=${USE_MULTIMEDIA:-false} \ -DYUZU_USE_QT_WEB_ENGINE=${USE_WEBENGINE:-false} \ - -DYUZU_ENABLE_LTO=ON \ + -DENABLE_LTO=ON \ -DCMAKE_EXE_LINKER_FLAGS=" /LTCG" \ - -DDYNARMIC_ENABLE_LTO=ON \ -DYUZU_USE_BUNDLED_QT=${BUNDLE_QT:-false} \ -DUSE_CCACHE=${CCACHE:-false} \ -DENABLE_UPDATE_CHECKER=${DEVEL:-true} \ diff --git a/externals/nx_tzdb/CMakeLists.txt b/externals/nx_tzdb/CMakeLists.txt index b9aa50acd5..a82bf0b132 100644 --- a/externals/nx_tzdb/CMakeLists.txt +++ b/externals/nx_tzdb/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2023 yuzu Emulator Project @@ -33,7 +33,7 @@ endif() if(NOT YUZU_TZDB_PATH STREQUAL "") set(NX_TZDB_BASE_DIR "${YUZU_TZDB_PATH}") -elseif (MSVC AND NOT CXX_CLANG AND YUZU_ENABLE_LTO) +elseif (MSVC AND NOT CXX_CLANG AND ENABLE_LTO) # TODO(crueter): boot up the windows vm set(NX_TZDB_VERSION "250725") set(NX_TZDB_ARCHIVE "${CPM_SOURCE_CACHE}/nx_tzdb/${NX_TZDB_VERSION}.zip") From 6b3f8e1b62f17650ed60a83dd30bedbe86268169 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 10 Feb 2026 22:17:24 +0100 Subject: [PATCH 033/170] [core/internal_network] cleanup network interface code a bit (#2905) Signed-off-by: lizzie Co-authored-by: Caio Oliveira Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2905 Reviewed-by: Maufeat Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- src/core/CMakeLists.txt | 10 +- .../internal_network/network_interface.cpp | 280 +++++++++--------- src/core/internal_network/wifi_scanner.cpp | 111 ++++--- .../internal_network/wifi_scanner_dummy.cpp | 11 + 4 files changed, 205 insertions(+), 207 deletions(-) create mode 100644 src/core/internal_network/wifi_scanner_dummy.cpp diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 14eb331d24..8bcb66ac35 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1131,7 +1131,6 @@ add_library(core STATIC internal_network/socket_proxy.cpp internal_network/socket_proxy.h internal_network/sockets.h - internal_network/wifi_scanner.cpp internal_network/wifi_scanner.h launch_timestamp_cache.cpp launch_timestamp_cache.h @@ -1170,9 +1169,12 @@ add_library(core STATIC tools/renderdoc.h) if (ENABLE_WIFI_SCAN) - # find_package(libiw REQUIRED) - target_compile_definitions(core PRIVATE ENABLE_WIFI_SCAN) - target_link_libraries(core PRIVATE iw) + target_sources(core PRIVATE internal_network/wifi_scanner.cpp) + if (PLATFORM_LINUX) + target_link_libraries(core PRIVATE iw) + endif() +else() + target_sources(core PRIVATE internal_network/wifi_scanner_dummy.cpp) endif() if (WIN32) diff --git a/src/core/internal_network/network_interface.cpp b/src/core/internal_network/network_interface.cpp index 8e8f099be8..48be1e2dc4 100644 --- a/src/core/internal_network/network_interface.cpp +++ b/src/core/internal_network/network_interface.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -9,6 +9,32 @@ #include #include +#ifdef _WIN32 +#include +#include +#include +#elif defined(__linux__) || defined(__ANDROID__) +#include +#include +#include +#elif defined(__FreeBSD__) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + #include "common/common_types.h" #include "common/logging/log.h" #include "common/settings.h" @@ -16,14 +42,6 @@ #include "core/internal_network/emu_net_state.h" #include "core/internal_network/network_interface.h" -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif - namespace Network { #ifdef _WIN32 @@ -71,22 +89,12 @@ std::vector GetAvailableNetworkInterfaces() { gw = reinterpret_cast(a->FirstGatewayAddress->Address.lpSockaddr) ->sin_addr; - HostAdapterKind kind = HostAdapterKind::Ethernet; - switch (a->IfType) { - case IF_TYPE_IEEE80211: // 802.11 Wi-Fi - kind = HostAdapterKind::Wifi; - break; - default: - kind = HostAdapterKind::Ethernet; - break; - } - result.emplace_back(Network::NetworkInterface{ .name = Common::UTF16ToUTF8(std::wstring{a->FriendlyName}), .ip_address = ip, .subnet_mask = mask, .gateway = gw, - .kind = kind + .kind = (a->IfType == IF_TYPE_IEEE80211 ? HostAdapterKind::Wifi : HostAdapterKind::Ethernet) }); } @@ -96,158 +104,146 @@ std::vector GetAvailableNetworkInterfaces() { #else std::vector GetAvailableNetworkInterfaces() { +#if defined(__ANDROID__) || defined(__linux__) struct ifaddrs* ifaddr = nullptr; - if (getifaddrs(&ifaddr) != 0) { - LOG_ERROR(Network, "Failed to get network interfaces with getifaddrs: {}", - std::strerror(errno)); + LOG_ERROR(Network, "getifaddrs: {}", std::strerror(errno)); return {}; } - std::vector result; - - for (auto ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) { - if (ifa->ifa_addr == nullptr || ifa->ifa_netmask == nullptr) { - continue; - } - - if (ifa->ifa_addr->sa_family != AF_INET) { - continue; - } - - if ((ifa->ifa_flags & IFF_UP) == 0 || (ifa->ifa_flags & IFF_LOOPBACK) != 0) { - continue; - } - -#ifdef ANDROID - // On Android, we can't reliably get gateway info from /proc/net/route - // Just use 0 as the gateway address - result.emplace_back(Network::NetworkInterface{ - .name{ifa->ifa_name}, - .ip_address{std::bit_cast(*ifa->ifa_addr).sin_addr}, - .subnet_mask{std::bit_cast(*ifa->ifa_netmask).sin_addr}, - .gateway{in_addr{.s_addr = 0}} - }); + // TODO: This is still horrible, it was worse before (somehow) + struct RoutingEntry { + std::string iface_name; + u32 dest; + u32 gateway; + u32 flags; + }; + std::vector routes{}; +#ifdef __ANDROID__ + // Even through Linux based, we can't reliably obtain routing information from there :( #else - u32 gateway{}; - - std::ifstream file{"/proc/net/route"}; - if (!file.is_open()) { - LOG_ERROR(Network, "Failed to open \"/proc/net/route\""); - - // Solaris defines s_addr as a macro, can't use special C++ shenanigans here - in_addr gateway_0; - gateway_0.s_addr = gateway; - result.emplace_back(Network::NetworkInterface{ - .name = ifa->ifa_name, - .ip_address = std::bit_cast(*ifa->ifa_addr).sin_addr, - .subnet_mask = std::bit_cast(*ifa->ifa_netmask).sin_addr, - .gateway = gateway_0 - }); - continue; - } - - // ignore header - file.ignore((std::numeric_limits::max)(), '\n'); - - bool gateway_found = false; - + if (std::ifstream file("/proc/net/route"); file.is_open()) { + file.ignore((std::numeric_limits::max)(), '\n'); //ignore header for (std::string line; std::getline(file, line);) { std::istringstream iss{line}; - - std::string iface_name; - iss >> iface_name; - if (iface_name != ifa->ifa_name) { - continue; - } - - iss >> std::hex; - - u32 dest{}; - iss >> dest; - if (dest != 0) { - // not the default route - continue; - } - - iss >> gateway; - - u16 flags{}; - iss >> flags; - - // flag RTF_GATEWAY (defined in ) - if ((flags & 0x2) == 0) { - continue; - } - - gateway_found = true; - break; + RoutingEntry info{}; + iss >> info.iface_name >> std::hex + >> info.dest >> info.gateway >> info.flags; + routes.emplace_back(info); } - - if (!gateway_found) { - gateway = 0; - } - - in_addr gateway_0; - gateway_0.s_addr = gateway; - result.emplace_back(Network::NetworkInterface{ + } else { + LOG_WARNING(Network, "\"/proc/net/route\" not found - using gateway 0"); + } +#endif + std::vector ifaces; + for (auto ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == nullptr || ifa->ifa_netmask == nullptr /* Have a netmask and address */ + || ifa->ifa_addr->sa_family != AF_INET /* Must be of kind AF_INET */ + || (ifa->ifa_flags & IFF_UP) == 0 || (ifa->ifa_flags & IFF_LOOPBACK) != 0) /* Not loopback */ + continue; + // Just use 0 as the gateway address if not found OR routes are empty :) + auto const it = std::ranges::find_if(routes, [&ifa](auto const& e) { + return e.iface_name == ifa->ifa_name + && e.dest == 0 // not the default route + && (e.flags & 0x02) != 0; // flag RTF_GATEWAY (defined in ) + }); + in_addr gw; // Solaris defines s_addr as a macro, can't use special C++ shenanigans here + gw.s_addr = it != routes.end() ? it->gateway : 0; + ifaces.emplace_back(Network::NetworkInterface{ .name = ifa->ifa_name, .ip_address = std::bit_cast(*ifa->ifa_addr).sin_addr, .subnet_mask = std::bit_cast(*ifa->ifa_netmask).sin_addr, - .gateway = gateway_0 + .gateway = gw }); -#endif // ANDROID + } + freeifaddrs(ifaddr); + return ifaces; +#elif defined(__FreeBSD__) + std::vector ifaces; + int fd = ::socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC); + if (fd < 0) { + LOG_ERROR(Network, "socket: {}", std::strerror(errno)); + return {}; } - freeifaddrs(ifaddr); - return result; + size_t bufsz = 0; + int mib[6] = { + CTL_NET, PF_ROUTE, 0, + AF_UNSPEC, NET_RT_IFLIST, 0 + }; + if (::sysctl(mib, sizeof(mib) / sizeof(mib[0]), nullptr, &bufsz, nullptr, 0) < 0) { + LOG_ERROR(Network, "sysctl.1: {}", std::strerror(errno)); + ::close(fd); + return {}; + } + std::vector buf(bufsz); + if (::sysctl(mib, sizeof(mib) / sizeof(mib[0]), buf.data(), &bufsz, nullptr, 0) < 0) { + LOG_ERROR(Network, "sysctl.2: {}", std::strerror(errno)); + ::close(fd); + return {}; + } + + struct rt_msghdr const *rtm = NULL; + for (char *next = buf.data(); next < buf.data() + bufsz; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr const *)next; + if (rtm->rtm_type == RTM_IFINFO) { + struct if_msghdr const* ifm = (struct if_msghdr const *)rtm; + size_t msglen = rtm->rtm_msglen - sizeof(*ifm); + char const* p = (char const*)(ifm + 1); + + Network::NetworkInterface iface{}; + for (size_t i = 0; i < RTAX_MAX; i++) + if ((ifm->ifm_addrs & (1 << i)) != 0) { + struct sockaddr const* sa = reinterpret_cast(p); + if (msglen == 0 || msglen < SA_SIZE(sa)) + break; + if (i == RTA_NETMASK && sa->sa_family == AF_LINK) { + size_t namelen = 0; + struct sockaddr_dl const* sdl = reinterpret_cast(sa); + ::link_ntoa_r(sdl, nullptr, &namelen); + iface.name = std::string(namelen, ' '); + ::link_ntoa_r(sdl, iface.name.data(), &namelen); + std::memcpy(&iface.ip_address, sa, sizeof(struct sockaddr_in)); + } + msglen -= SA_SIZE(sa); + p += SA_SIZE(sa); + } + ifaces.push_back(iface); + } + } + ::close(fd); + return ifaces; +#else + return {}; +#endif } #endif // _WIN32 std::optional GetSelectedNetworkInterface() { - - const auto& selected_network_interface = Settings::values.network_interface.GetValue(); - const auto network_interfaces = Network::GetAvailableNetworkInterfaces(); - if (network_interfaces.empty()) { - LOG_ERROR(Network, "GetAvailableNetworkInterfaces returned no interfaces"); - return std::nullopt; - } - - #ifdef __ANDROID__ - if (selected_network_interface.empty()) { - return network_interfaces[0]; - } - #endif - - const auto res = - std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& iface) { - return iface.name == selected_network_interface; - }); - - if (res == network_interfaces.end()) { + auto const& sel_if = Settings::values.network_interface.GetValue(); + if (auto const ifaces = Network::GetAvailableNetworkInterfaces(); ifaces.size() > 0) { + if (sel_if.empty()) + return ifaces[0]; + if (auto const res = std::ranges::find_if(ifaces, [&sel_if](const auto& iface) { + return iface.name == sel_if; + }); res != ifaces.end()) + return *res; // Only print the error once to avoid log spam static bool print_error = true; if (print_error) { - LOG_ERROR(Network, "Couldn't find selected interface \"{}\"", - selected_network_interface); + LOG_WARNING(Network, "Couldn't find interface \"{}\"", sel_if); print_error = false; } - return std::nullopt; } - - return *res; + LOG_WARNING(Network, "No interfaces"); + return std::nullopt; } void SelectFirstNetworkInterface() { - const auto network_interfaces = Network::GetAvailableNetworkInterfaces(); - - if (network_interfaces.empty()) { - return; - } - - Settings::values.network_interface.SetValue(network_interfaces[0].name); + if (auto const ifaces = Network::GetAvailableNetworkInterfaces(); ifaces.size() > 0) + Settings::values.network_interface.SetValue(ifaces[0].name); } } // namespace Network diff --git a/src/core/internal_network/wifi_scanner.cpp b/src/core/internal_network/wifi_scanner.cpp index 127221099f..1b97f69177 100644 --- a/src/core/internal_network/wifi_scanner.cpp +++ b/src/core/internal_network/wifi_scanner.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -6,11 +6,6 @@ #include #include -#include "common/logging/log.h" -#include "core/internal_network/wifi_scanner.h" - -using namespace std::chrono_literals; - #ifdef _WIN32 #define NOMINMAX #include @@ -18,16 +13,30 @@ using namespace std::chrono_literals; #ifdef _MSC_VER #pragma comment(lib, "wlanapi.lib") #endif +#elif defined(__linux__) && !defined(__ANDROID__) +#include +#elif defined(__FreeBSD__) +#include +#include +#include +#include +#include +#include #endif +#include "common/logging/log.h" +#include "core/internal_network/network_interface.h" +#include "core/internal_network/wifi_scanner.h" + +using namespace std::chrono_literals; + namespace Network { -#ifdef ENABLE_WIFI_SCAN #ifdef _WIN32 static u8 QualityToPercent(DWORD q) { - return static_cast(q); + return u8(q); } -static std::vector ScanWifiWin(std::chrono::milliseconds deadline) { +std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { std::vector out; HANDLE hClient{}; @@ -85,38 +94,16 @@ static std::vector ScanWifiWin(std::chrono::milliseconds dead WlanCloseHandle(hClient, nullptr); return out; } -#endif /* _WIN32 */ - -#if defined(__linux__) && !defined(_WIN32) && !defined(ANDROID) -#include - +#elif defined(__linux__) && !defined(__ANDROID__) static u8 QualityToPercent(const iwrange& r, const wireless_scan* ws) { const iw_quality qual = ws->stats.qual; const int lvl = qual.level; const int max = r.max_qual.level ? r.max_qual.level : 100; - return static_cast(std::clamp(100 * lvl / max, 0, 100)); -} - -static int wifi_callback(int skfd, char* ifname, char* args[], int count) -{ - iwrange range; - - int res = iw_get_range_info(skfd, ifname, &range); - - LOG_INFO(Network, "ifname {} returned {} on iw_get_range_info", ifname, res); - - if (res >= 0) { - strncpy(args[0], ifname, IFNAMSIZ - 1); - args[0][IFNAMSIZ - 1] = 0; - - return 1; - } - - return 0; + return u8(std::clamp(100 * lvl / max, 0, 100)); } // TODO(crueter, Maufeat): Check if driver supports wireless extensions, fallback to nl80211 if not -static std::vector ScanWifiLinux(std::chrono::milliseconds deadline) { +std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { std::vector out; int sock = iw_sockets_open(); if (sock < 0) { @@ -127,7 +114,17 @@ static std::vector ScanWifiLinux(std::chrono::milliseconds de char ifname[IFNAMSIZ] = {0}; char *args[1] = {ifname}; - iw_enum_devices(sock, &wifi_callback, args, 0); + iw_enum_devices(sock, [](int skfd, char* ifname, char* args[], int count) -> int { + iwrange range; + int res = iw_get_range_info(skfd, ifname, &range); + LOG_INFO(Network, "ifname {} returned {} on iw_get_range_info", ifname, res); + if (res >= 0) { + strncpy(args[0], ifname, IFNAMSIZ - 1); + args[0][IFNAMSIZ - 1] = 0; + return 1; + } + return 0; + }, args, 0); if (strlen(ifname) == 0) { LOG_WARNING(Network, "No wireless interface found"); @@ -153,20 +150,19 @@ static std::vector ScanWifiLinux(std::chrono::milliseconds de out.clear(); for (auto* ws = head.result; ws; ws = ws->next) { - if (!ws->b.has_essid) - continue; + if (ws->b.has_essid) { + Network::ScanData sd{}; + sd.ssid_len = static_cast(std::min(ws->b.essid_len, 0x20)); + std::memcpy(sd.ssid, ws->b.essid, sd.ssid_len); + sd.quality = QualityToPercent(range, ws); + sd.flags |= 1; + if (ws->b.has_key) + sd.flags |= 2; - Network::ScanData sd{}; - sd.ssid_len = static_cast(std::min(ws->b.essid_len, 0x20)); - std::memcpy(sd.ssid, ws->b.essid, sd.ssid_len); - sd.quality = QualityToPercent(range, ws); - sd.flags |= 1; - if (ws->b.has_key) - sd.flags |= 2; - - out.emplace_back(sd); - char tmp[0x22]{}; - std::memcpy(tmp, sd.ssid, sd.ssid_len); + out.emplace_back(sd); + char tmp[0x22]{}; + std::memcpy(tmp, sd.ssid, sd.ssid_len); + } } have = !out.empty(); } @@ -174,21 +170,14 @@ static std::vector ScanWifiLinux(std::chrono::milliseconds de iw_sockets_close(sock); return out; } -#endif /* linux */ -#endif - +#elif defined(__FreeBSD__) std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { -#ifdef ENABLE_WIFI_SCAN -#if defined(_WIN32) - return ScanWifiWin(deadline); -#elif defined(__linux__) && !defined(ANDROID) - return ScanWifiLinux(deadline); -#else - return {}; // unsupported host, pretend no results -#endif -#else return {}; // disabled, pretend no results -#endif } +#else +std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { + return {}; // disabled, pretend no results +} +#endif } // namespace Network diff --git a/src/core/internal_network/wifi_scanner_dummy.cpp b/src/core/internal_network/wifi_scanner_dummy.cpp new file mode 100644 index 0000000000..ebc66b2e41 --- /dev/null +++ b/src/core/internal_network/wifi_scanner_dummy.cpp @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include "core/internal_network/wifi_scanner.h" + +namespace Network { +std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { + return {}; // disabled, pretend no results +} +} // namespace Network From 28a78d76fed94255233284abb3df36b3fd41467d Mon Sep 17 00:00:00 2001 From: Maufeat Date: Wed, 11 Feb 2026 01:13:09 +0100 Subject: [PATCH 034/170] [audio] add splitter_size (#3477) Thanks to: https://git.ryujinx.app/ryubing/ryujinx/-/merge_requests/257 Credits to Coxxs and his friend. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3477 Reviewed-by: MaranBr Reviewed-by: DraVee Reviewed-by: CamilleLaVey Co-authored-by: Maufeat Co-committed-by: Maufeat --- src/audio_core/renderer/behavior/info_updater.cpp | 7 +++---- src/audio_core/renderer/behavior/info_updater.h | 5 ++++- src/audio_core/renderer/splitter/splitter_context.cpp | 8 ++------ src/audio_core/renderer/splitter/splitter_context.h | 5 ++--- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp index 39bbc91ded..1da737e5fb 100644 --- a/src/audio_core/renderer/behavior/info_updater.cpp +++ b/src/audio_core/renderer/behavior/info_updater.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -616,12 +616,11 @@ Result InfoUpdater::UpdateErrorInfo(const BehaviorInfo& behaviour_) { } Result InfoUpdater::UpdateSplitterInfo(SplitterContext& splitter_context) { - u32 consumed_size{0}; - if (!splitter_context.Update(input, consumed_size)) { + if (!splitter_context.Update(input)) { return Service::Audio::ResultInvalidUpdateInfo; } - input += consumed_size; + input += in_header->splitter_size; return ResultSuccess; } diff --git a/src/audio_core/renderer/behavior/info_updater.h b/src/audio_core/renderer/behavior/info_updater.h index 4f27a817e2..6898b73825 100644 --- a/src/audio_core/renderer/behavior/info_updater.h +++ b/src/audio_core/renderer/behavior/info_updater.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -35,7 +38,7 @@ class InfoUpdater { /* 0x18 */ u32 mix_size{}; /* 0x1C */ u32 sinks_size{}; /* 0x20 */ u32 performance_buffer_size{}; - /* 0x24 */ char unk24[4]; + /* 0x24 */ u32 splitter_size{}; /* 0x28 */ u32 render_info_size{}; /* 0x2C */ char unk2C[0x10]; /* 0x3C */ u32 size{sizeof(UpdateDataHeader)}; diff --git a/src/audio_core/renderer/splitter/splitter_context.cpp b/src/audio_core/renderer/splitter/splitter_context.cpp index 1ba5daebe9..d74d6ea8a7 100644 --- a/src/audio_core/renderer/splitter/splitter_context.cpp +++ b/src/audio_core/renderer/splitter/splitter_context.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -93,16 +93,14 @@ bool SplitterContext::Initialize(const BehaviorInfo& behavior, return true; } -bool SplitterContext::Update(const u8* input, u32& consumed_size) { +bool SplitterContext::Update(const u8* input) { auto in_params{reinterpret_cast(input)}; if (destinations_count == 0 || info_count == 0) { - consumed_size = 0; return true; } if (in_params->magic != GetSplitterInParamHeaderMagic()) { - consumed_size = 0; return false; } @@ -113,8 +111,6 @@ bool SplitterContext::Update(const u8* input, u32& consumed_size) { u32 offset{sizeof(InParameterHeader)}; offset = UpdateInfo(input, offset, in_params->info_count); offset = UpdateData(input, offset, in_params->destination_count); - - consumed_size = Common::AlignUp(offset, 0x10); return true; } diff --git a/src/audio_core/renderer/splitter/splitter_context.h b/src/audio_core/renderer/splitter/splitter_context.h index c71ce3d7c4..4f8d6870e7 100644 --- a/src/audio_core/renderer/splitter/splitter_context.h +++ b/src/audio_core/renderer/splitter/splitter_context.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -104,9 +104,8 @@ public: * * @param input - Input buffer with the new info, * expected to point to a InParameterHeader. - * @param consumed_size - Output with the number of bytes consumed from input. */ - bool Update(const u8* input, u32& consumed_size); + bool Update(const u8* input); /** * Update the splitters. From 19494bc7ac943478e099f1b28877d33ece685d3f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 11 Feb 2026 03:00:15 +0100 Subject: [PATCH 035/170] [network, qt] use jthread and use std::vector for packet list instead of std::list (#254) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/254 Reviewed-by: DraVee Reviewed-by: Maufeat Co-authored-by: lizzie Co-committed-by: lizzie --- src/network/announce_multiplayer_session.cpp | 105 ++++---- src/network/announce_multiplayer_session.h | 13 +- src/network/room.cpp | 101 ++++--- src/network/room_member.cpp | 252 +++++++++--------- .../calibration_configuration_job.cpp | 14 +- src/yuzu/applets/qt_software_keyboard.cpp | 72 ++--- src/yuzu/applets/qt_software_keyboard.h | 11 +- src/yuzu/applets/qt_web_browser.cpp | 71 ++--- src/yuzu/applets/qt_web_browser.h | 20 +- src/yuzu/util/overlay_dialog.cpp | 38 +-- src/yuzu/util/overlay_dialog.h | 11 +- 11 files changed, 305 insertions(+), 403 deletions(-) diff --git a/src/network/announce_multiplayer_session.cpp b/src/network/announce_multiplayer_session.cpp index d2a47de73d..b01c2ba601 100644 --- a/src/network/announce_multiplayer_session.cpp +++ b/src/network/announce_multiplayer_session.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project @@ -19,9 +19,6 @@ namespace Core { -// Time between room is announced to web_service -static constexpr std::chrono::seconds announce_time_interval(15); - AnnounceMultiplayerSession::AnnounceMultiplayerSession() { #ifdef ENABLE_WEB_SERVICE backend = std::make_unique(Settings::values.web_api_url.GetValue(), @@ -53,18 +50,58 @@ WebService::WebResult AnnounceMultiplayerSession::Register() { } void AnnounceMultiplayerSession::Start() { - if (announce_multiplayer_thread) { + if (announce_multiplayer_thread.has_value()) { Stop(); } - shutdown_event.Reset(); - announce_multiplayer_thread = - std::make_unique(&AnnounceMultiplayerSession::AnnounceMultiplayerLoop, this); + announce_multiplayer_thread.emplace([&](std::stop_token stoken) { + // Invokes all current bound error callbacks. + const auto ErrorCallback = [this](WebService::WebResult result) { + std::lock_guard lock(callback_mutex); + for (auto callback : error_callbacks) + (*callback)(result); + }; + + if (!registered) { + WebService::WebResult result = Register(); + if (result.result_code != WebService::WebResult::Code::Success) { + ErrorCallback(result); + return; + } + } + + // Time between room is announced to web_service + std::chrono::seconds const announce_timeslice(15); + auto update_time = std::chrono::steady_clock::now(); + std::future future; + while (!shutdown_event.WaitUntil(update_time)) { + update_time = std::chrono::steady_clock::now() + announce_timeslice; + auto room = Network::GetRoom().lock(); + if (!room) { + break; + } + if (room->GetState() != Network::Room::State::Open) { + break; + } + UpdateBackendData(room); + WebService::WebResult result = backend->Update(); + if (result.result_code != WebService::WebResult::Code::Success) { + ErrorCallback(result); + } + if (result.result_string == "404") { + registered = false; + // Needs to register the room again + WebService::WebResult register_result = Register(); + if (register_result.result_code != WebService::WebResult::Code::Success) { + ErrorCallback(register_result); + } + } + } + }); } void AnnounceMultiplayerSession::Stop() { - if (announce_multiplayer_thread) { + if (announce_multiplayer_thread.has_value()) { shutdown_event.Set(); - announce_multiplayer_thread->join(); announce_multiplayer_thread.reset(); backend->Delete(); registered = false; @@ -101,58 +138,10 @@ void AnnounceMultiplayerSession::UpdateBackendData(std::shared_ptr future; - while (!shutdown_event.WaitUntil(update_time)) { - update_time += announce_time_interval; - auto room = Network::GetRoom().lock(); - if (!room) { - break; - } - if (room->GetState() != Network::Room::State::Open) { - break; - } - UpdateBackendData(room); - WebService::WebResult result = backend->Update(); - if (result.result_code != WebService::WebResult::Code::Success) { - ErrorCallback(result); - } - if (result.result_string == "404") { - registered = false; - // Needs to register the room again - WebService::WebResult register_result = Register(); - if (register_result.result_code != WebService::WebResult::Code::Success) { - ErrorCallback(register_result); - } - } - } -} - AnnounceMultiplayerRoom::RoomList AnnounceMultiplayerSession::GetRoomList() { return backend->GetRoomList(); } -bool AnnounceMultiplayerSession::IsRunning() const { - return announce_multiplayer_thread != nullptr; -} - void AnnounceMultiplayerSession::UpdateCredentials() { ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); #ifdef ENABLE_WEB_SERVICE diff --git a/src/network/announce_multiplayer_session.h b/src/network/announce_multiplayer_session.h index 4e5cd33e1f..8fff450367 100644 --- a/src/network/announce_multiplayer_session.h +++ b/src/network/announce_multiplayer_session.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -72,7 +72,9 @@ public: /** * Whether the announce session is still running */ - bool IsRunning() const; + [[nodiscard]] bool IsRunning() const { + return announce_multiplayer_thread.has_value(); + } /** * Recreates the backend, updating the credentials. @@ -82,16 +84,13 @@ public: private: void UpdateBackendData(std::shared_ptr room); - void AnnounceMultiplayerLoop(); Common::Event shutdown_event; - std::mutex callback_mutex; std::set error_callbacks; - std::unique_ptr announce_multiplayer_thread; - + std::optional announce_multiplayer_thread; /// Backend interface that logs fields std::unique_ptr backend; - + std::mutex callback_mutex; std::atomic_bool registered = false; ///< Whether the room has been registered }; diff --git a/src/network/room.cpp b/src/network/room.cpp index ca3946b521..cf33763da2 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -1,6 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,6 +12,7 @@ #include #include #include +#include "common/polyfill_thread.h" #include "common/logging/log.h" #include "enet/enet.h" #include "network/packet.h" @@ -54,13 +54,11 @@ public: RoomImpl() : random_gen(std::random_device()()) {} /// Thread that receives and dispatches network packets - std::unique_ptr room_thread; + std::optional room_thread; /// Verification backend of the room std::unique_ptr verify_backend; - /// Thread function that will receive and dispatch messages until the room is destroyed. - void ServerLoop(); void StartLoop(); /** @@ -240,59 +238,57 @@ public: }; // RoomImpl -void Room::RoomImpl::ServerLoop() { - while (state != State::Closed) { - ENetEvent event; - if (enet_host_service(server, &event, 5) > 0) { - switch (event.type) { - case ENET_EVENT_TYPE_RECEIVE: - switch (event.packet->data[0]) { - case IdJoinRequest: - HandleJoinRequest(&event); +void Room::RoomImpl::StartLoop() { + room_thread.emplace([&](std::stop_token stoken) { + while (state != State::Closed) { + ENetEvent event; + if (enet_host_service(server, &event, 5) > 0) { + switch (event.type) { + case ENET_EVENT_TYPE_RECEIVE: + switch (event.packet->data[0]) { + case IdJoinRequest: + HandleJoinRequest(&event); + break; + case IdSetGameInfo: + HandleGameInfoPacket(&event); + break; + case IdProxyPacket: + HandleProxyPacket(&event); + break; + case IdLdnPacket: + HandleLdnPacket(&event); + break; + case IdChatMessage: + HandleChatPacket(&event); + break; + // Moderation + case IdModKick: + HandleModKickPacket(&event); + break; + case IdModBan: + HandleModBanPacket(&event); + break; + case IdModUnban: + HandleModUnbanPacket(&event); + break; + case IdModGetBanList: + HandleModGetBanListPacket(&event); + break; + } + enet_packet_destroy(event.packet); break; - case IdSetGameInfo: - HandleGameInfoPacket(&event); + case ENET_EVENT_TYPE_DISCONNECT: + HandleClientDisconnection(event.peer); break; - case IdProxyPacket: - HandleProxyPacket(&event); - break; - case IdLdnPacket: - HandleLdnPacket(&event); - break; - case IdChatMessage: - HandleChatPacket(&event); - break; - // Moderation - case IdModKick: - HandleModKickPacket(&event); - break; - case IdModBan: - HandleModBanPacket(&event); - break; - case IdModUnban: - HandleModUnbanPacket(&event); - break; - case IdModGetBanList: - HandleModGetBanListPacket(&event); + case ENET_EVENT_TYPE_NONE: + case ENET_EVENT_TYPE_CONNECT: break; } - enet_packet_destroy(event.packet); - break; - case ENET_EVENT_TYPE_DISCONNECT: - HandleClientDisconnection(event.peer); - break; - case ENET_EVENT_TYPE_NONE: - case ENET_EVENT_TYPE_CONNECT: - break; } } - } - // Close the connection to all members: - SendCloseMessage(); -} - -void Room::RoomImpl::StartLoop() { - room_thread = std::make_unique(&Room::RoomImpl::ServerLoop, this); + // Close the connection to all members: + SendCloseMessage(); + }); } void Room::RoomImpl::HandleJoinRequest(const ENetEvent* event) { @@ -1133,7 +1129,6 @@ void Room::SetVerifyUID(const std::string& uid) { void Room::Destroy() { room_impl->state = State::Closed; - room_impl->room_thread->join(); room_impl->room_thread.reset(); if (room_impl->server) { diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp index a6845273c5..029e103db4 100644 --- a/src/network/room_member.cpp +++ b/src/network/room_member.cpp @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,6 +9,7 @@ #include #include #include "common/assert.h" +#include "common/polyfill_thread.h" #include "common/socket_types.h" #include "enet/enet.h" #include "network/packet.h" @@ -18,6 +21,21 @@ constexpr u32 ConnectionTimeoutMs = 5000; class RoomMember::RoomMemberImpl { public: + void SetState(const State new_state) noexcept { + if (state != new_state) { + state = new_state; + Invoke(state); + } + } + + void SetError(const Error new_error) noexcept { + Invoke(new_error); + } + + [[nodiscard]] bool IsConnected() const noexcept { + return state == State::Joining || state == State::Joined || state == State::Moderator; + } + ENetHost* client = nullptr; ///< ENet network interface. ENetPeer* server = nullptr; ///< The server peer the client is connected to @@ -30,9 +48,6 @@ public: GameInfo current_game_info; std::atomic state{State::Idle}; ///< Current state of the RoomMember. - void SetState(const State new_state); - void SetError(const Error new_error); - bool IsConnected() const; std::string nickname; ///< The nickname of this member. @@ -43,9 +58,9 @@ public: std::mutex network_mutex; ///< Mutex that controls access to the `client` variable. /// Thread that receives and dispatches network packets - std::unique_ptr loop_thread; + std::optional loop_thread; std::mutex send_list_mutex; ///< Mutex that controls access to the `send_list` variable. - std::list send_list; ///< A list that stores all packets to send the async + std::vector send_list; ///< A list that stores all packets to send the async template using CallbackSet = std::set>; @@ -68,8 +83,6 @@ public: }; Callbacks callbacks; ///< All CallbackSets to all events - void MemberLoop(); - void StartLoop(); /** @@ -146,134 +159,117 @@ public: }; // RoomMemberImpl -void RoomMember::RoomMemberImpl::SetState(const State new_state) { - if (state != new_state) { - state = new_state; - Invoke(state); - } -} - -void RoomMember::RoomMemberImpl::SetError(const Error new_error) { - Invoke(new_error); -} - -bool RoomMember::RoomMemberImpl::IsConnected() const { - return state == State::Joining || state == State::Joined || state == State::Moderator; -} - -void RoomMember::RoomMemberImpl::MemberLoop() { - // Receive packets while the connection is open - while (IsConnected()) { - std::lock_guard lock(network_mutex); - ENetEvent event; - if (enet_host_service(client, &event, 5) > 0) { - switch (event.type) { - case ENET_EVENT_TYPE_RECEIVE: - switch (event.packet->data[0]) { - case IdProxyPacket: - HandleProxyPackets(&event); +void RoomMember::RoomMemberImpl::StartLoop() { + loop_thread.emplace([&](std::stop_token stoken) { + // Receive packets while the connection is open + while (IsConnected()) { + std::lock_guard lock(network_mutex); + ENetEvent event; + if (enet_host_service(client, &event, 5) > 0) { + switch (event.type) { + case ENET_EVENT_TYPE_RECEIVE: + switch (event.packet->data[0]) { + case IdProxyPacket: + HandleProxyPackets(&event); + break; + case IdLdnPacket: + HandleLdnPackets(&event); + break; + case IdChatMessage: + HandleChatPacket(&event); + break; + case IdStatusMessage: + HandleStatusMessagePacket(&event); + break; + case IdRoomInformation: + HandleRoomInformationPacket(&event); + break; + case IdJoinSuccess: + case IdJoinSuccessAsMod: + // The join request was successful, we are now in the room. + // If we joined successfully, there must be at least one client in the room: us. + ASSERT_MSG(member_information.size() > 0, + "We have not yet received member information."); + HandleJoinPacket(&event); // Get the MAC Address for the client + if (event.packet->data[0] == IdJoinSuccessAsMod) { + SetState(State::Moderator); + } else { + SetState(State::Joined); + } + break; + case IdModBanListResponse: + HandleModBanListResponsePacket(&event); + break; + case IdRoomIsFull: + SetState(State::Idle); + SetError(Error::RoomIsFull); + break; + case IdNameCollision: + SetState(State::Idle); + SetError(Error::NameCollision); + break; + case IdIpCollision: + SetState(State::Idle); + SetError(Error::IpCollision); + break; + case IdVersionMismatch: + SetState(State::Idle); + SetError(Error::WrongVersion); + break; + case IdWrongPassword: + SetState(State::Idle); + SetError(Error::WrongPassword); + break; + case IdCloseRoom: + SetState(State::Idle); + SetError(Error::LostConnection); + break; + case IdHostKicked: + SetState(State::Idle); + SetError(Error::HostKicked); + break; + case IdHostBanned: + SetState(State::Idle); + SetError(Error::HostBanned); + break; + case IdModPermissionDenied: + SetError(Error::PermissionDenied); + break; + case IdModNoSuchUser: + SetError(Error::NoSuchUser); + break; + } + enet_packet_destroy(event.packet); break; - case IdLdnPacket: - HandleLdnPackets(&event); - break; - case IdChatMessage: - HandleChatPacket(&event); - break; - case IdStatusMessage: - HandleStatusMessagePacket(&event); - break; - case IdRoomInformation: - HandleRoomInformationPacket(&event); - break; - case IdJoinSuccess: - case IdJoinSuccessAsMod: - // The join request was successful, we are now in the room. - // If we joined successfully, there must be at least one client in the room: us. - ASSERT_MSG(member_information.size() > 0, - "We have not yet received member information."); - HandleJoinPacket(&event); // Get the MAC Address for the client - if (event.packet->data[0] == IdJoinSuccessAsMod) { - SetState(State::Moderator); - } else { - SetState(State::Joined); + case ENET_EVENT_TYPE_DISCONNECT: + if (state == State::Joined || state == State::Moderator) { + SetState(State::Idle); + SetError(Error::LostConnection); } break; - case IdModBanListResponse: - HandleModBanListResponsePacket(&event); + case ENET_EVENT_TYPE_NONE: break; - case IdRoomIsFull: - SetState(State::Idle); - SetError(Error::RoomIsFull); - break; - case IdNameCollision: - SetState(State::Idle); - SetError(Error::NameCollision); - break; - case IdIpCollision: - SetState(State::Idle); - SetError(Error::IpCollision); - break; - case IdVersionMismatch: - SetState(State::Idle); - SetError(Error::WrongVersion); - break; - case IdWrongPassword: - SetState(State::Idle); - SetError(Error::WrongPassword); - break; - case IdCloseRoom: - SetState(State::Idle); - SetError(Error::LostConnection); - break; - case IdHostKicked: - SetState(State::Idle); - SetError(Error::HostKicked); - break; - case IdHostBanned: - SetState(State::Idle); - SetError(Error::HostBanned); - break; - case IdModPermissionDenied: - SetError(Error::PermissionDenied); - break; - case IdModNoSuchUser: - SetError(Error::NoSuchUser); + case ENET_EVENT_TYPE_CONNECT: + // The ENET_EVENT_TYPE_CONNECT event can not possibly happen here because we're + // already connected + ASSERT_MSG(false, "Received unexpected connect event while already connected"); break; } - enet_packet_destroy(event.packet); - break; - case ENET_EVENT_TYPE_DISCONNECT: - if (state == State::Joined || state == State::Moderator) { - SetState(State::Idle); - SetError(Error::LostConnection); - } - break; - case ENET_EVENT_TYPE_NONE: - break; - case ENET_EVENT_TYPE_CONNECT: - // The ENET_EVENT_TYPE_CONNECT event can not possibly happen here because we're - // already connected - ASSERT_MSG(false, "Received unexpected connect event while already connected"); - break; } + std::vector packets; + { + std::lock_guard send_lock(send_list_mutex); + packets.swap(send_list); + } + for (auto const& packet : packets) { + ENetPacket* enetPacket = enet_packet_create(packet.GetData(), packet.GetDataSize(), + ENET_PACKET_FLAG_RELIABLE); + enet_peer_send(server, 0, enetPacket); + } + enet_host_flush(client); } - std::list packets; - { - std::lock_guard send_lock(send_list_mutex); - packets.swap(send_list); - } - for (const auto& packet : packets) { - ENetPacket* enetPacket = enet_packet_create(packet.GetData(), packet.GetDataSize(), - ENET_PACKET_FLAG_RELIABLE); - enet_peer_send(server, 0, enetPacket); - } - enet_host_flush(client); - } - Disconnect(); -}; - -void RoomMember::RoomMemberImpl::StartLoop() { - loop_thread = std::make_unique(&RoomMember::RoomMemberImpl::MemberLoop, this); + Disconnect(); + }); } void RoomMember::RoomMemberImpl::Send(Packet&& packet) { @@ -747,9 +743,7 @@ void RoomMember::Unbind(CallbackHandle handle) { void RoomMember::Leave() { room_member_impl->SetState(State::Idle); - room_member_impl->loop_thread->join(); room_member_impl->loop_thread.reset(); - enet_host_destroy(room_member_impl->client); room_member_impl->client = nullptr; } diff --git a/src/tests/input_common/calibration_configuration_job.cpp b/src/tests/input_common/calibration_configuration_job.cpp index d67d1cbbb4..6ded0dfc86 100644 --- a/src/tests/input_common/calibration_configuration_job.cpp +++ b/src/tests/input_common/calibration_configuration_job.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -22,13 +22,9 @@ public: : socket(io_context, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 0)) {} ~FakeCemuhookServer() { - is_running = false; boost::system::error_code error_code; socket.shutdown(boost::asio::socket_base::shutdown_both, error_code); socket.close(); - if (handler.joinable()) { - handler.join(); - } } u16 GetPort() { @@ -45,10 +41,9 @@ public: sizeof(InputCommon::CemuhookUDP::Message); REQUIRE(touch_movement_path.size() > 0); - is_running = true; - handler = std::thread([touch_movement_path, this]() { + handler = std::jthread([touch_movement_path, this](std::stop_token stoken) { auto current_touch_position = touch_movement_path.begin(); - while (is_running) { + while (!stoken.stop_requested()) { boost::asio::ip::udp::endpoint sender_endpoint; boost::system::error_code error_code; auto received_size = socket.receive_from(boost::asio::buffer(receive_buffer), @@ -91,8 +86,7 @@ private: boost::asio::ip::udp::socket socket; std::array send_buffer; std::array receive_buffer; - bool is_running = false; - std::thread handler; + std::jthread handler; }; TEST_CASE("CalibrationConfigurationJob completed", "[input_common]") { diff --git a/src/yuzu/applets/qt_software_keyboard.cpp b/src/yuzu/applets/qt_software_keyboard.cpp index 47b6629077..0b894bf51a 100644 --- a/src/yuzu/applets/qt_software_keyboard.cpp +++ b/src/yuzu/applets/qt_software_keyboard.cpp @@ -1,6 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -1495,53 +1494,36 @@ void QtSoftwareKeyboardDialog::MoveTextCursorDirection(Direction direction) { } void QtSoftwareKeyboardDialog::StartInputThread() { - if (input_thread_running) { - return; - } - - input_thread_running = true; - - input_thread = std::thread(&QtSoftwareKeyboardDialog::InputThread, this); + input_thread = std::jthread([&](std::stop_token stoken) { + while (!stoken.stop_requested()) { + input_interpreter->PollInput(); + HandleButtonPressedOnce< + Core::HID::NpadButton::A, Core::HID::NpadButton::B, Core::HID::NpadButton::X, + Core::HID::NpadButton::Y, Core::HID::NpadButton::StickL, Core::HID::NpadButton::StickR, + Core::HID::NpadButton::L, Core::HID::NpadButton::R, Core::HID::NpadButton::Plus, + Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, + Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, + Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, + Core::HID::NpadButton::StickLDown, Core::HID::NpadButton::StickRLeft, + Core::HID::NpadButton::StickRUp, Core::HID::NpadButton::StickRRight, + Core::HID::NpadButton::StickRDown>(); + HandleButtonHold(); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + }); } void QtSoftwareKeyboardDialog::StopInputThread() { - input_thread_running = false; - - if (input_thread.joinable()) { - input_thread.join(); - } - - if (input_interpreter) { + input_thread.request_stop(); + if (input_interpreter) input_interpreter->ResetButtonStates(); - } -} - -void QtSoftwareKeyboardDialog::InputThread() { - while (input_thread_running) { - input_interpreter->PollInput(); - - HandleButtonPressedOnce< - Core::HID::NpadButton::A, Core::HID::NpadButton::B, Core::HID::NpadButton::X, - Core::HID::NpadButton::Y, Core::HID::NpadButton::StickL, Core::HID::NpadButton::StickR, - Core::HID::NpadButton::L, Core::HID::NpadButton::R, Core::HID::NpadButton::Plus, - Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, - Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, - Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, - Core::HID::NpadButton::StickLDown, Core::HID::NpadButton::StickRLeft, - Core::HID::NpadButton::StickRUp, Core::HID::NpadButton::StickRRight, - Core::HID::NpadButton::StickRDown>(); - - HandleButtonHold(); - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - } } QtSoftwareKeyboard::QtSoftwareKeyboard(MainWindow& main_window) { diff --git a/src/yuzu/applets/qt_software_keyboard.h b/src/yuzu/applets/qt_software_keyboard.h index 4c03df10fc..66359ff11a 100644 --- a/src/yuzu/applets/qt_software_keyboard.h +++ b/src/yuzu/applets/qt_software_keyboard.h @@ -1,6 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -185,9 +184,6 @@ private: void StartInputThread(); void StopInputThread(); - /// The thread where input is being polled and processed. - void InputThread(); - std::unique_ptr ui; Core::System& system; @@ -223,10 +219,7 @@ private: std::atomic caps_lock_enabled{false}; std::unique_ptr input_interpreter; - - std::thread input_thread; - - std::atomic input_thread_running{}; + std::jthread input_thread; }; class QtSoftwareKeyboard final : public QObject, public Core::Frontend::SoftwareKeyboardApplet { diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp index 3d9d851ab6..2141b9d0e7 100644 --- a/src/yuzu/applets/qt_web_browser.cpp +++ b/src/yuzu/applets/qt_web_browser.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -290,54 +290,41 @@ void QtNXWebEngineView::SendKeyPressEvent(int key) { } void QtNXWebEngineView::StartInputThread() { - if (input_thread_running) { - return; - } + input_thread = std::jthread([&](std::stop_token stoken) { + // Wait for 1 second before allowing any inputs to be processed. + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (is_local) { + QWidget::grabKeyboard(); + } + while (!stoken.stop_requested()) { + input_interpreter->PollInput(); - input_thread_running = true; - input_thread = std::thread(&QtNXWebEngineView::InputThread, this); + HandleWindowFooterButtonPressedOnce(); + + HandleWindowKeyButtonPressedOnce< + Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, + Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, + Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, + Core::HID::NpadButton::StickLDown>(); + + HandleWindowKeyButtonHold< + Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, + Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, + Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, + Core::HID::NpadButton::StickLDown>(); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + }); } void QtNXWebEngineView::StopInputThread() { if (is_local) { QWidget::releaseKeyboard(); } - - input_thread_running = false; - if (input_thread.joinable()) { - input_thread.join(); - } -} - -void QtNXWebEngineView::InputThread() { - // Wait for 1 second before allowing any inputs to be processed. - std::this_thread::sleep_for(std::chrono::seconds(1)); - - if (is_local) { - QWidget::grabKeyboard(); - } - - while (input_thread_running) { - input_interpreter->PollInput(); - - HandleWindowFooterButtonPressedOnce(); - - HandleWindowKeyButtonPressedOnce< - Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, - Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, - Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, - Core::HID::NpadButton::StickLDown>(); - - HandleWindowKeyButtonHold< - Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, - Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, - Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, - Core::HID::NpadButton::StickLDown>(); - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - } + input_thread.request_stop(); } void QtNXWebEngineView::LoadExtractedFonts() { diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h index 70b6d8e050..6a2dd0c8ba 100644 --- a/src/yuzu/applets/qt_web_browser.h +++ b/src/yuzu/applets/qt_web_browser.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -158,9 +158,6 @@ private: void StartInputThread(); void StopInputThread(); - /// The thread where input is being polled and processed. - void InputThread(); - /// Loads the extracted fonts using JavaScript. void LoadExtractedFonts(); @@ -168,24 +165,13 @@ private: void FocusFirstLinkElement(); InputCommon::InputSubsystem* input_subsystem; - std::unique_ptr url_interceptor; - std::unique_ptr input_interpreter; - - std::thread input_thread; - - std::atomic input_thread_running{}; - + std::jthread input_thread; std::atomic finished{}; - - Service::AM::Frontend::WebExitReason exit_reason{ - Service::AM::Frontend::WebExitReason::EndButtonPressed}; - + Service::AM::Frontend::WebExitReason exit_reason{Service::AM::Frontend::WebExitReason::EndButtonPressed}; std::string last_url{"http://localhost/"}; - bool is_local{}; - QWebEngineProfile* default_profile; QWebEngineSettings* global_settings; }; diff --git a/src/yuzu/util/overlay_dialog.cpp b/src/yuzu/util/overlay_dialog.cpp index 466bbe7b25..2d50f22acb 100644 --- a/src/yuzu/util/overlay_dialog.cpp +++ b/src/yuzu/util/overlay_dialog.cpp @@ -1,3 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -231,34 +233,20 @@ void OverlayDialog::TranslateButtonPress(Core::HID::NpadButton button) { } void OverlayDialog::StartInputThread() { - if (input_thread_running) { - return; - } - - input_thread_running = true; - - input_thread = std::thread(&OverlayDialog::InputThread, this); + input_thread = std::jthread([&](std::stop_token stoken) { + while (!stoken.stop_requested()) { + input_interpreter->PollInput(); + HandleButtonPressedOnce(); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + }); } void OverlayDialog::StopInputThread() { - input_thread_running = false; - - if (input_thread.joinable()) { - input_thread.join(); - } -} - -void OverlayDialog::InputThread() { - while (input_thread_running) { - input_interpreter->PollInput(); - - HandleButtonPressedOnce(); - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - } + input_thread.request_stop(); } void OverlayDialog::keyPressEvent(QKeyEvent* e) { diff --git a/src/yuzu/util/overlay_dialog.h b/src/yuzu/util/overlay_dialog.h index 62f9da311d..a2c9079e64 100644 --- a/src/yuzu/util/overlay_dialog.h +++ b/src/yuzu/util/overlay_dialog.h @@ -1,9 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include #include #include @@ -91,9 +92,6 @@ private: void StartInputThread(); void StopInputThread(); - - /// The thread where input is being polled and processed. - void InputThread(); void keyPressEvent(QKeyEvent* e) override; std::unique_ptr ui; @@ -101,8 +99,5 @@ private: bool use_rich_text; std::unique_ptr input_interpreter; - - std::thread input_thread; - - std::atomic input_thread_running{}; + std::jthread input_thread; }; From fec5ac22984868b761741d8b94023ee313103103 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 11 Feb 2026 05:04:39 +0100 Subject: [PATCH 036/170] [meta] add San Valentine's 2026 icon variation (#3476) Pinkish theme as well, very fruity, very nice Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3476 Reviewed-by: DraVee Reviewed-by: CamilleLaVey Co-authored-by: lizzie Co-committed-by: lizzie --- dist/dev.eden_emu.eden.svg | 411 +++++++++--------- dist/eden.bmp | Bin 262282 -> 262282 bytes dist/eden.ico | Bin 339477 -> 388289 bytes dist/icon_variations/valentines2026.svg | 211 +++++++++ dist/icon_variations/valentines2026_bgcolor | 1 + dist/icon_variations/valentines2026_named.svg | 225 ++++++++++ dist/qt_themes/default/icons/256x256/eden.png | Bin 41527 -> 68078 bytes .../default/icons/256x256/eden_named.png | Bin 52879 -> 80776 bytes .../res/drawable/ic_launcher_foreground.png | Bin 273428 -> 294604 bytes .../app/src/main/res/drawable/ic_yuzu.png | Bin 97299 -> 139145 bytes .../src/main/res/drawable/ic_yuzu_named.png | Bin 124574 -> 171661 bytes .../src/main/res/drawable/ic_yuzu_splash.png | Bin 108600 -> 102679 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 14163 -> 17157 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 9612 -> 10467 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 24239 -> 35148 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 35511 -> 59354 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 54764 -> 207718 bytes .../app/src/main/res/values/colors.xml | 2 +- 18 files changed, 634 insertions(+), 216 deletions(-) create mode 100644 dist/icon_variations/valentines2026.svg create mode 100644 dist/icon_variations/valentines2026_bgcolor create mode 100644 dist/icon_variations/valentines2026_named.svg diff --git a/dist/dev.eden_emu.eden.svg b/dist/dev.eden_emu.eden.svg index f88b52f625..7a68ed3e67 100644 --- a/dist/dev.eden_emu.eden.svg +++ b/dist/dev.eden_emu.eden.svg @@ -6,225 +6,206 @@ viewBox="0 0 512 512" version="1.1" id="svg7" - sodipodi:docname="base.svg.2026_01_12_14_43_47.0.svg" - inkscape:version="1.4.2 (ebf0e94, 2025-05-08)" - inkscape:export-filename="base.svg.2026_01_12_14_43_47.0.svg" + sodipodi:docname="EdenLogoLoveWhiteV3.svg" + inkscape:version="1.4.3 (0d15f75, 2025-12-25)" + xml:space="preserve" + inkscape:export-filename="dev.eden_emu.eden.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + + + + + + + Madeline_Dev + mailto:madelvidel@gmail.com + + + 2025 + + 2025 Eden Emulator Project + https://git.eden-emu.dev + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="defs7"> diff --git a/dist/eden.bmp b/dist/eden.bmp index 2f9b91c73b0419fafd32513a9a5e7952168f7666..97923d19762a0fbe8281a5deacdd45e1f53c3bf7 100644 GIT binary patch literal 262282 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 literal 262282 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

gJhhIhToUyu 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ÿ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%0DvKkK6#zW7bZCqs9e|` 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

wFeuZ$xpi2k!td|fT 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 + + + + + + + + Madeline_Dev + mailto:madelvidel@gmail.com + + + 2025 + + 2025 Eden Emulator Project + https://git.eden-emu.dev + + + + diff --git a/dist/icon_variations/valentines2026_bgcolor b/dist/icon_variations/valentines2026_bgcolor new file mode 100644 index 0000000000..d6377400f2 --- /dev/null +++ b/dist/icon_variations/valentines2026_bgcolor @@ -0,0 +1 @@ +#e48cc9ff diff --git a/dist/icon_variations/valentines2026_named.svg b/dist/icon_variations/valentines2026_named.svg new file mode 100644 index 0000000000..cba95d8fc8 --- /dev/null +++ b/dist/icon_variations/valentines2026_named.svg @@ -0,0 +1,225 @@ + + + + + + + + + Madeline_Dev + mailto:madelvidel@gmail.com + + + 2025 + + 2025 Eden Emulator Project + https://git.eden-emu.dev + + + + diff --git a/dist/qt_themes/default/icons/256x256/eden.png b/dist/qt_themes/default/icons/256x256/eden.png index 2fb04d8bc227ca0fb5c7d6740bafda597cf0299a..f9983caff5d50c8f646beba94f9ef34861f4bb6d 100644 GIT binary patch literal 68078 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%0A=Wj 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 IM6N<$g1P%@?f?J) literal 41527 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 z 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%0DSrK;>ET~Nr#6kD#Cps@4h|t0ua6YHtVHhiWmrF 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 WLyEzn*rRZu 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 FHMJYzbWjz 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

mM3FwW@8!S7arn3EfkLW$7D1U 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%0D4PQ)82oe#pQoia2_}AgK`vG1~T6#WQl@<84 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 Q@k?bS6ve-P{1Wj008Bk7JOBUy literal 273428 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Μ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

b%A{+Y8a$(;{1MqW@3(jO^7J> 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