refactor(rendering): formalize pipeline selection and engine asset discovery

This commit is contained in:
2026-04-19 04:31:48 +08:00
parent 78bcd2e9ca
commit 48bfde28e3
17 changed files with 294 additions and 121 deletions

View File

@@ -8,15 +8,27 @@ namespace XCEngine {
namespace Rendering {
namespace Internal {
std::shared_ptr<const RenderPipelineAsset> CreateDefaultRenderPipelineAsset() {
return Pipelines::CreateManagedOrDefaultScriptableRenderPipelineAsset();
std::shared_ptr<const RenderPipelineAsset> CreateConfiguredRenderPipelineAsset() {
return Pipelines::CreateConfiguredManagedRenderPipelineAsset();
}
std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset() {
return std::make_shared<Pipelines::ScriptableRenderPipelineHostAsset>();
}
std::shared_ptr<const RenderPipelineAsset> ResolveRenderPipelineAssetOrDefault(
std::shared_ptr<const RenderPipelineAsset> preferredAsset) {
return preferredAsset != nullptr
? std::move(preferredAsset)
: CreateDefaultRenderPipelineAsset();
if (preferredAsset != nullptr) {
return std::move(preferredAsset);
}
if (std::shared_ptr<const RenderPipelineAsset> configuredAsset =
CreateConfiguredRenderPipelineAsset();
configuredAsset != nullptr) {
return configuredAsset;
}
return CreateFallbackRenderPipelineAsset();
}
std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
@@ -34,10 +46,24 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
}
}
const std::shared_ptr<const RenderPipelineAsset> defaultAsset =
ResolveRenderPipelineAssetOrDefault(nullptr);
if (defaultAsset != nullptr &&
defaultAsset != resolvedAsset) {
if (std::unique_ptr<RenderPipeline> pipeline =
defaultAsset->CreatePipeline()) {
if (outResolvedAsset != nullptr) {
*outResolvedAsset = defaultAsset;
}
return pipeline;
}
}
const std::shared_ptr<const RenderPipelineAsset> fallbackAsset =
CreateDefaultRenderPipelineAsset();
CreateFallbackRenderPipelineAsset();
if (fallbackAsset != nullptr &&
fallbackAsset != resolvedAsset) {
fallbackAsset != resolvedAsset &&
fallbackAsset != defaultAsset) {
if (std::unique_ptr<RenderPipeline> pipeline =
fallbackAsset->CreatePipeline()) {
if (outResolvedAsset != nullptr) {
@@ -51,7 +77,9 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
*outResolvedAsset =
fallbackAsset != nullptr
? fallbackAsset
: resolvedAsset;
: (defaultAsset != nullptr
? defaultAsset
: resolvedAsset);
}
return std::make_unique<Pipelines::ScriptableRenderPipelineHost>();
}