diff --git a/src/Cafe/CafeSystem.cpp b/src/Cafe/CafeSystem.cpp index 337fb807..79184393 100644 --- a/src/Cafe/CafeSystem.cpp +++ b/src/Cafe/CafeSystem.cpp @@ -972,19 +972,30 @@ namespace CafeSystem { if (sLaunchModeIsStandalone) return CosCapabilityBits::All; + + CosCapabilityBits resultMask = static_cast(0); + for (const auto& pack : GraphicPack2::GetActiveGraphicPacks()) + { + for (const auto& permissionOverrides : pack->GetPermissionOverrides()) + { + if (permissionOverrides.first == group) + resultMask |= static_cast(permissionOverrides.second); + } + } + auto& update = sGameInfo_ForegroundTitle.GetUpdate(); if (update.IsValid()) { ParsedCosXml* cosXml = update.GetCosInfo(); if (cosXml) - return cosXml->GetCapabilityBits(group); + return cosXml->GetCapabilityBits(group) | resultMask; } auto& base = sGameInfo_ForegroundTitle.GetBase(); if(base.IsValid()) { ParsedCosXml* cosXml = base.GetCosInfo(); if (cosXml) - return cosXml->GetCapabilityBits(group); + return cosXml->GetCapabilityBits(group) | resultMask; } return CosCapabilityBits::All; } 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 diff --git a/src/Cafe/TitleList/TitleInfo.h b/src/Cafe/TitleList/TitleInfo.h index fa5b9c89..79379472 100644 --- a/src/Cafe/TitleList/TitleInfo.h +++ b/src/Cafe/TitleList/TitleInfo.h @@ -51,6 +51,18 @@ enum class CosCapabilityBits : uint64 All = 0xFFFFFFFFFFFFFFFFull }; +inline CosCapabilityBits operator|(CosCapabilityBits a, CosCapabilityBits b) +{ + return static_cast( + static_cast(a) | static_cast(b)); +} + +inline CosCapabilityBits& operator|=(CosCapabilityBits& a, CosCapabilityBits b) +{ + a = a | b; + return a; +} + enum class CosCapabilityBitsFS : uint64 { ODD_READ = (1llu << 0),