2024-02-23 21:32:32 +00:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2023-08-14 17:17:01 +00:00
|
|
|
|
|
|
|
#include <fstream>
|
|
|
|
#include <string>
|
2023-10-26 20:29:05 +00:00
|
|
|
#include <fmt/core.h>
|
2023-11-05 11:22:18 +00:00
|
|
|
#include <toml.hpp>
|
2024-02-23 21:32:32 +00:00
|
|
|
#include "config.h"
|
2023-08-14 17:17:01 +00:00
|
|
|
|
|
|
|
namespace Config {
|
|
|
|
|
2024-05-26 22:07:46 +00:00
|
|
|
static bool isNeo = false;
|
2024-06-10 11:04:59 +00:00
|
|
|
static bool isFullscreen = false;
|
2024-05-26 22:07:46 +00:00
|
|
|
static u32 screenWidth = 1280;
|
|
|
|
static u32 screenHeight = 720;
|
|
|
|
static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select
|
|
|
|
static std::string logFilter;
|
2024-07-30 21:32:40 +00:00
|
|
|
static std::string logType = "async";
|
2024-05-26 22:07:46 +00:00
|
|
|
static bool isDebugDump = false;
|
|
|
|
static bool isLibc = true;
|
2024-07-07 19:30:52 +00:00
|
|
|
static bool isShowSplash = false;
|
2024-05-26 22:07:46 +00:00
|
|
|
static bool isNullGpu = false;
|
|
|
|
static bool shouldDumpShaders = false;
|
2024-06-01 20:50:03 +00:00
|
|
|
static bool shouldDumpPM4 = false;
|
2024-07-28 13:54:09 +00:00
|
|
|
static u32 vblankDivider = 1;
|
2024-06-07 07:12:43 +00:00
|
|
|
static bool vkValidation = false;
|
|
|
|
static bool vkValidationSync = false;
|
2024-07-28 13:54:09 +00:00
|
|
|
static bool rdocEnable = false;
|
2024-06-11 02:42:21 +00:00
|
|
|
// Gui
|
|
|
|
std::string settings_install_dir = "";
|
|
|
|
u32 main_window_geometry_x = 400;
|
|
|
|
u32 main_window_geometry_y = 400;
|
|
|
|
u32 main_window_geometry_w = 1280;
|
|
|
|
u32 main_window_geometry_h = 720;
|
|
|
|
u32 mw_themes = 0;
|
|
|
|
u32 m_icon_size = 36;
|
|
|
|
u32 m_icon_size_grid = 69;
|
|
|
|
u32 m_slider_pos = 0;
|
|
|
|
u32 m_slider_pos_grid = 0;
|
|
|
|
u32 m_table_mode = 0;
|
|
|
|
u32 m_window_size_W = 1280;
|
|
|
|
u32 m_window_size_H = 720;
|
|
|
|
std::vector<std::string> m_pkg_viewer;
|
|
|
|
std::vector<std::string> m_elf_viewer;
|
|
|
|
std::vector<std::string> m_recent_files;
|
2024-08-09 08:58:42 +00:00
|
|
|
// Settings
|
|
|
|
u32 m_language = 1; // english
|
2023-08-14 17:17:01 +00:00
|
|
|
|
2024-03-25 07:26:59 +00:00
|
|
|
bool isLleLibc() {
|
|
|
|
return isLibc;
|
|
|
|
}
|
2024-06-09 10:25:00 +00:00
|
|
|
|
2024-02-23 20:57:57 +00:00
|
|
|
bool isNeoMode() {
|
|
|
|
return isNeo;
|
|
|
|
}
|
2024-02-27 22:10:34 +00:00
|
|
|
|
2024-06-09 10:25:00 +00:00
|
|
|
bool isFullscreenMode() {
|
|
|
|
return isFullscreen;
|
|
|
|
}
|
|
|
|
|
2024-02-23 20:57:57 +00:00
|
|
|
u32 getScreenWidth() {
|
|
|
|
return screenWidth;
|
|
|
|
}
|
2024-02-27 22:10:34 +00:00
|
|
|
|
2024-02-23 20:57:57 +00:00
|
|
|
u32 getScreenHeight() {
|
|
|
|
return screenHeight;
|
|
|
|
}
|
2024-02-27 22:10:34 +00:00
|
|
|
|
2024-04-29 21:19:12 +00:00
|
|
|
s32 getGpuId() {
|
2024-04-27 23:19:04 +00:00
|
|
|
return gpuId;
|
|
|
|
}
|
|
|
|
|
2024-02-27 22:10:34 +00:00
|
|
|
std::string getLogFilter() {
|
|
|
|
return logFilter;
|
2024-02-23 20:57:57 +00:00
|
|
|
}
|
2023-08-16 07:34:04 +00:00
|
|
|
|
2024-03-11 12:06:39 +00:00
|
|
|
std::string getLogType() {
|
|
|
|
return logType;
|
|
|
|
}
|
|
|
|
|
2024-03-11 11:26:33 +00:00
|
|
|
bool debugDump() {
|
|
|
|
return isDebugDump;
|
|
|
|
}
|
|
|
|
|
2024-05-16 13:58:14 +00:00
|
|
|
bool showSplash() {
|
|
|
|
return isShowSplash;
|
|
|
|
}
|
|
|
|
|
2024-05-22 18:19:42 +00:00
|
|
|
bool nullGpu() {
|
|
|
|
return isNullGpu;
|
|
|
|
}
|
|
|
|
|
2024-05-26 22:07:46 +00:00
|
|
|
bool dumpShaders() {
|
|
|
|
return shouldDumpShaders;
|
|
|
|
}
|
|
|
|
|
2024-06-01 20:50:03 +00:00
|
|
|
bool dumpPM4() {
|
|
|
|
return shouldDumpPM4;
|
|
|
|
}
|
|
|
|
|
2024-07-28 13:54:09 +00:00
|
|
|
bool isRdocEnabled() {
|
|
|
|
return rdocEnable;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 vblankDiv() {
|
|
|
|
return vblankDivider;
|
|
|
|
}
|
|
|
|
|
2024-06-07 07:12:43 +00:00
|
|
|
bool vkValidationEnabled() {
|
|
|
|
return vkValidation;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool vkValidationSyncEnabled() {
|
|
|
|
return vkValidationSync;
|
|
|
|
}
|
|
|
|
|
2024-06-11 02:42:21 +00:00
|
|
|
void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) {
|
|
|
|
main_window_geometry_x = x;
|
|
|
|
main_window_geometry_y = y;
|
|
|
|
main_window_geometry_w = w;
|
|
|
|
main_window_geometry_h = h;
|
|
|
|
}
|
|
|
|
void setGameInstallDir(const std::string& dir) {
|
|
|
|
settings_install_dir = dir;
|
|
|
|
}
|
|
|
|
void setMainWindowTheme(u32 theme) {
|
|
|
|
mw_themes = theme;
|
|
|
|
}
|
|
|
|
void setIconSize(u32 size) {
|
|
|
|
m_icon_size = size;
|
|
|
|
}
|
|
|
|
void setIconSizeGrid(u32 size) {
|
|
|
|
m_icon_size_grid = size;
|
|
|
|
}
|
|
|
|
void setSliderPositon(u32 pos) {
|
|
|
|
m_slider_pos = pos;
|
|
|
|
}
|
|
|
|
void setSliderPositonGrid(u32 pos) {
|
|
|
|
m_slider_pos_grid = pos;
|
|
|
|
}
|
|
|
|
void setTableMode(u32 mode) {
|
|
|
|
m_table_mode = mode;
|
|
|
|
}
|
|
|
|
void setMainWindowWidth(u32 width) {
|
|
|
|
m_window_size_W = width;
|
|
|
|
}
|
|
|
|
void setMainWindowHeight(u32 height) {
|
|
|
|
m_window_size_H = height;
|
|
|
|
}
|
|
|
|
void setPkgViewer(std::vector<std::string> pkgList) {
|
|
|
|
m_pkg_viewer.resize(pkgList.size());
|
|
|
|
m_pkg_viewer = pkgList;
|
|
|
|
}
|
|
|
|
void setElfViewer(std::vector<std::string> elfList) {
|
|
|
|
m_elf_viewer.resize(elfList.size());
|
|
|
|
m_elf_viewer = elfList;
|
|
|
|
}
|
|
|
|
void setRecentFiles(std::vector<std::string> recentFiles) {
|
|
|
|
m_recent_files.resize(recentFiles.size());
|
|
|
|
m_recent_files = recentFiles;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 getMainWindowGeometryX() {
|
|
|
|
return main_window_geometry_x;
|
|
|
|
}
|
|
|
|
u32 getMainWindowGeometryY() {
|
|
|
|
return main_window_geometry_y;
|
|
|
|
}
|
|
|
|
u32 getMainWindowGeometryW() {
|
|
|
|
return main_window_geometry_w;
|
|
|
|
}
|
|
|
|
u32 getMainWindowGeometryH() {
|
|
|
|
return main_window_geometry_h;
|
|
|
|
}
|
|
|
|
std::string getGameInstallDir() {
|
|
|
|
return settings_install_dir;
|
|
|
|
}
|
|
|
|
u32 getMainWindowTheme() {
|
|
|
|
return mw_themes;
|
|
|
|
}
|
|
|
|
u32 getIconSize() {
|
|
|
|
return m_icon_size;
|
|
|
|
}
|
|
|
|
u32 getIconSizeGrid() {
|
|
|
|
return m_icon_size_grid;
|
|
|
|
}
|
|
|
|
u32 getSliderPositon() {
|
|
|
|
return m_slider_pos;
|
|
|
|
}
|
|
|
|
u32 getSliderPositonGrid() {
|
|
|
|
return m_slider_pos_grid;
|
|
|
|
}
|
|
|
|
u32 getTableMode() {
|
|
|
|
return m_table_mode;
|
|
|
|
}
|
|
|
|
u32 getMainWindowWidth() {
|
|
|
|
return m_window_size_W;
|
|
|
|
}
|
|
|
|
u32 getMainWindowHeight() {
|
|
|
|
return m_window_size_H;
|
|
|
|
}
|
|
|
|
std::vector<std::string> getPkgViewer() {
|
|
|
|
return m_pkg_viewer;
|
|
|
|
}
|
|
|
|
std::vector<std::string> getElfViewer() {
|
|
|
|
return m_elf_viewer;
|
|
|
|
}
|
|
|
|
std::vector<std::string> getRecentFiles() {
|
|
|
|
return m_recent_files;
|
|
|
|
}
|
|
|
|
|
2024-08-09 08:58:42 +00:00
|
|
|
u32 GetLanguage() {
|
|
|
|
return m_language;
|
|
|
|
}
|
2023-08-14 17:17:01 +00:00
|
|
|
void load(const std::filesystem::path& path) {
|
|
|
|
// If the configuration file does not exist, create it and return
|
|
|
|
std::error_code error;
|
|
|
|
if (!std::filesystem::exists(path, error)) {
|
|
|
|
save(path);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
toml::value data;
|
|
|
|
|
|
|
|
try {
|
|
|
|
data = toml::parse(path);
|
|
|
|
} catch (std::exception& ex) {
|
2023-10-26 20:29:05 +00:00
|
|
|
fmt::print("Got exception trying to load config file. Exception: {}\n", ex.what());
|
2023-08-14 17:17:01 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (data.contains("General")) {
|
2024-08-05 16:27:03 +00:00
|
|
|
const toml::value& general = data.at("General");
|
|
|
|
|
|
|
|
isNeo = toml::find_or<bool>(general, "isPS4Pro", false);
|
|
|
|
isFullscreen = toml::find_or<bool>(general, "Fullscreen", false);
|
|
|
|
logFilter = toml::find_or<std::string>(general, "logFilter", "");
|
|
|
|
logType = toml::find_or<std::string>(general, "logType", "sync");
|
|
|
|
isShowSplash = toml::find_or<bool>(general, "showSplash", true);
|
2023-08-16 07:34:04 +00:00
|
|
|
}
|
2024-08-05 16:27:03 +00:00
|
|
|
|
2023-08-16 07:34:04 +00:00
|
|
|
if (data.contains("GPU")) {
|
2024-08-05 16:27:03 +00:00
|
|
|
const toml::value& gpu = data.at("GPU");
|
|
|
|
|
|
|
|
screenWidth = toml::find_or<int>(gpu, "screenWidth", screenWidth);
|
|
|
|
screenHeight = toml::find_or<int>(gpu, "screenHeight", screenHeight);
|
|
|
|
isNullGpu = toml::find_or<bool>(gpu, "nullGpu", false);
|
|
|
|
shouldDumpShaders = toml::find_or<bool>(gpu, "dumpShaders", false);
|
|
|
|
shouldDumpPM4 = toml::find_or<bool>(gpu, "dumpPM4", false);
|
|
|
|
vblankDivider = toml::find_or<int>(gpu, "vblankDivider", 1);
|
2023-08-14 17:17:01 +00:00
|
|
|
}
|
2024-08-05 16:27:03 +00:00
|
|
|
|
2024-06-07 07:12:43 +00:00
|
|
|
if (data.contains("Vulkan")) {
|
2024-08-05 16:27:03 +00:00
|
|
|
const toml::value& vk = data.at("Vulkan");
|
|
|
|
|
|
|
|
gpuId = toml::find_or<int>(vk, "gpuId", -1);
|
|
|
|
vkValidation = toml::find_or<bool>(vk, "validation", false);
|
|
|
|
vkValidationSync = toml::find_or<bool>(vk, "validation_sync", false);
|
|
|
|
rdocEnable = toml::find_or<bool>(vk, "rdocEnable", false);
|
2024-06-07 07:12:43 +00:00
|
|
|
}
|
2024-08-05 16:27:03 +00:00
|
|
|
|
2024-03-11 11:26:33 +00:00
|
|
|
if (data.contains("Debug")) {
|
2024-08-05 16:27:03 +00:00
|
|
|
const toml::value& debug = data.at("Debug");
|
2024-03-11 11:26:33 +00:00
|
|
|
|
2024-08-05 16:27:03 +00:00
|
|
|
isDebugDump = toml::find_or<bool>(debug, "DebugDump", false);
|
2024-03-11 11:26:33 +00:00
|
|
|
}
|
2024-08-05 16:27:03 +00:00
|
|
|
|
2024-03-25 07:26:59 +00:00
|
|
|
if (data.contains("LLE")) {
|
2024-08-05 16:27:03 +00:00
|
|
|
const toml::value& lle = data.at("LLE");
|
2024-03-25 07:26:59 +00:00
|
|
|
|
2024-08-05 16:27:03 +00:00
|
|
|
isLibc = toml::find_or<bool>(lle, "libc", true);
|
2024-03-25 07:26:59 +00:00
|
|
|
}
|
2024-08-05 16:27:03 +00:00
|
|
|
|
2024-06-11 02:42:21 +00:00
|
|
|
if (data.contains("GUI")) {
|
2024-08-05 16:27:03 +00:00
|
|
|
const toml::value& gui = data.at("GUI");
|
|
|
|
|
|
|
|
m_icon_size = toml::find_or<int>(gui, "iconSize", 0);
|
|
|
|
m_icon_size_grid = toml::find_or<int>(gui, "iconSizeGrid", 0);
|
|
|
|
m_slider_pos = toml::find_or<int>(gui, "sliderPos", 0);
|
|
|
|
m_slider_pos_grid = toml::find_or<int>(gui, "sliderPosGrid", 0);
|
|
|
|
mw_themes = toml::find_or<int>(gui, "theme", 0);
|
|
|
|
m_window_size_W = toml::find_or<int>(gui, "mw_width", 0);
|
|
|
|
m_window_size_H = toml::find_or<int>(gui, "mw_height", 0);
|
|
|
|
settings_install_dir = toml::find_or<std::string>(gui, "installDir", "");
|
|
|
|
main_window_geometry_x = toml::find_or<int>(gui, "geometry_x", 0);
|
|
|
|
main_window_geometry_y = toml::find_or<int>(gui, "geometry_y", 0);
|
|
|
|
main_window_geometry_w = toml::find_or<int>(gui, "geometry_w", 0);
|
|
|
|
main_window_geometry_h = toml::find_or<int>(gui, "geometry_h", 0);
|
|
|
|
m_pkg_viewer = toml::find_or<std::vector<std::string>>(gui, "pkgDirs", {});
|
|
|
|
m_elf_viewer = toml::find_or<std::vector<std::string>>(gui, "elfDirs", {});
|
|
|
|
m_recent_files = toml::find_or<std::vector<std::string>>(gui, "recentFiles", {});
|
|
|
|
m_table_mode = toml::find_or<int>(gui, "gameTableMode", 0);
|
2024-06-11 02:42:21 +00:00
|
|
|
}
|
2024-08-09 08:58:42 +00:00
|
|
|
|
|
|
|
if (data.contains("Settings")) {
|
|
|
|
const toml::value& settings = data.at("Settings");
|
|
|
|
|
2024-08-09 09:24:42 +00:00
|
|
|
m_language = toml::find_or<int>(settings, "consoleLanguage", 1);
|
2024-08-09 08:58:42 +00:00
|
|
|
}
|
2023-08-14 17:17:01 +00:00
|
|
|
}
|
|
|
|
void save(const std::filesystem::path& path) {
|
2024-08-05 16:27:03 +00:00
|
|
|
toml::value data;
|
2023-08-14 17:17:01 +00:00
|
|
|
|
|
|
|
std::error_code error;
|
|
|
|
if (std::filesystem::exists(path, error)) {
|
|
|
|
try {
|
2024-08-05 16:27:03 +00:00
|
|
|
data = toml::parse(path);
|
2023-08-14 17:17:01 +00:00
|
|
|
} catch (const std::exception& ex) {
|
2023-10-26 20:29:05 +00:00
|
|
|
fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what());
|
2023-08-14 17:17:01 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (error) {
|
2024-02-23 20:57:57 +00:00
|
|
|
fmt::print("Filesystem error accessing {} (error: {})\n", path.string(),
|
|
|
|
error.message().c_str());
|
2023-08-14 17:17:01 +00:00
|
|
|
}
|
2023-10-26 20:29:05 +00:00
|
|
|
fmt::print("Saving new configuration file {}\n", path.string());
|
2023-08-14 17:17:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
data["General"]["isPS4Pro"] = isNeo;
|
2024-06-09 10:25:00 +00:00
|
|
|
data["General"]["Fullscreen"] = isFullscreen;
|
2024-02-27 22:10:34 +00:00
|
|
|
data["General"]["logFilter"] = logFilter;
|
2024-03-11 12:06:39 +00:00
|
|
|
data["General"]["logType"] = logType;
|
2024-05-16 13:58:14 +00:00
|
|
|
data["General"]["showSplash"] = isShowSplash;
|
2023-08-16 07:34:04 +00:00
|
|
|
data["GPU"]["screenWidth"] = screenWidth;
|
|
|
|
data["GPU"]["screenHeight"] = screenHeight;
|
2024-05-22 18:19:42 +00:00
|
|
|
data["GPU"]["nullGpu"] = isNullGpu;
|
2024-05-26 22:07:46 +00:00
|
|
|
data["GPU"]["dumpShaders"] = shouldDumpShaders;
|
2024-06-01 20:50:03 +00:00
|
|
|
data["GPU"]["dumpPM4"] = shouldDumpPM4;
|
2024-07-28 13:54:09 +00:00
|
|
|
data["GPU"]["vblankDivider"] = vblankDivider;
|
|
|
|
data["Vulkan"]["gpuId"] = gpuId;
|
2024-06-07 07:12:43 +00:00
|
|
|
data["Vulkan"]["validation"] = vkValidation;
|
|
|
|
data["Vulkan"]["validation_sync"] = vkValidationSync;
|
2024-07-28 13:54:09 +00:00
|
|
|
data["Vulkan"]["rdocEnable"] = rdocEnable;
|
2024-03-11 11:26:33 +00:00
|
|
|
data["Debug"]["DebugDump"] = isDebugDump;
|
2024-03-25 07:26:59 +00:00
|
|
|
data["LLE"]["libc"] = isLibc;
|
2024-06-11 02:42:21 +00:00
|
|
|
data["GUI"]["theme"] = mw_themes;
|
|
|
|
data["GUI"]["iconSize"] = m_icon_size;
|
|
|
|
data["GUI"]["sliderPos"] = m_slider_pos;
|
|
|
|
data["GUI"]["iconSizeGrid"] = m_icon_size_grid;
|
|
|
|
data["GUI"]["sliderPosGrid"] = m_slider_pos_grid;
|
|
|
|
data["GUI"]["gameTableMode"] = m_table_mode;
|
|
|
|
data["GUI"]["mw_width"] = m_window_size_W;
|
|
|
|
data["GUI"]["mw_height"] = m_window_size_H;
|
|
|
|
data["GUI"]["installDir"] = settings_install_dir;
|
|
|
|
data["GUI"]["geometry_x"] = main_window_geometry_x;
|
|
|
|
data["GUI"]["geometry_y"] = main_window_geometry_y;
|
|
|
|
data["GUI"]["geometry_w"] = main_window_geometry_w;
|
|
|
|
data["GUI"]["geometry_h"] = main_window_geometry_h;
|
|
|
|
data["GUI"]["pkgDirs"] = m_pkg_viewer;
|
|
|
|
data["GUI"]["elfDirs"] = m_elf_viewer;
|
|
|
|
data["GUI"]["recentFiles"] = m_recent_files;
|
2023-08-14 17:17:01 +00:00
|
|
|
|
2024-08-09 09:24:42 +00:00
|
|
|
data["Settings"]["consoleLanguage"] = m_language;
|
2024-08-09 08:58:42 +00:00
|
|
|
|
2023-08-14 17:17:01 +00:00
|
|
|
std::ofstream file(path, std::ios::out);
|
|
|
|
file << data;
|
|
|
|
file.close();
|
|
|
|
}
|
2024-02-23 20:57:57 +00:00
|
|
|
} // namespace Config
|