Tighten SRP fallback creation semantics

This commit is contained in:
2026-04-26 18:45:15 +08:00
parent 703eaa3b8e
commit 244bdd78c2
3 changed files with 40 additions and 33 deletions

View File

@@ -42,6 +42,15 @@ CreateDefaultNativePipelineBackendAsset() {
return s_defaultNativePipelineBackendAsset;
}
std::unique_ptr<RenderPipeline> TryCreateRenderPipelineFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& asset) {
if (asset == nullptr) {
return nullptr;
}
return asset->CreatePipeline();
}
std::unique_ptr<RenderPipelineBackend> TryCreatePipelineBackendFromAsset(
const std::shared_ptr<const RenderPipelineAsset>& asset) {
if (asset == nullptr) {
@@ -111,36 +120,20 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
const std::shared_ptr<const RenderPipelineAsset> resolvedAsset =
ResolveRenderPipelineAssetOrDefault(preferredAsset);
if (resolvedAsset != nullptr) {
if (std::unique_ptr<RenderPipeline> pipeline =
resolvedAsset->CreatePipeline()) {
if (outResolvedAsset != nullptr) {
*outResolvedAsset = resolvedAsset;
}
return pipeline;
}
}
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;
if (std::unique_ptr<RenderPipeline> pipeline =
TryCreateRenderPipelineFromAsset(resolvedAsset)) {
if (outResolvedAsset != nullptr) {
*outResolvedAsset = resolvedAsset;
}
return pipeline;
}
const std::shared_ptr<const RenderPipelineAsset> fallbackAsset =
CreateFallbackRenderPipelineAsset();
if (fallbackAsset != nullptr &&
fallbackAsset != resolvedAsset &&
fallbackAsset != defaultAsset) {
fallbackAsset != resolvedAsset) {
if (std::unique_ptr<RenderPipeline> pipeline =
fallbackAsset->CreatePipeline()) {
TryCreateRenderPipelineFromAsset(fallbackAsset)) {
if (outResolvedAsset != nullptr) {
*outResolvedAsset = fallbackAsset;
}
@@ -152,9 +145,7 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
*outResolvedAsset =
fallbackAsset != nullptr
? fallbackAsset
: (defaultAsset != nullptr
? defaultAsset
: resolvedAsset);
: resolvedAsset;
}
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
}

View File

@@ -85,8 +85,27 @@ ManagedScriptableRenderPipelineAsset::CreateExecutionHostAsset() const {
}
std::unique_ptr<RenderPipeline> ManagedScriptableRenderPipelineAsset::CreatePipeline() const {
const ScriptableRenderPipelineHostAsset executionHostAsset =
CreateExecutionHostAsset();
const std::shared_ptr<const ManagedRenderPipelineAssetRuntime> runtime =
ResolveManagedAssetRuntime();
if (runtime == nullptr) {
return nullptr;
}
const std::shared_ptr<const RenderPipelineAsset> pipelineBackendAsset =
ResolveManagedPipelineBackendAsset(*runtime);
if (pipelineBackendAsset == nullptr) {
return nullptr;
}
std::unique_ptr<RenderPipelineStageRecorder> stageRecorder =
runtime->CreateStageRecorder();
if (stageRecorder == nullptr) {
return nullptr;
}
const ScriptableRenderPipelineHostAsset executionHostAsset(
pipelineBackendAsset,
runtime);
std::unique_ptr<RenderPipeline> pipeline =
executionHostAsset.CreatePipeline();
auto* host = dynamic_cast<ScriptableRenderPipelineHost*>(pipeline.get());
@@ -94,11 +113,7 @@ std::unique_ptr<RenderPipeline> ManagedScriptableRenderPipelineAsset::CreatePipe
return pipeline;
}
if (const std::shared_ptr<const ManagedRenderPipelineAssetRuntime> runtime =
ResolveManagedAssetRuntime();
runtime != nullptr) {
host->SetStageRecorder(runtime->CreateStageRecorder());
}
host->SetStageRecorder(std::move(stageRecorder));
return pipeline;
}