GraphicPack: Allow overriding cos.xml permissions (#1948)

This commit is contained in:
techmuse 2026-06-08 11:59:51 -04:00 committed by GitHub
parent e4fa470140
commit bae38e56c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 65 additions and 2 deletions

View File

@ -972,19 +972,30 @@ namespace CafeSystem
{
if (sLaunchModeIsStandalone)
return CosCapabilityBits::All;
CosCapabilityBits resultMask = static_cast<CosCapabilityBits>(0);
for (const auto& pack : GraphicPack2::GetActiveGraphicPacks())
{
for (const auto& permissionOverrides : pack->GetPermissionOverrides())
{
if (permissionOverrides.first == group)
resultMask |= static_cast<CosCapabilityBits>(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;
}

View File

@ -451,6 +451,39 @@ GraphicPack2::GraphicPack2(fs::path rulesPath, IniParser& rules)
}
}
}
else if (boost::iequals(currentSectionName, "Permissions"))
{
std::array<std::pair<std::string_view, CosCapabilityGroup>, 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<uint64>(*permissionOption, 16);
m_permissions.push_back({group, permissionMask});
}
}
}
}
if (m_version >= 5)

View File

@ -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<PresetPtr>& GetPresets() const { return m_presets; }
[[nodiscard]] std::unordered_map<std::string, std::vector<PresetPtr>> GetCategorizedPresets(std::vector<std::string>& order) const;
// permissions
const std::vector<std::pair<CosCapabilityGroup, uint64>>& GetPermissionOverrides() { return m_permissions; }
// shaders
void LoadShaders();
@ -264,6 +268,9 @@ private:
// ram mappings
std::vector<std::pair<MPTR, MPTR>> m_ramMappings;
// permissions
std::vector<std::pair<CosCapabilityGroup, uint64>> m_permissions;
// patches
void LoadPatchFiles(); // loads Cemuhook or Cemu patches

View File

@ -51,6 +51,18 @@ enum class CosCapabilityBits : uint64
All = 0xFFFFFFFFFFFFFFFFull
};
inline CosCapabilityBits operator|(CosCapabilityBits a, CosCapabilityBits b)
{
return static_cast<CosCapabilityBits>(
static_cast<uint64>(a) | static_cast<uint64>(b));
}
inline CosCapabilityBits& operator|=(CosCapabilityBits& a, CosCapabilityBits b)
{
a = a | b;
return a;
}
enum class CosCapabilityBitsFS : uint64
{
ODD_READ = (1llu << 0),