Tighten SRP stage fallback gate

This commit is contained in:
2026-04-27 12:48:58 +08:00
parent ebe2e0cbc8
commit 3243eea0bf
6 changed files with 100 additions and 5 deletions

View File

@@ -4,6 +4,8 @@
#include "Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.h"
#include "Rendering/Execution/Internal/CameraFrameGraph/SequenceRecorder.h"
#include "Rendering/Execution/Internal/CameraFrameGraph/State.h"
#include "Debug/Logger.h"
#include "Rendering/RenderPipeline.h"
#include <array>
@@ -23,6 +25,25 @@ constexpr std::array<CameraFrameStageRecordHandler, 3u> kCameraFrameStageRecordH
&TryRecordCameraFrameStageStandaloneRenderGraphPass
};
RenderPipelineStageSupportContext BuildStageSupportContext(
const CameraFrameStageGraphBuildState& stageState,
const CameraFrameRenderGraphStageContext& context) {
return RenderPipelineStageSupportContext{
stageState.stage,
context.plan.request.rendererIndex };
}
bool AllowsCameraFrameStageFallback(
const CameraFrameStageGraphBuildState& stageState,
const CameraFrameRenderGraphStageContext& context) {
RenderPipeline* const pipeline = context.builder.executionState.pipeline;
return pipeline == nullptr ||
pipeline->AllowsCameraFrameStageFallback(
BuildStageSupportContext(
stageState,
context));
}
} // namespace
bool RecordCameraFrameRenderGraphStage(
@@ -44,6 +65,15 @@ bool RecordCameraFrameRenderGraphStage(
}
}
if (!AllowsCameraFrameStageFallback(stageState, context)) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,
Containers::String(
"CameraRenderer::Render failed: stage has no render-graph recorder or sequence, and the selected pipeline disallows fallback: ") +
stageState.stageName);
return false;
}
AddCameraFrameStageFallbackRasterPass(stageState, context);
return true;
}

View File

@@ -118,6 +118,24 @@ bool ScriptableRenderPipelineHost::SupportsStageRenderGraph(
m_pipelineBackend->SupportsStageRenderGraph(context);
}
bool ScriptableRenderPipelineHost::AllowsCameraFrameStageFallback(
CameraFrameStage stage) const {
return AllowsCameraFrameStageFallback(
RenderPipelineStageSupportContext{ stage, -1 });
}
bool ScriptableRenderPipelineHost::AllowsCameraFrameStageFallback(
const RenderPipelineStageSupportContext& context) const {
if (UsesAuthoritativeStageRecorder(
m_stageRecorder.get(),
m_managedAssetRuntime.get())) {
return false;
}
return m_pipelineBackend != nullptr &&
m_pipelineBackend->AllowsCameraFrameStageFallback(context);
}
bool ScriptableRenderPipelineHost::RecordStageRenderGraph(
const RenderPipelineStageRenderGraphContext& context) {
if (!EnsureInitialized(context.renderContext)) {