refactor(srp): add renderer backend registry seam

This commit is contained in:
2026-04-20 12:47:25 +08:00
parent 59f2249e07
commit 10b092d467
6 changed files with 382 additions and 9 deletions

View File

@@ -4,12 +4,55 @@
#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h"
#include "Rendering/Pipelines/ScriptableRenderPipelineHost.h"
#include <mutex>
#include <unordered_map>
#include <unordered_set>
namespace XCEngine {
namespace Rendering {
namespace Internal {
namespace {
std::shared_ptr<const RenderPipelineAsset>
CreateBuiltinForwardPipelineRendererAsset() {
static const std::shared_ptr<const RenderPipelineAsset>
s_builtinForwardPipelineAsset =
std::make_shared<Pipelines::BuiltinForwardPipelineAsset>();
return s_builtinForwardPipelineAsset;
}
using PipelineRendererAssetRegistry =
std::unordered_map<std::string, PipelineRendererAssetFactory>;
PipelineRendererAssetRegistry& GetPipelineRendererAssetRegistry() {
static PipelineRendererAssetRegistry registry = {};
return registry;
}
std::unordered_set<std::string>& GetBuiltinPipelineRendererAssetKeys() {
static std::unordered_set<std::string> builtinKeys = {};
return builtinKeys;
}
std::mutex& GetPipelineRendererAssetRegistryMutex() {
static std::mutex mutex;
return mutex;
}
void EnsureBuiltinPipelineRendererAssetRegistryInitialized() {
static const bool initialized = []() {
PipelineRendererAssetRegistry& registry =
GetPipelineRendererAssetRegistry();
registry.emplace(
"BuiltinForward",
&CreateBuiltinForwardPipelineRendererAsset);
GetBuiltinPipelineRendererAssetKeys().insert("BuiltinForward");
return true;
}();
(void)initialized;
}
std::unique_ptr<NativeSceneRenderer> TryCreateNativeSceneRendererFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& asset) {
if (asset == nullptr) {
@@ -41,16 +84,64 @@ std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset() {
return std::make_shared<Pipelines::ScriptableRenderPipelineHostAsset>();
}
std::shared_ptr<const RenderPipelineAsset> CreatePipelineRendererAssetByKey(
const std::string& key) {
if (key == "BuiltinForward") {
static const std::shared_ptr<const RenderPipelineAsset>
s_builtinForwardPipelineAsset =
std::make_shared<Pipelines::BuiltinForwardPipelineAsset>();
return s_builtinForwardPipelineAsset;
bool RegisterPipelineRendererAssetFactory(
const std::string& key,
PipelineRendererAssetFactory factory) {
if (key.empty() || !factory) {
return false;
}
return nullptr;
EnsureBuiltinPipelineRendererAssetRegistryInitialized();
std::lock_guard<std::mutex> lock(
GetPipelineRendererAssetRegistryMutex());
PipelineRendererAssetRegistry& registry =
GetPipelineRendererAssetRegistry();
if (registry.find(key) != registry.end()) {
return false;
}
registry.emplace(key, std::move(factory));
return true;
}
bool UnregisterPipelineRendererAssetFactory(const std::string& key) {
if (key.empty()) {
return false;
}
EnsureBuiltinPipelineRendererAssetRegistryInitialized();
std::lock_guard<std::mutex> lock(
GetPipelineRendererAssetRegistryMutex());
if (GetBuiltinPipelineRendererAssetKeys().find(key) !=
GetBuiltinPipelineRendererAssetKeys().end()) {
return false;
}
PipelineRendererAssetRegistry& registry =
GetPipelineRendererAssetRegistry();
return registry.erase(key) != 0u;
}
std::shared_ptr<const RenderPipelineAsset> CreatePipelineRendererAssetByKey(
const std::string& key) {
if (key.empty()) {
return nullptr;
}
EnsureBuiltinPipelineRendererAssetRegistryInitialized();
std::lock_guard<std::mutex> lock(
GetPipelineRendererAssetRegistryMutex());
const PipelineRendererAssetRegistry& registry =
GetPipelineRendererAssetRegistry();
const auto it = registry.find(key);
if (it == registry.end() || !it->second) {
return nullptr;
}
return it->second();
}
std::shared_ptr<const RenderPipelineAsset> ResolveRenderPipelineAssetOrDefault(

View File

@@ -1,7 +1,8 @@
#pragma once
#include <string>
#include <functional>
#include <memory>
#include <string>
namespace XCEngine {
namespace Rendering {
@@ -12,8 +13,15 @@ class RenderPipelineAsset;
namespace Internal {
using PipelineRendererAssetFactory =
std::function<std::shared_ptr<const RenderPipelineAsset>()>;
std::shared_ptr<const RenderPipelineAsset> CreateConfiguredRenderPipelineAsset();
std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset();
bool RegisterPipelineRendererAssetFactory(
const std::string& key,
PipelineRendererAssetFactory factory);
bool UnregisterPipelineRendererAssetFactory(const std::string& key);
std::shared_ptr<const RenderPipelineAsset> CreatePipelineRendererAssetByKey(
const std::string& key);