summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp
diff options
context:
space:
mode:
authoriwubcode <iwubcode@users.noreply.github.com>2022-02-26 00:19:38 -0600
committeriwubcode <iwubcode@users.noreply.github.com>2022-06-27 18:20:52 -0500
commit254246b814124f0f1dff5e1aebd9672c0d1bd492 (patch)
treeaed28905acb212070b6ae93f65959aa11b0ef51f /Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp
parentf92beb611f5e7effc9d1b8a90fbd4004233945ff (diff)
VideoCommon: add logic to read a GraphicsMod from configuration
Diffstat (limited to 'Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp')
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp
new file mode 100644
index 0000000000..753f304cb5
--- /dev/null
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.cpp
@@ -0,0 +1,88 @@
+// Copyright 2022 Dolphin Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "VideoCommon/GraphicsModSystem/Config/GraphicsTargetGroup.h"
+
+#include "Common/Logging/Log.h"
+
+bool GraphicsTargetGroupConfig::DeserializeFromConfig(const picojson::object& obj)
+{
+ if (auto name_iter = obj.find("name"); name_iter != obj.end())
+ {
+ if (!name_iter->second.is<std::string>())
+ {
+ ERROR_LOG_FMT(
+ VIDEO, "Failed to load mod configuration file, specified group's name is not a string");
+ return false;
+ }
+ m_name = name_iter->second.get<std::string>();
+ }
+
+ if (auto targets_iter = obj.find("targets"); targets_iter != obj.end())
+ {
+ if (!targets_iter->second.is<picojson::array>())
+ {
+ ERROR_LOG_FMT(
+ VIDEO,
+ "Failed to load mod configuration file, specified group's targets is not an array");
+ return false;
+ }
+ for (const auto& target_val : targets_iter->second.get<picojson::array>())
+ {
+ if (!target_val.is<picojson::object>())
+ {
+ ERROR_LOG_FMT(
+ VIDEO,
+ "Failed to load shader configuration file, specified target is not a json object");
+ return false;
+ }
+ const auto target = DeserializeTargetFromConfig(target_val.get<picojson::object>());
+ if (!target)
+ {
+ return false;
+ }
+
+ m_targets.push_back(*target);
+ }
+ }
+
+ return true;
+}
+
+void GraphicsTargetGroupConfig::SerializeToProfile(picojson::object* obj) const
+{
+ if (!obj)
+ return;
+ auto& json_obj = *obj;
+ picojson::array serialized_targets;
+ for (const auto& target : m_targets)
+ {
+ picojson::object serialized_target;
+ SerializeTargetToProfile(&serialized_target, target);
+ serialized_targets.push_back(picojson::value{serialized_target});
+ }
+ json_obj["targets"] = picojson::value{serialized_targets};
+}
+
+void GraphicsTargetGroupConfig::DeserializeFromProfile(const picojson::object& obj)
+{
+ if (const auto it = obj.find("targets"); it != obj.end())
+ {
+ if (it->second.is<picojson::array>())
+ {
+ auto serialized_targets = it->second.get<picojson::array>();
+ if (serialized_targets.size() != m_targets.size())
+ return;
+
+ for (std::size_t i = 0; i < serialized_targets.size(); i++)
+ {
+ const auto& serialized_target_val = serialized_targets[i];
+ if (serialized_target_val.is<picojson::object>())
+ {
+ const auto& serialized_target = serialized_target_val.get<picojson::object>();
+ DeserializeTargetFromProfile(serialized_target, &m_targets[i]);
+ }
+ }
+ }
+ }
+}