refactor(srp): add renderer backend registry seam
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user