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:
lat9nq
2020-06-18 21:03:34 -04:00
parent 94fb90596a
commit 2d01d76ae5
39 changed files with 399 additions and 391 deletions

View File

@@ -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;
}

View File

@@ -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));
}
}

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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

View File

@@ -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) {

View File

@@ -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};

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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()), {}};

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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() {

View File

@@ -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;

View File

@@ -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