settings: split Settings::values into two different structs
By splitting the settings into two mutually exclusive structs, it becomes easier, as a developer, to determine how to use the Settings structs after per-game configurations is merged. Other benefits include only duplicating the required settings in memory.
This commit is contained in:
@@ -192,7 +192,7 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
|
||||
config.define_unpredictable_behaviour = true;
|
||||
|
||||
// Optimizations
|
||||
if (Settings::values->disable_cpu_opt) {
|
||||
if (Settings::base_values.disable_cpu_opt) {
|
||||
config.enable_optimizations = false;
|
||||
config.enable_fast_dispatch = false;
|
||||
}
|
||||
|
||||
@@ -241,12 +241,12 @@ struct System::Impl {
|
||||
main_process->Run(load_parameters->main_thread_priority,
|
||||
load_parameters->main_thread_stack_size);
|
||||
|
||||
if (Settings::values->gamecard_inserted) {
|
||||
if (Settings::values->gamecard_current_game) {
|
||||
if (Settings::base_values.gamecard_inserted) {
|
||||
if (Settings::base_values.gamecard_current_game) {
|
||||
fs_controller.SetGameCard(GetGameFileFromPath(virtual_filesystem, filepath));
|
||||
} else if (!Settings::values->gamecard_path.empty()) {
|
||||
} else if (!Settings::base_values.gamecard_path.empty()) {
|
||||
fs_controller.SetGameCard(
|
||||
GetGameFileFromPath(virtual_filesystem, Settings::values->gamecard_path));
|
||||
GetGameFileFromPath(virtual_filesystem, Settings::base_values.gamecard_path));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ u64 BISFactory::GetSystemNANDFreeSpace() const {
|
||||
}
|
||||
|
||||
u64 BISFactory::GetSystemNANDTotalSpace() const {
|
||||
return static_cast<u64>(Settings::values->nand_system_size);
|
||||
return static_cast<u64>(Settings::base_values.nand_system_size);
|
||||
}
|
||||
|
||||
u64 BISFactory::GetUserNANDFreeSpace() const {
|
||||
@@ -129,11 +129,11 @@ u64 BISFactory::GetUserNANDFreeSpace() const {
|
||||
}
|
||||
|
||||
u64 BISFactory::GetUserNANDTotalSpace() const {
|
||||
return static_cast<u64>(Settings::values->nand_user_size);
|
||||
return static_cast<u64>(Settings::base_values.nand_user_size);
|
||||
}
|
||||
|
||||
u64 BISFactory::GetFullNANDTotalSpace() const {
|
||||
return static_cast<u64>(Settings::values->nand_total_size);
|
||||
return static_cast<u64>(Settings::base_values.nand_total_size);
|
||||
}
|
||||
|
||||
VirtualDir BISFactory::GetBCATDirectory(u64 title_id) const {
|
||||
|
||||
@@ -80,7 +80,7 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {
|
||||
if (exefs == nullptr)
|
||||
return exefs;
|
||||
|
||||
if (Settings::values->dump_exefs) {
|
||||
if (Settings::base_values.dump_exefs) {
|
||||
LOG_INFO(Loader, "Dumping ExeFS for title_id={:016X}", title_id);
|
||||
const auto dump_dir =
|
||||
Core::System::GetInstance().GetFileSystemController().GetModificationDumpRoot(title_id);
|
||||
@@ -92,7 +92,7 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {
|
||||
|
||||
const auto& installed = Core::System::GetInstance().GetContentProvider();
|
||||
|
||||
const auto& disabled = Settings::global_values.disabled_addons[title_id];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[title_id];
|
||||
const auto update_disabled =
|
||||
std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend();
|
||||
|
||||
@@ -140,7 +140,7 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const {
|
||||
|
||||
std::vector<VirtualFile> PatchManager::CollectPatches(const std::vector<VirtualDir>& patch_dirs,
|
||||
const std::string& build_id) const {
|
||||
const auto& disabled = Settings::global_values.disabled_addons[title_id];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[title_id];
|
||||
|
||||
std::vector<VirtualFile> out;
|
||||
out.reserve(patch_dirs.size());
|
||||
@@ -192,7 +192,7 @@ std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso, const std::st
|
||||
const auto build_id_raw = Common::HexToString(header.build_id);
|
||||
const auto build_id = build_id_raw.substr(0, build_id_raw.find_last_not_of('0') + 1);
|
||||
|
||||
if (Settings::values->dump_nso) {
|
||||
if (Settings::base_values.dump_nso) {
|
||||
LOG_INFO(Loader, "Dumping NSO for name={}, build_id={}, title_id={:016X}", name, build_id,
|
||||
title_id);
|
||||
const auto dump_dir =
|
||||
@@ -302,7 +302,7 @@ std::vector<Core::Memory::CheatEntry> PatchManager::CreateCheatList(
|
||||
return {};
|
||||
}
|
||||
|
||||
const auto& disabled = Settings::global_values.disabled_addons[title_id];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[title_id];
|
||||
auto patch_dirs = load_dir->GetSubdirectories();
|
||||
std::sort(patch_dirs.begin(), patch_dirs.end(),
|
||||
[](const VirtualDir& l, const VirtualDir& r) { return l->GetName() < r->GetName(); });
|
||||
@@ -344,7 +344,7 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& disabled = Settings::global_values.disabled_addons[title_id];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[title_id];
|
||||
auto patch_dirs = load_dir->GetSubdirectories();
|
||||
std::sort(patch_dirs.begin(), patch_dirs.end(),
|
||||
[](const VirtualDir& l, const VirtualDir& r) { return l->GetName() < r->GetName(); });
|
||||
@@ -409,7 +409,7 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, Content
|
||||
const auto update_tid = GetUpdateTitleID(title_id);
|
||||
const auto update = installed.GetEntryRaw(update_tid, type);
|
||||
|
||||
const auto& disabled = Settings::global_values.disabled_addons[title_id];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[title_id];
|
||||
const auto update_disabled =
|
||||
std::find(disabled.cbegin(), disabled.cend(), "Update") != disabled.cend();
|
||||
|
||||
@@ -453,7 +453,7 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam
|
||||
return {};
|
||||
std::map<std::string, std::string, std::less<>> out;
|
||||
const auto& installed = Core::System::GetInstance().GetContentProvider();
|
||||
const auto& disabled = Settings::global_values.disabled_addons[title_id];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[title_id];
|
||||
|
||||
// Game Updates
|
||||
const auto update_tid = GetUpdateTitleID(title_id);
|
||||
|
||||
@@ -46,7 +46,7 @@ u64 SDMCFactory::GetSDMCFreeSpace() const {
|
||||
}
|
||||
|
||||
u64 SDMCFactory::GetSDMCTotalSpace() const {
|
||||
return static_cast<u64>(Settings::values->sdmc_size);
|
||||
return static_cast<u64>(Settings::base_values.sdmc_size);
|
||||
}
|
||||
|
||||
} // namespace FileSys
|
||||
|
||||
@@ -91,7 +91,7 @@ void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||
|
||||
const auto current = system.CurrentProcess()->GetTitleID();
|
||||
|
||||
const auto& disabled = Settings::global_values.disabled_addons[current];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[current];
|
||||
if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) {
|
||||
rb.Push<u32>(0);
|
||||
return;
|
||||
@@ -119,7 +119,7 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||
const auto current = system.CurrentProcess()->GetTitleID();
|
||||
|
||||
std::vector<u32> out;
|
||||
const auto& disabled = Settings::global_values.disabled_addons[current];
|
||||
const auto& disabled = Settings::base_values.disabled_addons[current];
|
||||
if (std::find(disabled.begin(), disabled.end(), "DLC") == disabled.end()) {
|
||||
for (u64 content_id : add_on_content) {
|
||||
if ((content_id & DLC_BASE_TITLE_ID_MASK) != current) {
|
||||
|
||||
@@ -271,7 +271,7 @@ void SynchronizeInternal(AM::Applets::AppletManager& applet_manager, DirectoryGe
|
||||
std::optional<std::string> dir_name = {}) {
|
||||
progress.SetNeedHLELock(true);
|
||||
|
||||
if (Settings::values->bcat_boxcat_local) {
|
||||
if (Settings::base_values.bcat_boxcat_local) {
|
||||
LOG_INFO(Service_BCAT, "Boxcat using local data by override, skipping download.");
|
||||
const auto dir = dir_getter(title.title_id);
|
||||
if (dir)
|
||||
@@ -384,7 +384,7 @@ bool Boxcat::SynchronizeDirectory(TitleIDVersion title, std::string name,
|
||||
}
|
||||
|
||||
bool Boxcat::Clear(u64 title_id) {
|
||||
if (Settings::values->bcat_boxcat_local) {
|
||||
if (Settings::base_values.bcat_boxcat_local) {
|
||||
LOG_INFO(Service_BCAT, "Boxcat using local data by override, skipping clear.");
|
||||
return true;
|
||||
}
|
||||
@@ -412,7 +412,7 @@ void Boxcat::SetPassphrase(u64 title_id, const Passphrase& passphrase) {
|
||||
std::optional<std::vector<u8>> Boxcat::GetLaunchParameter(TitleIDVersion title) {
|
||||
const auto path{GetBINFilePath(title.title_id)};
|
||||
|
||||
if (Settings::values->bcat_boxcat_local) {
|
||||
if (Settings::base_values.bcat_boxcat_local) {
|
||||
LOG_INFO(Service_BCAT, "Boxcat using local data by override, skipping download.");
|
||||
} else {
|
||||
Boxcat::Client client{path, title.title_id, title.build_id};
|
||||
|
||||
@@ -571,7 +571,7 @@ void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId(
|
||||
std::unique_ptr<Backend> CreateBackendFromSettings([[maybe_unused]] Core::System& system,
|
||||
DirectoryGetter getter) {
|
||||
#ifdef YUZU_ENABLE_BOXCAT
|
||||
if (Settings::values->bcat_backend == "boxcat") {
|
||||
if (Settings::base_values.bcat_backend == "boxcat") {
|
||||
return std::make_unique<Boxcat>(system.GetAppletManager(), std::move(getter));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -71,12 +71,12 @@ void Controller_DebugPad::OnUpdate(const Core::Timing::CoreTiming& core_timing,
|
||||
}
|
||||
|
||||
void Controller_DebugPad::OnLoadInputDevices() {
|
||||
std::transform(Settings::values->debug_pad_buttons.begin(),
|
||||
Settings::values->debug_pad_buttons.begin() +
|
||||
std::transform(Settings::base_values.debug_pad_buttons.begin(),
|
||||
Settings::base_values.debug_pad_buttons.begin() +
|
||||
Settings::NativeButton::NUM_BUTTONS_HID,
|
||||
buttons.begin(), Input::CreateDevice<Input::ButtonDevice>);
|
||||
std::transform(Settings::values->debug_pad_analogs.begin(),
|
||||
Settings::values->debug_pad_analogs.end(), analogs.begin(),
|
||||
std::transform(Settings::base_values.debug_pad_analogs.begin(),
|
||||
Settings::base_values.debug_pad_analogs.end(), analogs.begin(),
|
||||
Input::CreateDevice<Input::AnalogDevice>);
|
||||
}
|
||||
} // namespace Service::HID
|
||||
|
||||
@@ -53,9 +53,9 @@ void Controller_Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing,
|
||||
}
|
||||
|
||||
void Controller_Keyboard::OnLoadInputDevices() {
|
||||
std::transform(Settings::values->keyboard_keys.begin(), Settings::values->keyboard_keys.end(),
|
||||
std::transform(Settings::base_values.keyboard_keys.begin(), Settings::base_values.keyboard_keys.end(),
|
||||
keyboard_keys.begin(), Input::CreateDevice<Input::ButtonDevice>);
|
||||
std::transform(Settings::values->keyboard_mods.begin(), Settings::values->keyboard_mods.end(),
|
||||
std::transform(Settings::base_values.keyboard_mods.begin(), Settings::base_values.keyboard_mods.end(),
|
||||
keyboard_mods.begin(), Input::CreateDevice<Input::ButtonDevice>);
|
||||
}
|
||||
} // namespace Service::HID
|
||||
|
||||
@@ -36,7 +36,7 @@ void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
|
||||
cur_entry.sampling_number = last_entry.sampling_number + 1;
|
||||
cur_entry.sampling_number2 = cur_entry.sampling_number;
|
||||
|
||||
if (Settings::values->mouse_enabled) {
|
||||
if (Settings::base_values.mouse_enabled) {
|
||||
const auto [px, py, sx, sy] = mouse_device->GetStatus();
|
||||
const auto x = static_cast<s32>(px * Layout::ScreenUndocked::Width);
|
||||
const auto y = static_cast<s32>(py * Layout::ScreenUndocked::Height);
|
||||
@@ -56,8 +56,8 @@ void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
|
||||
}
|
||||
|
||||
void Controller_Mouse::OnLoadInputDevices() {
|
||||
mouse_device = Input::CreateDevice<Input::MouseDevice>(Settings::values->mouse_device);
|
||||
std::transform(Settings::values->mouse_buttons.begin(), Settings::values->mouse_buttons.end(),
|
||||
mouse_device = Input::CreateDevice<Input::MouseDevice>(Settings::base_values.mouse_device);
|
||||
std::transform(Settings::base_values.mouse_buttons.begin(), Settings::base_values.mouse_buttons.end(),
|
||||
mouse_button_devices.begin(), Input::CreateDevice<Input::ButtonDevice>);
|
||||
}
|
||||
} // namespace Service::HID
|
||||
|
||||
@@ -159,11 +159,11 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
|
||||
controller.single_color.button_color = 0;
|
||||
|
||||
controller.dual_color_error = ColorReadError::ReadOk;
|
||||
controller.left_color.body_color = Settings::values->players[controller_idx].body_color_left;
|
||||
controller.left_color.button_color = Settings::values->players[controller_idx].button_color_left;
|
||||
controller.right_color.body_color = Settings::values->players[controller_idx].body_color_right;
|
||||
controller.left_color.body_color = Settings::base_values.players[controller_idx].body_color_left;
|
||||
controller.left_color.button_color = Settings::base_values.players[controller_idx].button_color_left;
|
||||
controller.right_color.body_color = Settings::base_values.players[controller_idx].body_color_right;
|
||||
controller.right_color.button_color =
|
||||
Settings::values->players[controller_idx].button_color_right;
|
||||
Settings::base_values.players[controller_idx].button_color_right;
|
||||
|
||||
controller.battery_level[0] = BATTERY_FULL;
|
||||
controller.battery_level[1] = BATTERY_FULL;
|
||||
@@ -193,7 +193,7 @@ void Controller_NPad::OnInit() {
|
||||
}
|
||||
|
||||
std::transform(
|
||||
Settings::values->players.begin(), Settings::values->players.end(),
|
||||
Settings::base_values.players.begin(), Settings::base_values.players.end(),
|
||||
connected_controllers.begin(), [](const Settings::PlayerInput& player) {
|
||||
return ControllerHolder{MapSettingsTypeToNPad(player.type), player.connected};
|
||||
});
|
||||
@@ -227,7 +227,7 @@ void Controller_NPad::OnInit() {
|
||||
}
|
||||
|
||||
void Controller_NPad::OnLoadInputDevices() {
|
||||
const auto& players = Settings::values->players;
|
||||
const auto& players = Settings::base_values.players;
|
||||
for (std::size_t i = 0; i < players.size(); ++i) {
|
||||
std::transform(players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN,
|
||||
players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_END,
|
||||
@@ -459,7 +459,7 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) {
|
||||
continue;
|
||||
}
|
||||
const auto requested_controller =
|
||||
i <= MAX_NPAD_ID ? MapSettingsTypeToNPad(Settings::values->players[i].type)
|
||||
i <= MAX_NPAD_ID ? MapSettingsTypeToNPad(Settings::base_values.players[i].type)
|
||||
: NPadControllerType::Handheld;
|
||||
if (!IsControllerSupported(requested_controller)) {
|
||||
const auto is_handheld = requested_controller == NPadControllerType::Handheld;
|
||||
|
||||
@@ -43,16 +43,16 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
|
||||
const auto [x, y, pressed] = touch_device->GetStatus();
|
||||
auto& touch_entry = cur_entry.states[0];
|
||||
touch_entry.attribute.raw = 0;
|
||||
if (pressed && Settings::values->touchscreen.enabled) {
|
||||
if (pressed && Settings::base_values.touchscreen.enabled) {
|
||||
touch_entry.x = static_cast<u16>(x * Layout::ScreenUndocked::Width);
|
||||
touch_entry.y = static_cast<u16>(y * Layout::ScreenUndocked::Height);
|
||||
touch_entry.diameter_x = Settings::values->touchscreen.diameter_x;
|
||||
touch_entry.diameter_y = Settings::values->touchscreen.diameter_y;
|
||||
touch_entry.rotation_angle = Settings::values->touchscreen.rotation_angle;
|
||||
touch_entry.diameter_x = Settings::base_values.touchscreen.diameter_x;
|
||||
touch_entry.diameter_y = Settings::base_values.touchscreen.diameter_y;
|
||||
touch_entry.rotation_angle = Settings::base_values.touchscreen.rotation_angle;
|
||||
const u64 tick = core_timing.GetCPUTicks();
|
||||
touch_entry.delta_time = tick - last_touch;
|
||||
last_touch = tick;
|
||||
touch_entry.finger = Settings::values->touchscreen.finger;
|
||||
touch_entry.finger = Settings::base_values.touchscreen.finger;
|
||||
cur_entry.entry_count = 1;
|
||||
} else {
|
||||
cur_entry.entry_count = 0;
|
||||
@@ -62,6 +62,7 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
|
||||
}
|
||||
|
||||
void Controller_Touchscreen::OnLoadInputDevices() {
|
||||
touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values->touchscreen.device);
|
||||
touch_device = Input::CreateDevice<Input::TouchDevice>(
|
||||
Settings::base_values.touchscreen.device);
|
||||
}
|
||||
} // namespace Service::HID
|
||||
|
||||
@@ -110,7 +110,7 @@ void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
|
||||
void IAppletResource::UpdateControllers(u64 userdata, s64 ns_late) {
|
||||
auto& core_timing = system.CoreTiming();
|
||||
|
||||
const bool should_reload = Settings::values->is_device_reload_pending.exchange(false);
|
||||
const bool should_reload = Settings::base_values.is_device_reload_pending.exchange(false);
|
||||
for (const auto& controller : controllers) {
|
||||
if (should_reload) {
|
||||
controller->OnLoadInputDevices();
|
||||
@@ -1281,7 +1281,7 @@ public:
|
||||
};
|
||||
|
||||
void ReloadInputDevices() {
|
||||
Settings::values->is_device_reload_pending.store(true);
|
||||
Settings::base_values.is_device_reload_pending.store(true);
|
||||
}
|
||||
|
||||
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
|
||||
|
||||
@@ -88,7 +88,7 @@ private:
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
|
||||
if (Settings::values->bcat_backend == "none") {
|
||||
if (Settings::base_values.bcat_backend == "none") {
|
||||
rb.PushEnum(RequestState::NotSubmitted);
|
||||
} else {
|
||||
rb.PushEnum(RequestState::Connected);
|
||||
@@ -201,7 +201,7 @@ private:
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
if (Settings::values->bcat_backend == "none") {
|
||||
if (Settings::base_values.bcat_backend == "none") {
|
||||
rb.Push<u8>(0);
|
||||
} else {
|
||||
rb.Push<u8>(1);
|
||||
@@ -212,7 +212,7 @@ private:
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
if (Settings::values->bcat_backend == "none") {
|
||||
if (Settings::base_values.bcat_backend == "none") {
|
||||
rb.Push<u8>(0);
|
||||
} else {
|
||||
rb.Push<u8>(1);
|
||||
|
||||
@@ -159,7 +159,7 @@ void SET::GetQuestFlag(Kernel::HLERequestContext& ctx) {
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 3};
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
rb.Push(static_cast<u32>(Settings::values->quest_flag));
|
||||
rb.Push(static_cast<u32>(Settings::base_values.quest_flag));
|
||||
}
|
||||
|
||||
void SET::GetLanguageCode(Kernel::HLERequestContext& ctx) {
|
||||
|
||||
@@ -157,8 +157,8 @@ static bool LoadNroImpl(Kernel::Process& process, const std::vector<u8>& data,
|
||||
codeset.segments[i].size = PageAlignSize(nro_header.segments[i].size);
|
||||
}
|
||||
|
||||
if (!Settings::values->program_args.empty()) {
|
||||
const auto arg_data = Settings::values->program_args;
|
||||
if (!Settings::base_values.program_args.empty()) {
|
||||
const auto arg_data = Settings::base_values.program_args;
|
||||
codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE;
|
||||
NSOArgumentHeader args_header{
|
||||
NSO_ARGUMENT_DATA_ALLOCATION_SIZE, static_cast<u32_le>(arg_data.size()), {}};
|
||||
|
||||
@@ -105,8 +105,8 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process,
|
||||
codeset.segments[i].size = nso_header.segments[i].size;
|
||||
}
|
||||
|
||||
if (should_pass_arguments && !Settings::values->program_args.empty()) {
|
||||
const auto arg_data{Settings::values->program_args};
|
||||
if (should_pass_arguments && !Settings::base_values.program_args.empty()) {
|
||||
const auto arg_data{Settings::base_values.program_args};
|
||||
|
||||
codeset.DataSegment().size += NSO_ARGUMENT_DATA_ALLOCATION_SIZE;
|
||||
NSOArgumentHeader args_header{
|
||||
@@ -129,7 +129,7 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process,
|
||||
}
|
||||
|
||||
// Apply patches if necessary
|
||||
if (pm && (pm->HasNSOPatch(nso_header.build_id) || Settings::values->dump_nso)) {
|
||||
if (pm && (pm->HasNSOPatch(nso_header.build_id) || Settings::base_values.dump_nso)) {
|
||||
std::vector<u8> pi_header;
|
||||
pi_header.insert(pi_header.begin(), reinterpret_cast<u8*>(&nso_header),
|
||||
reinterpret_cast<u8*>(&nso_header) + sizeof(NSOHeader));
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Core {
|
||||
PerfStats::PerfStats(u64 title_id) : title_id(title_id) {}
|
||||
|
||||
PerfStats::~PerfStats() {
|
||||
if (!Settings::values->record_frame_times || title_id == 0) {
|
||||
if (!Settings::base_values.record_frame_times || title_id == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -439,7 +439,7 @@ void Reporter::SaveUserReport() const {
|
||||
}
|
||||
|
||||
bool Reporter::IsReportingEnabled() const {
|
||||
return Settings::values->reporting_services;
|
||||
return Settings::base_values.reporting_services;
|
||||
}
|
||||
|
||||
} // namespace Core
|
||||
|
||||
@@ -63,6 +63,7 @@ const std::array<const char*, NumMouseButtons> mapping = {{
|
||||
}};
|
||||
}
|
||||
|
||||
NonSwitchingValues base_values;
|
||||
Values global_values;
|
||||
Values game_values;
|
||||
Values *values = &global_values;
|
||||
@@ -70,55 +71,55 @@ Values *config_values = &global_values;
|
||||
|
||||
void CopyValues(Values& dst, const Values& src) {
|
||||
// Controls
|
||||
dst.players = src.players;
|
||||
dst.mouse_enabled = src.mouse_enabled;
|
||||
dst.mouse_device = src.mouse_device;
|
||||
//~ dst.players = src.players;
|
||||
//~ dst.mouse_enabled = src.mouse_enabled;
|
||||
//~ dst.mouse_device = src.mouse_device;
|
||||
|
||||
dst.keyboard_enabled = src.keyboard_enabled;
|
||||
dst.keyboard_keys = src.keyboard_keys;
|
||||
dst.keyboard_mods = src.keyboard_mods;
|
||||
//~ dst.keyboard_enabled = src.keyboard_enabled;
|
||||
//~ dst.keyboard_keys = src.keyboard_keys;
|
||||
//~ dst.keyboard_mods = src.keyboard_mods;
|
||||
|
||||
dst.debug_pad_enabled = src.debug_pad_enabled;
|
||||
dst.debug_pad_buttons = src.debug_pad_buttons;
|
||||
dst.debug_pad_analogs = src.debug_pad_analogs;
|
||||
//~ dst.debug_pad_enabled = src.debug_pad_enabled;
|
||||
//~ dst.debug_pad_buttons = src.debug_pad_buttons;
|
||||
//~ dst.debug_pad_analogs = src.debug_pad_analogs;
|
||||
|
||||
dst.motion_device = src.motion_device;
|
||||
dst.touchscreen = src.touchscreen;
|
||||
dst.udp_input_address = src.udp_input_address;
|
||||
dst.udp_input_port = src.udp_input_port;
|
||||
dst.udp_pad_index = src.udp_pad_index;
|
||||
//~ dst.motion_device = src.motion_device;
|
||||
//~ dst.touchscreen = src.touchscreen;
|
||||
//~ dst.udp_input_address = src.udp_input_address;
|
||||
//~ dst.udp_input_port = src.udp_input_port;
|
||||
//~ dst.udp_pad_index = src.udp_pad_index;
|
||||
|
||||
dst.use_virtual_sd = src.use_virtual_sd;
|
||||
dst.gamecard_inserted = src.gamecard_inserted;
|
||||
dst.gamecard_current_game = src.gamecard_current_game;
|
||||
dst.gamecard_path = src.gamecard_path;
|
||||
dst.nand_total_size = src.nand_total_size;
|
||||
dst.nand_system_size = src.nand_system_size;
|
||||
dst.nand_user_size = src.nand_user_size;
|
||||
dst.sdmc_size = src.sdmc_size;
|
||||
//~ dst.use_virtual_sd = src.use_virtual_sd;
|
||||
//~ dst.gamecard_inserted = src.gamecard_inserted;
|
||||
//~ dst.gamecard_current_game = src.gamecard_current_game;
|
||||
//~ dst.gamecard_path = src.gamecard_path;
|
||||
//~ dst.nand_total_size = src.nand_total_size;
|
||||
//~ dst.nand_system_size = src.nand_system_size;
|
||||
//~ dst.nand_user_size = src.nand_user_size;
|
||||
//~ dst.sdmc_size = src.sdmc_size;
|
||||
|
||||
dst.log_filter = src.log_filter;
|
||||
//~ dst.log_filter = src.log_filter;
|
||||
|
||||
dst.use_dev_keys = src.use_dev_keys;
|
||||
//~ dst.use_dev_keys = src.use_dev_keys;
|
||||
|
||||
dst.record_frame_times = src.record_frame_times;
|
||||
dst.use_gdbstub = src.use_gdbstub;
|
||||
dst.gdbstub_port = src.gdbstub_port;
|
||||
dst.program_args = src.program_args;
|
||||
dst.dump_exefs = src.dump_exefs;
|
||||
dst.dump_nso = src.dump_nso;
|
||||
dst.reporting_services = src.reporting_services;
|
||||
dst.quest_flag = src.quest_flag;
|
||||
dst.disable_cpu_opt = src.disable_cpu_opt;
|
||||
dst.disable_macro_jit = src.disable_macro_jit;
|
||||
//~ dst.record_frame_times = src.record_frame_times;
|
||||
//~ dst.use_gdbstub = src.use_gdbstub;
|
||||
//~ dst.gdbstub_port = src.gdbstub_port;
|
||||
//~ dst.program_args = src.program_args;
|
||||
//~ dst.dump_exefs = src.dump_exefs;
|
||||
//~ dst.dump_nso = src.dump_nso;
|
||||
//~ dst.reporting_services = src.reporting_services;
|
||||
//~ dst.quest_flag = src.quest_flag;
|
||||
//~ dst.disable_cpu_opt = src.disable_cpu_opt;
|
||||
//~ dst.disable_macro_jit = src.disable_macro_jit;
|
||||
|
||||
dst.bcat_backend = src.bcat_backend;
|
||||
dst.bcat_boxcat_local = src.bcat_boxcat_local;
|
||||
//~ dst.bcat_backend = src.bcat_backend;
|
||||
//~ dst.bcat_boxcat_local = src.bcat_boxcat_local;
|
||||
|
||||
dst.enable_telemetry = src.enable_telemetry;
|
||||
dst.web_api_url = src.web_api_url;
|
||||
dst.yuzu_username = src.yuzu_username;
|
||||
dst.yuzu_token = src.yuzu_token;
|
||||
//~ dst.enable_telemetry = src.enable_telemetry;
|
||||
//~ dst.web_api_url = src.web_api_url;
|
||||
//~ dst.yuzu_username = src.yuzu_username;
|
||||
//~ dst.yuzu_token = src.yuzu_token;
|
||||
}
|
||||
|
||||
void SwapValues(ValuesSwapTarget target) {
|
||||
@@ -157,8 +158,8 @@ std::string GetTimeZoneString() {
|
||||
}
|
||||
|
||||
void Apply() {
|
||||
GDBStub::SetServerPort(values->gdbstub_port);
|
||||
GDBStub::ToggleServer(values->use_gdbstub);
|
||||
GDBStub::SetServerPort(base_values.gdbstub_port);
|
||||
GDBStub::ToggleServer(base_values.use_gdbstub);
|
||||
|
||||
auto& system_instance = Core::System::GetInstance();
|
||||
if (system_instance.IsPoweredOn()) {
|
||||
@@ -195,14 +196,14 @@ void LogSettings() {
|
||||
LogSetting("Audio_OutputEngine", Settings::values->sink_id);
|
||||
LogSetting("Audio_EnableAudioStretching", Settings::values->enable_audio_stretching);
|
||||
LogSetting("Audio_OutputDevice", Settings::values->audio_device_id);
|
||||
LogSetting("DataStorage_UseVirtualSd", Settings::values->use_virtual_sd);
|
||||
LogSetting("DataStorage_UseVirtualSd", Settings::base_values.use_virtual_sd);
|
||||
LogSetting("DataStorage_NandDir", FileUtil::GetUserPath(FileUtil::UserPath::NANDDir));
|
||||
LogSetting("DataStorage_SdmcDir", FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir));
|
||||
LogSetting("Debugging_UseGdbstub", Settings::values->use_gdbstub);
|
||||
LogSetting("Debugging_GdbstubPort", Settings::values->gdbstub_port);
|
||||
LogSetting("Debugging_ProgramArgs", Settings::values->program_args);
|
||||
LogSetting("Services_BCATBackend", Settings::values->bcat_backend);
|
||||
LogSetting("Services_BCATBoxcatLocal", Settings::values->bcat_boxcat_local);
|
||||
LogSetting("Debugging_UseGdbstub", Settings::base_values.use_gdbstub);
|
||||
LogSetting("Debugging_GdbstubPort", Settings::base_values.gdbstub_port);
|
||||
LogSetting("Debugging_ProgramArgs", Settings::base_values.program_args);
|
||||
LogSetting("Services_BCATBackend", Settings::base_values.bcat_backend);
|
||||
LogSetting("Services_BCATBoxcatLocal", Settings::base_values.bcat_boxcat_local);
|
||||
}
|
||||
|
||||
float Volume() {
|
||||
|
||||
@@ -383,54 +383,19 @@ enum class GPUAccuracy : u32 {
|
||||
};
|
||||
|
||||
struct Values {
|
||||
// System
|
||||
bool use_docked_mode;
|
||||
std::optional<u32> rng_seed;
|
||||
// Measured in seconds since epoch
|
||||
std::optional<std::chrono::seconds> custom_rtc;
|
||||
// Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc`
|
||||
std::chrono::seconds custom_rtc_differential;
|
||||
|
||||
s32 current_user;
|
||||
s32 language_index;
|
||||
s32 region_index;
|
||||
s32 time_zone_index;
|
||||
s32 sound_index;
|
||||
|
||||
// Controls
|
||||
std::array<PlayerInput, 10> players;
|
||||
|
||||
bool mouse_enabled;
|
||||
std::string mouse_device;
|
||||
MouseButtonsRaw mouse_buttons;
|
||||
|
||||
bool keyboard_enabled;
|
||||
KeyboardKeysRaw keyboard_keys;
|
||||
KeyboardModsRaw keyboard_mods;
|
||||
|
||||
bool debug_pad_enabled;
|
||||
ButtonsRaw debug_pad_buttons;
|
||||
AnalogsRaw debug_pad_analogs;
|
||||
|
||||
std::string motion_device;
|
||||
TouchscreenInput touchscreen;
|
||||
std::atomic_bool is_device_reload_pending{true};
|
||||
std::string udp_input_address;
|
||||
u16 udp_input_port;
|
||||
u8 udp_pad_index;
|
||||
// Audio
|
||||
std::string sink_id;
|
||||
bool enable_audio_stretching;
|
||||
std::string audio_device_id;
|
||||
float volume;
|
||||
|
||||
// Core
|
||||
bool use_multi_core;
|
||||
|
||||
// Data Storage
|
||||
bool use_virtual_sd;
|
||||
bool gamecard_inserted;
|
||||
bool gamecard_current_game;
|
||||
std::string gamecard_path;
|
||||
NANDTotalSize nand_total_size;
|
||||
NANDSystemSize nand_system_size;
|
||||
NANDUserSize nand_user_size;
|
||||
SDMCSize sdmc_size;
|
||||
// Misceallaneous
|
||||
std::string log_filter;
|
||||
bool use_dev_keys;
|
||||
bool use_global_values;
|
||||
|
||||
// Renderer
|
||||
RendererBackend renderer_backend;
|
||||
@@ -454,16 +419,53 @@ struct Values {
|
||||
float bg_green;
|
||||
float bg_blue;
|
||||
|
||||
std::string log_filter;
|
||||
// System
|
||||
bool use_docked_mode;
|
||||
std::optional<u32> rng_seed;
|
||||
// Measured in seconds since epoch
|
||||
std::optional<std::chrono::seconds> custom_rtc;
|
||||
// Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc`
|
||||
std::chrono::seconds custom_rtc_differential;
|
||||
|
||||
bool use_dev_keys;
|
||||
s32 current_user;
|
||||
s32 language_index;
|
||||
s32 region_index;
|
||||
s32 time_zone_index;
|
||||
s32 sound_index;
|
||||
};
|
||||
|
||||
// Audio
|
||||
bool audio_muted;
|
||||
std::string sink_id;
|
||||
bool enable_audio_stretching;
|
||||
std::string audio_device_id;
|
||||
float volume;
|
||||
struct NonSwitchingValues {
|
||||
// Controls
|
||||
std::array<PlayerInput, 10> players;
|
||||
|
||||
bool mouse_enabled;
|
||||
std::string mouse_device;
|
||||
MouseButtonsRaw mouse_buttons;
|
||||
|
||||
bool keyboard_enabled;
|
||||
KeyboardKeysRaw keyboard_keys;
|
||||
KeyboardModsRaw keyboard_mods;
|
||||
|
||||
bool debug_pad_enabled;
|
||||
ButtonsRaw debug_pad_buttons;
|
||||
AnalogsRaw debug_pad_analogs;
|
||||
|
||||
std::string motion_device;
|
||||
TouchscreenInput touchscreen;
|
||||
std::atomic_bool is_device_reload_pending{true};
|
||||
std::string udp_input_address;
|
||||
u16 udp_input_port;
|
||||
u8 udp_pad_index;
|
||||
|
||||
// Data Storage
|
||||
bool use_virtual_sd;
|
||||
bool gamecard_inserted;
|
||||
bool gamecard_current_game;
|
||||
std::string gamecard_path;
|
||||
NANDTotalSize nand_total_size;
|
||||
NANDSystemSize nand_system_size;
|
||||
NANDUserSize nand_user_size;
|
||||
SDMCSize sdmc_size;
|
||||
|
||||
// Debugging
|
||||
bool record_frame_times;
|
||||
@@ -477,7 +479,7 @@ struct Values {
|
||||
bool disable_cpu_opt;
|
||||
bool disable_macro_jit;
|
||||
|
||||
// BCAT
|
||||
// Services
|
||||
std::string bcat_backend;
|
||||
bool bcat_boxcat_local;
|
||||
|
||||
@@ -489,11 +491,9 @@ struct Values {
|
||||
|
||||
// Add-Ons
|
||||
std::map<u64, std::vector<std::string>> disabled_addons;
|
||||
|
||||
// Per-Game Settings
|
||||
bool use_global_values;
|
||||
};
|
||||
|
||||
extern NonSwitchingValues base_values;
|
||||
extern Values global_values;
|
||||
extern Values game_values;
|
||||
extern Values *values;
|
||||
|
||||
@@ -116,7 +116,7 @@ u64 RegenerateTelemetryId() {
|
||||
|
||||
bool VerifyLogin(const std::string& username, const std::string& token) {
|
||||
#ifdef ENABLE_WEB_SERVICE
|
||||
return WebService::VerifyLogin(Settings::values->web_api_url, username, token);
|
||||
return WebService::VerifyLogin(Settings::base_values.web_api_url, username, token);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
@@ -133,14 +133,15 @@ TelemetrySession::~TelemetrySession() {
|
||||
|
||||
#ifdef ENABLE_WEB_SERVICE
|
||||
auto backend = std::make_unique<WebService::TelemetryJson>(
|
||||
Settings::values->web_api_url, Settings::values->yuzu_username, Settings::values->yuzu_token);
|
||||
Settings::base_values.web_api_url, Settings::base_values.yuzu_username,
|
||||
Settings::base_values.yuzu_token);
|
||||
#else
|
||||
auto backend = std::make_unique<Telemetry::NullVisitor>();
|
||||
#endif
|
||||
|
||||
// Complete the session, submitting to the web service backend if necessary
|
||||
field_collection.Accept(*backend);
|
||||
if (Settings::values->enable_telemetry) {
|
||||
if (Settings::base_values.enable_telemetry) {
|
||||
backend->Complete();
|
||||
}
|
||||
}
|
||||
@@ -208,7 +209,8 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) {
|
||||
bool TelemetrySession::SubmitTestcase() {
|
||||
#ifdef ENABLE_WEB_SERVICE
|
||||
auto backend = std::make_unique<WebService::TelemetryJson>(
|
||||
Settings::values->web_api_url, Settings::values->yuzu_username, Settings::values->yuzu_token);
|
||||
Settings::base_values.web_api_url, Settings::base_values.yuzu_username,
|
||||
Settings::base_values.yuzu_token);
|
||||
field_collection.Accept(*backend);
|
||||
return backend->SubmitTestcase();
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user