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

@@ -45,6 +45,8 @@
#include <XCEngine/Scripting/ScriptComponent.h>
#include <XCEngine/Scripting/ScriptEngine.h>
#include "Rendering/Internal/RenderPipelineFactory.h"
#include <algorithm>
#include <array>
#include <cstdint>
@@ -75,6 +77,40 @@ void ExpectVector4Near(const XCEngine::Math::Vector4& actual, const XCEngine::Ma
EXPECT_NEAR(actual.w, expected.w, tolerance);
}
std::shared_ptr<const XCEngine::Rendering::RenderPipelineAsset>
CreateBuiltinForwardPipelineRendererAssetForTest() {
return std::make_shared<
XCEngine::Rendering::Pipelines::BuiltinForwardPipelineAsset>();
}
class ScopedPipelineRendererAssetFactoryRegistration final {
public:
ScopedPipelineRendererAssetFactoryRegistration(
std::string key,
XCEngine::Rendering::Internal::PipelineRendererAssetFactory factory)
: m_key(std::move(key))
, m_registered(
XCEngine::Rendering::Internal::RegisterPipelineRendererAssetFactory(
m_key,
std::move(factory))) {
}
~ScopedPipelineRendererAssetFactoryRegistration() {
if (m_registered) {
(void)XCEngine::Rendering::Internal::
UnregisterPipelineRendererAssetFactory(m_key);
}
}
bool IsRegistered() const {
return m_registered;
}
private:
std::string m_key;
bool m_registered = false;
};
class CapturingLogSink final : public XCEngine::Debug::ILogSink {
public:
void Log(const XCEngine::Debug::LogEntry& entry) override {
@@ -2950,6 +2986,42 @@ TEST_F(
nullptr);
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeResolvesRegisteredAliasBackendKey) {
ScopedPipelineRendererAssetFactoryRegistration registration(
"BuiltinForwardAlias",
&CreateBuiltinForwardPipelineRendererAssetForTest);
ASSERT_TRUE(registration.IsRegistered());
const auto bridge =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge();
ASSERT_NE(bridge, nullptr);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor
descriptor = {
"GameScripts",
"Gameplay",
"ManagedBuiltinForwardAliasRenderPipelineProbeAsset"
};
std::shared_ptr<const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetRuntime>
assetRuntime = bridge->CreateAssetRuntime(descriptor);
ASSERT_NE(assetRuntime, nullptr);
const std::shared_ptr<const XCEngine::Rendering::RenderPipelineAsset>
rendererAsset = assetRuntime->GetPipelineRendererAsset();
ASSERT_NE(rendererAsset, nullptr);
std::unique_ptr<XCEngine::Rendering::RenderPipeline> pipeline =
rendererAsset->CreatePipeline();
ASSERT_NE(pipeline, nullptr);
EXPECT_NE(
dynamic_cast<XCEngine::Rendering::Pipelines::BuiltinForwardPipeline*>(
pipeline.get()),
nullptr);
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeUsesDefaultRendererSelectionForNativeBackendAsset) {