Tighten SRP fallback creation semantics
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user