summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/GraphicsModSystem
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/GraphicsModSystem')
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.cpp22
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.cpp78
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.h13
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.cpp2
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.h2
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.cpp2
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.h2
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.cpp2
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.h2
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h5
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h8
-rw-r--r--Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.cpp14
12 files changed, 73 insertions, 79 deletions
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.cpp
index e3cf5b9a10..c0fa1f82ca 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.cpp
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.cpp
@@ -10,6 +10,7 @@
#include <picojson.h>
#include "Common/CommonPaths.h"
+#include "Common/FileSearch.h"
#include "Common/FileUtil.h"
#include "Common/JsonUtil.h"
#include "Common/Logging/Log.h"
@@ -84,13 +85,22 @@ void GraphicsModGroupConfig::Load()
const auto try_add_mod = [&known_paths, this](const std::string& dir,
GraphicsModConfig::Source source) {
- auto file = dir + DIR_SEP + "metadata.json";
- UnifyPathSeparators(file);
- if (known_paths.contains(file))
- return;
+ const auto files = Common::DoFileSearch(dir, ".json", true);
+ for (const auto& file : files)
+ {
+ std::string basename;
+ SplitPath(file, nullptr, &basename, nullptr);
+ if (basename == "metadata")
+ {
+ auto file_copy = file;
+ UnifyPathSeparators(file_copy);
+ if (known_paths.contains(file_copy))
+ return;
- if (auto mod = GraphicsModConfig::Create(file, source))
- m_graphics_mods.push_back(std::move(*mod));
+ if (auto mod = GraphicsModConfig::Create(file_copy, source))
+ m_graphics_mods.push_back(std::move(*mod));
+ }
+ }
};
const std::set<std::string> graphics_mod_user_directories =
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.cpp
index 4e22d5b3f8..35c8ce0a25 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.cpp
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.cpp
@@ -3,7 +3,11 @@
#include "VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.h"
+#include "Common/JsonUtil.h"
#include "Common/Logging/Log.h"
+#include "Core/System.h"
+
+#include "VideoCommon/Resources/CustomResourceManager.h"
std::unique_ptr<CustomPipelineAction>
CustomPipelineAction::Create(std::shared_ptr<VideoCommon::CustomAssetLibrary> library)
@@ -15,58 +19,16 @@ std::unique_ptr<CustomPipelineAction>
CustomPipelineAction::Create(const picojson::value& json_data,
std::shared_ptr<VideoCommon::CustomAssetLibrary> library)
{
- std::vector<CustomPipelineAction::PipelinePassPassDescription> pipeline_passes;
-
- const auto& passes_json = json_data.get("passes");
- if (passes_json.is<picojson::array>())
- {
- for (const auto& passes_json_val : passes_json.get<picojson::array>())
- {
- CustomPipelineAction::PipelinePassPassDescription pipeline_pass;
- if (!passes_json_val.is<picojson::object>())
- {
- ERROR_LOG_FMT(VIDEO,
- "Failed to load custom pipeline action, 'passes' has an array value that "
- "is not an object!");
- return nullptr;
- }
-
- auto pass = passes_json_val.get<picojson::object>();
- if (!pass.contains("pixel_material_asset"))
- {
- ERROR_LOG_FMT(VIDEO,
- "Failed to load custom pipeline action, 'passes' value missing required "
- "field 'pixel_material_asset'");
- return nullptr;
- }
+ auto material_asset = ReadStringFromJson(json_data.get<picojson::object>(), "material_asset");
- auto pixel_material_asset_json = pass["pixel_material_asset"];
- if (!pixel_material_asset_json.is<std::string>())
- {
- ERROR_LOG_FMT(VIDEO, "Failed to load custom pipeline action, 'passes' field "
- "'pixel_material_asset' is not a string!");
- return nullptr;
- }
- pipeline_pass.m_pixel_material_asset = pixel_material_asset_json.to_str();
- pipeline_passes.push_back(std::move(pipeline_pass));
- }
- }
-
- if (pipeline_passes.empty())
+ if (!material_asset)
{
- ERROR_LOG_FMT(VIDEO, "Failed to load custom pipeline action, must specify at least one pass");
+ ERROR_LOG_FMT(VIDEO,
+ "Failed to load custom pipeline action, 'material_asset' does not have a value");
return nullptr;
}
- if (pipeline_passes.size() > 1)
- {
- ERROR_LOG_FMT(
- VIDEO,
- "Failed to load custom pipeline action, multiple passes are not currently supported");
- return nullptr;
- }
-
- return std::make_unique<CustomPipelineAction>(std::move(library), std::move(pipeline_passes));
+ return std::make_unique<CustomPipelineAction>(std::move(library), std::move(*material_asset));
}
CustomPipelineAction::CustomPipelineAction(std::shared_ptr<VideoCommon::CustomAssetLibrary> library)
@@ -74,14 +36,26 @@ CustomPipelineAction::CustomPipelineAction(std::shared_ptr<VideoCommon::CustomAs
{
}
-CustomPipelineAction::CustomPipelineAction(
- std::shared_ptr<VideoCommon::CustomAssetLibrary> library,
- std::vector<PipelinePassPassDescription> pass_descriptions)
- : m_library(std::move(library)), m_passes_config(std::move(pass_descriptions))
+CustomPipelineAction::CustomPipelineAction(std::shared_ptr<VideoCommon::CustomAssetLibrary> library,
+ std::string material_asset)
+ : m_library(std::move(library)), m_material_asset(std::move(material_asset))
{
- m_pipeline_passes.resize(m_passes_config.size());
}
void CustomPipelineAction::OnDrawStarted(GraphicsModActionData::DrawStarted*)
{
+ // TODO
+}
+
+void CustomPipelineAction::AfterEFB(GraphicsModActionData::PostEFB* post_efb)
+{
+ if (!post_efb) [[unlikely]]
+ return;
+
+ if (m_material_asset.empty())
+ return;
+
+ auto& resource_manager = Core::System::GetInstance().GetCustomResourceManager();
+ post_efb->material =
+ resource_manager.GetPostProcessingMaterialFromAsset(m_material_asset, m_library);
}
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.h
index 99026b99ce..d03ccd4a6e 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.h
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/CustomPipelineAction.h
@@ -6,22 +6,15 @@
#include <memory>
#include <string>
#include <string_view>
-#include <vector>
#include <picojson.h>
#include "VideoCommon/Assets/CustomAssetLibrary.h"
-#include "VideoCommon/GraphicsModSystem/Runtime/CustomPipeline.h"
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h"
class CustomPipelineAction final : public GraphicsModAction
{
public:
- struct PipelinePassPassDescription
- {
- std::string m_pixel_material_asset;
- };
-
static constexpr std::string_view factory_name = "custom_pipeline";
static std::unique_ptr<CustomPipelineAction>
Create(const picojson::value& json_data,
@@ -30,11 +23,11 @@ public:
Create(std::shared_ptr<VideoCommon::CustomAssetLibrary> library);
explicit CustomPipelineAction(std::shared_ptr<VideoCommon::CustomAssetLibrary> library);
CustomPipelineAction(std::shared_ptr<VideoCommon::CustomAssetLibrary> library,
- std::vector<PipelinePassPassDescription> pass_descriptions);
+ std::string material_asset);
void OnDrawStarted(GraphicsModActionData::DrawStarted*) override;
+ void AfterEFB(GraphicsModActionData::PostEFB*) override;
private:
std::shared_ptr<VideoCommon::CustomAssetLibrary> m_library;
- std::vector<PipelinePassPassDescription> m_passes_config;
- std::vector<CustomPipeline> m_pipeline_passes;
+ std::string m_material_asset;
};
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.cpp
index 1bd288512c..ca50a9a430 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.cpp
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.cpp
@@ -10,7 +10,7 @@ void PrintAction::OnDrawStarted(GraphicsModActionData::DrawStarted*)
INFO_LOG_FMT(VIDEO, "OnDrawStarted Called");
}
-void PrintAction::OnEFB(GraphicsModActionData::EFB* efb)
+void PrintAction::BeforeEFB(GraphicsModActionData::PreEFB* efb)
{
if (!efb) [[unlikely]]
return;
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.h
index 82a21c152f..55bd694a6e 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.h
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.h
@@ -12,7 +12,7 @@ class PrintAction final : public GraphicsModAction
public:
static constexpr std::string_view factory_name = "print";
void OnDrawStarted(GraphicsModActionData::DrawStarted*) override;
- void OnEFB(GraphicsModActionData::EFB*) override;
+ void BeforeEFB(GraphicsModActionData::PreEFB*) override;
void OnProjection(GraphicsModActionData::Projection*) override;
void OnProjectionAndTexture(GraphicsModActionData::Projection*) override;
void OnTextureLoad(GraphicsModActionData::TextureLoad*) override;
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.cpp
index 305cd8b737..6db08b8351 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.cpp
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.cpp
@@ -30,7 +30,7 @@ ScaleAction::ScaleAction(Common::Vec3 scale) : m_scale(scale)
{
}
-void ScaleAction::OnEFB(GraphicsModActionData::EFB* efb)
+void ScaleAction::BeforeEFB(GraphicsModActionData::PreEFB* efb)
{
if (!efb) [[unlikely]]
return;
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.h
index 4673ed2d18..2ed9d71393 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.h
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.h
@@ -16,7 +16,7 @@ public:
static constexpr std::string_view factory_name = "scale";
static std::unique_ptr<ScaleAction> Create(const picojson::value& json_data);
explicit ScaleAction(Common::Vec3 scale);
- void OnEFB(GraphicsModActionData::EFB*) override;
+ void BeforeEFB(GraphicsModActionData::PreEFB*) override;
void OnProjection(GraphicsModActionData::Projection*) override;
void OnProjectionAndTexture(GraphicsModActionData::Projection*) override;
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.cpp
index b693fef4f7..3473826fc5 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.cpp
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.cpp
@@ -14,7 +14,7 @@ void SkipAction::OnDrawStarted(GraphicsModActionData::DrawStarted* draw_started)
*draw_started->skip = true;
}
-void SkipAction::OnEFB(GraphicsModActionData::EFB* efb)
+void SkipAction::BeforeEFB(GraphicsModActionData::PreEFB* efb)
{
if (!efb) [[unlikely]]
return;
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.h
index 8cda643c5a..df397802ae 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.h
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.h
@@ -10,5 +10,5 @@ class SkipAction final : public GraphicsModAction
public:
static constexpr std::string_view factory_name = "skip";
void OnDrawStarted(GraphicsModActionData::DrawStarted*) override;
- void OnEFB(GraphicsModActionData::EFB*) override;
+ void BeforeEFB(GraphicsModActionData::PreEFB*) override;
};
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h
index 04a371a73e..5719d550fe 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h
@@ -16,8 +16,9 @@ public:
GraphicsModAction& operator=(GraphicsModAction&&) = default;
virtual void OnDrawStarted(GraphicsModActionData::DrawStarted*) {}
- virtual void OnEFB(GraphicsModActionData::EFB*) {}
- virtual void OnXFB() {}
+ virtual void BeforeEFB(GraphicsModActionData::PreEFB*) {}
+ virtual void AfterEFB(GraphicsModActionData::PostEFB*) {}
+ virtual void BeforeXFB() {}
virtual void OnProjection(GraphicsModActionData::Projection*) {}
virtual void OnProjectionAndTexture(GraphicsModActionData::Projection*) {}
virtual void OnTextureLoad(GraphicsModActionData::TextureLoad*) {}
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h
index a4e883ffc2..e82c87e0e4 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h
@@ -12,6 +12,7 @@
#include "Common/Matrix.h"
#include "Common/SmallVector.h"
#include "VideoCommon/Assets/TextureAsset.h"
+#include "VideoCommon/Resources/MaterialResource.h"
#include "VideoCommon/ShaderGenCommon.h"
namespace GraphicsModActionData
@@ -24,7 +25,7 @@ struct DrawStarted
std::span<u8>* material_uniform_buffer;
};
-struct EFB
+struct PreEFB
{
u32 texture_width;
u32 texture_height;
@@ -33,6 +34,11 @@ struct EFB
u32* scaled_height;
};
+struct PostEFB
+{
+ VideoCommon::MaterialResource* material = nullptr;
+};
+
struct Projection
{
Common::Matrix44* matrix;
diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.cpp
index 79f19fe325..5f9cf48d52 100644
--- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.cpp
+++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.cpp
@@ -7,6 +7,7 @@
#include <string_view>
#include <variant>
+#include "Common/FileUtil.h"
#include "Common/Logging/Log.h"
#include "Common/StringUtil.h"
#include "Common/VariantUtil.h"
@@ -17,6 +18,7 @@
#include "VideoCommon/GraphicsModSystem/Config/GraphicsMod.h"
#include "VideoCommon/GraphicsModSystem/Config/GraphicsModAsset.h"
#include "VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.h"
+#include "VideoCommon/GraphicsModSystem/Constants.h"
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionFactory.h"
#include "VideoCommon/VideoConfig.h"
#include "VideoCommon/VideoEvents.h"
@@ -36,11 +38,17 @@ public:
return;
m_action_impl->OnDrawStarted(draw_started);
}
- void OnEFB(GraphicsModActionData::EFB* efb) override
+ void BeforeEFB(GraphicsModActionData::PreEFB* efb) override
{
if (!m_mod.m_enabled)
return;
- m_action_impl->OnEFB(efb);
+ m_action_impl->BeforeEFB(efb);
+ }
+ void AfterEFB(GraphicsModActionData::PostEFB* efb) override
+ {
+ if (!m_mod.m_enabled)
+ return;
+ m_action_impl->AfterEFB(efb);
}
void OnProjection(GraphicsModActionData::Projection* projection) override
{
@@ -191,6 +199,8 @@ void GraphicsModManager::Load(const GraphicsModGroupConfig& config)
const auto& mods = config.GetMods();
auto filesystem_library = std::make_shared<VideoCommon::DirectFilesystemAssetLibrary>();
+ filesystem_library->Watch(File::GetSysDirectory() + DOLPHIN_SYSTEM_GRAPHICS_MOD_DIR);
+ filesystem_library->Watch(File::GetUserPath(D_GRAPHICSMOD_IDX));
std::map<std::string, std::vector<GraphicsTargetConfig>> group_to_targets;
for (const auto& mod : mods)