From baf1cfa2dcaddd4928e930f49ea420f4c746c78d Mon Sep 17 00:00:00 2001 From: techmuse <44119098+techmuse8@users.noreply.github.com> Date: Sun, 7 Jun 2026 14:59:49 -0400 Subject: [PATCH] GraphicPack: Allow overriding cos.xml permissions --- src/Cafe/CafeSystem.cpp | 17 ++++++++++++++ src/Cafe/GraphicPack/GraphicPack2.cpp | 33 +++++++++++++++++++++++++++ src/Cafe/GraphicPack/GraphicPack2.h | 7 ++++++ 3 files changed, 57 insertions(+) diff --git a/src/Cafe/CafeSystem.cpp b/src/Cafe/CafeSystem.cpp index 096d90f4..af1a54bd 100644 --- a/src/Cafe/CafeSystem.cpp +++ b/src/Cafe/CafeSystem.cpp @@ -950,6 +950,23 @@ namespace CafeSystem { if (sLaunchModeIsStandalone) return CosCapabilityBits::All; + + uint64 resultMask = 0; + for (const auto& pack : GraphicPack2::GetGraphicPacks()) + { + if (pack->IsEnabled()) + { + for (const auto& permissionOverrides : pack->GetPermissionOverrides()) + { + if (permissionOverrides.first == group) + resultMask |= permissionOverrides.second; + } + } + } + + if (resultMask != 0) + return static_cast(resultMask); + auto& update = sGameInfo_ForegroundTitle.GetUpdate(); if (update.IsValid()) { diff --git a/src/Cafe/GraphicPack/GraphicPack2.cpp b/src/Cafe/GraphicPack/GraphicPack2.cpp index e79f9fc5..850fb6bd 100644 --- a/src/Cafe/GraphicPack/GraphicPack2.cpp +++ b/src/Cafe/GraphicPack/GraphicPack2.cpp @@ -451,6 +451,39 @@ GraphicPack2::GraphicPack2(fs::path rulesPath, IniParser& rules) } } } + else if (boost::iequals(currentSectionName, "Permissions")) + { + std::array, 15> permissionTable + {{ + {"BSP", CosCapabilityGroup::BSP}, + {"DK", CosCapabilityGroup::DK}, + {"USB", CosCapabilityGroup::USB}, + {"UHS", CosCapabilityGroup::UHS}, + {"FS", CosCapabilityGroup::FS}, + {"MCP", CosCapabilityGroup::MCP}, + {"NIM", CosCapabilityGroup::NIM}, + {"ACT", CosCapabilityGroup::ACT}, + {"FPD", CosCapabilityGroup::FPD}, + {"BOSS", CosCapabilityGroup::BOSS}, + {"ACP", CosCapabilityGroup::ACP}, + {"PDM", CosCapabilityGroup::PDM}, + {"AC", CosCapabilityGroup::AC}, + {"NDM", CosCapabilityGroup::NDM}, + {"NSEC", CosCapabilityGroup::NSEC} + }}; + + for (const auto& [name, group] : permissionTable) + { + const auto permissionOption = rules.FindOption(name); + if (permissionOption) + { + cemuLog_log(LogType::Force, "Graphic pack \"{}\": has permission mask {} for {}", GetNormalizedPathString(), *permissionOption, name); + uint64 permissionMask = ConvertString(*permissionOption, 16); + m_permissions.push_back({group, permissionMask}); + } + + } + } } if (m_version >= 5) diff --git a/src/Cafe/GraphicPack/GraphicPack2.h b/src/Cafe/GraphicPack/GraphicPack2.h index 88d02017..e332a5a7 100644 --- a/src/Cafe/GraphicPack/GraphicPack2.h +++ b/src/Cafe/GraphicPack/GraphicPack2.h @@ -2,6 +2,7 @@ #include "util/helpers/helpers.h" #include "Cemu/ExpressionParser/ExpressionParser.h" +#include "Cafe/TitleList/TitleInfo.h" #include "Cafe/HW/Latte/Renderer/RendererOuputShader.h" #include "util/helpers/Serializer.h" #include "Cafe/OS/RPL/rpl.h" @@ -147,6 +148,9 @@ public: [[nodiscard]] const std::vector& GetPresets() const { return m_presets; } [[nodiscard]] std::unordered_map> GetCategorizedPresets(std::vector& order) const; + + // permissions + const std::vector>& GetPermissionOverrides() { return m_permissions; } // shaders void LoadShaders(); @@ -264,6 +268,9 @@ private: // ram mappings std::vector> m_ramMappings; + + // permissions + std::vector> m_permissions; // patches void LoadPatchFiles(); // loads Cemuhook or Cemu patches