rendering: extract default native scene backend

This commit is contained in:
2026-04-26 01:59:21 +08:00
parent b13cb6506c
commit 8eb1f8c5a2
9 changed files with 152 additions and 45 deletions

View File

@@ -15,32 +15,49 @@ namespace Internal {
namespace {
class DefaultNativePipelineBackendAsset final : public RenderPipelineAsset {
public:
std::unique_ptr<RenderPipeline> CreatePipeline() const override {
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
}
FinalColorSettings GetDefaultFinalColorSettings() const override {
return {};
}
};
std::shared_ptr<const RenderPipelineAsset>
CreateBuiltinForwardPipelineRendererAsset() {
CreateDefaultNativePipelineBackendAsset() {
static const std::shared_ptr<const RenderPipelineAsset>
s_builtinForwardPipelineAsset =
std::make_shared<Pipelines::BuiltinForwardPipelineAsset>();
return s_builtinForwardPipelineAsset;
s_defaultNativePipelineBackendAsset =
std::make_shared<DefaultNativePipelineBackendAsset>();
return s_defaultNativePipelineBackendAsset;
}
std::unique_ptr<SceneDrawBackend> TryCreateSceneDrawBackendFromAsset(
std::unique_ptr<RenderPipelineBackend> TryCreatePipelineBackendFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& asset) {
if (asset == nullptr) {
return nullptr;
}
std::unique_ptr<RenderPipeline> pipeline = asset->CreatePipeline();
if (pipeline == nullptr) {
return asset->CreatePipeline();
}
std::unique_ptr<SceneDrawBackend> TryCreateSceneDrawBackendFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& asset) {
std::unique_ptr<RenderPipelineBackend> pipelineBackend =
TryCreatePipelineBackendFromAsset(asset);
if (pipelineBackend == nullptr) {
return nullptr;
}
SceneDrawBackend* const sceneDrawBackend =
dynamic_cast<SceneDrawBackend*>(pipeline.get());
dynamic_cast<SceneDrawBackend*>(pipelineBackend.get());
if (sceneDrawBackend == nullptr) {
return nullptr;
}
(void)pipeline.release();
(void)pipelineBackend.release();
return std::unique_ptr<SceneDrawBackend>(sceneDrawBackend);
}
@@ -56,7 +73,7 @@ std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset() {
std::shared_ptr<const RenderPipelineAsset> CreateDefaultPipelineBackendAsset() {
static const std::shared_ptr<const RenderPipelineAsset> s_defaultAsset =
CreateBuiltinForwardPipelineRendererAsset();
CreateDefaultNativePipelineBackendAsset();
return s_defaultAsset;
}
@@ -128,6 +145,39 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
return std::make_unique<Pipelines::ScriptableRenderPipelineHost>();
}
std::unique_ptr<RenderPipelineBackend> CreatePipelineBackendFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
if (std::unique_ptr<RenderPipelineBackend> pipelineBackend =
TryCreatePipelineBackendFromAsset(preferredAsset)) {
if (outResolvedAsset != nullptr) {
*outResolvedAsset = preferredAsset;
}
return pipelineBackend;
}
const std::shared_ptr<const RenderPipelineAsset> defaultAsset =
CreateDefaultPipelineBackendAsset();
if (defaultAsset != nullptr &&
defaultAsset != preferredAsset) {
if (std::unique_ptr<RenderPipelineBackend> pipelineBackend =
TryCreatePipelineBackendFromAsset(defaultAsset)) {
if (outResolvedAsset != nullptr) {
*outResolvedAsset = defaultAsset;
}
return pipelineBackend;
}
}
if (outResolvedAsset != nullptr) {
*outResolvedAsset =
defaultAsset != nullptr
? defaultAsset
: preferredAsset;
}
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
}
std::unique_ptr<SceneDrawBackend> CreateSceneDrawBackendFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
@@ -146,14 +196,7 @@ std::unique_ptr<SceneDrawBackend> CreateSceneDrawBackendFromAsset(
}
std::unique_ptr<SceneDrawBackend> CreateDefaultSceneDrawBackend() {
if (std::unique_ptr<SceneDrawBackend> sceneDrawBackend =
TryCreateSceneDrawBackendFromAsset(
CreateDefaultPipelineBackendAsset());
sceneDrawBackend != nullptr) {
return sceneDrawBackend;
}
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend();
}
} // namespace Internal