rendering: split managed default backend from fallback pipeline

This commit is contained in:
2026-04-26 12:24:34 +08:00
parent b7bf11001f
commit 2ccebb3488
4 changed files with 65 additions and 2 deletions

View File

@@ -15,6 +15,17 @@ namespace Internal {
namespace {
class DefaultNativeSceneDrawBackendAsset final : public RenderPipelineAsset {
public:
std::unique_ptr<RenderPipeline> CreatePipeline() const override {
return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend();
}
FinalColorSettings GetDefaultFinalColorSettings() const override {
return {};
}
};
class DefaultNativePipelineBackendAsset final : public RenderPipelineAsset {
public:
std::unique_ptr<RenderPipeline> CreatePipeline() const override {
@@ -26,6 +37,14 @@ public:
}
};
std::shared_ptr<const RenderPipelineAsset>
CreateDefaultNativeSceneDrawBackendAsset() {
static const std::shared_ptr<const RenderPipelineAsset>
s_defaultNativeSceneDrawBackendAsset =
std::make_shared<DefaultNativeSceneDrawBackendAsset>();
return s_defaultNativeSceneDrawBackendAsset;
}
std::shared_ptr<const RenderPipelineAsset>
CreateDefaultNativePipelineBackendAsset() {
static const std::shared_ptr<const RenderPipelineAsset>
@@ -71,6 +90,12 @@ std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset() {
return std::make_shared<Pipelines::ScriptableRenderPipelineHostAsset>();
}
std::shared_ptr<const RenderPipelineAsset> CreateDefaultSceneDrawBackendAsset() {
static const std::shared_ptr<const RenderPipelineAsset> s_defaultAsset =
CreateDefaultNativeSceneDrawBackendAsset();
return s_defaultAsset;
}
std::shared_ptr<const RenderPipelineAsset> CreateDefaultPipelineBackendAsset() {
static const std::shared_ptr<const RenderPipelineAsset> s_defaultAsset =
CreateDefaultNativePipelineBackendAsset();

View File

@@ -14,6 +14,7 @@ namespace Internal {
std::shared_ptr<const RenderPipelineAsset> CreateConfiguredRenderPipelineAsset();
std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset();
std::shared_ptr<const RenderPipelineAsset> CreateDefaultSceneDrawBackendAsset();
std::shared_ptr<const RenderPipelineAsset> CreateDefaultPipelineBackendAsset();
std::shared_ptr<const RenderPipelineAsset> ResolveRenderPipelineAssetOrDefault(

View File

@@ -18,7 +18,7 @@ ResolveManagedPipelineBackendAsset(
case ManagedPipelineRendererAssetPolicy::ExplicitAsset:
return runtime.GetSharedPipelineBackendAsset();
case ManagedPipelineRendererAssetPolicy::DefaultNativeBackend:
return Internal::CreateDefaultPipelineBackendAsset();
return Internal::CreateDefaultSceneDrawBackendAsset();
case ManagedPipelineRendererAssetPolicy::Unspecified:
default:
return runtime.GetSharedPipelineBackendAsset();

View File

@@ -4825,8 +4825,19 @@ TEST(
ASSERT_NE(host, nullptr);
EXPECT_EQ(
host->GetPipelineBackendAsset(),
Internal::CreateDefaultPipelineBackendAsset().get());
Internal::CreateDefaultSceneDrawBackendAsset().get());
EXPECT_NE(host->GetPipelineBackend(), nullptr);
auto* backendPipeline =
dynamic_cast<RenderPipeline*>(host->GetPipelineBackend());
ASSERT_NE(backendPipeline, nullptr);
EXPECT_EQ(
backendPipeline->GetCameraFrameStandalonePass(
CameraFrameStage::DepthOnly),
nullptr);
EXPECT_EQ(
backendPipeline->GetCameraFrameStandalonePass(
CameraFrameStage::ShadowCaster),
nullptr);
EXPECT_NE(host->GetStageRecorder(), nullptr);
EXPECT_EQ(runtimeState->getPipelineRendererAssetCalls, 0);
@@ -4882,6 +4893,32 @@ TEST(
nullptr);
}
TEST(
DefaultSceneDrawBackendAsset_Test,
CreatesSceneOnlyPipelineWithoutFallbackStandalonePasses) {
const std::shared_ptr<const RenderPipelineAsset> backendAsset =
Internal::CreateDefaultSceneDrawBackendAsset();
ASSERT_NE(backendAsset, nullptr);
std::unique_ptr<RenderPipeline> pipeline = backendAsset->CreatePipeline();
ASSERT_NE(pipeline, nullptr);
auto* sceneDrawBackend =
dynamic_cast<SceneDrawBackend*>(pipeline.get());
ASSERT_NE(sceneDrawBackend, nullptr);
SceneRenderFeatureHost* const featureHost =
sceneDrawBackend->GetSceneFeatureHost();
ASSERT_NE(featureHost, nullptr);
EXPECT_EQ(featureHost->GetFeaturePassCount(), 2u);
EXPECT_EQ(
pipeline->GetCameraFrameStandalonePass(CameraFrameStage::DepthOnly),
nullptr);
EXPECT_EQ(
pipeline->GetCameraFrameStandalonePass(CameraFrameStage::ShadowCaster),
nullptr);
}
TEST(ManagedScriptableRenderPipelineAsset_Test, LetsManagedBridgeConfigureCameraRenderRequests) {
Pipelines::ClearManagedRenderPipelineBridge();