Graph-manage single-pass fullscreen stages

This commit is contained in:
2026-04-14 15:08:08 +08:00
parent 3f871a4f45
commit 5de4848d70
2 changed files with 62 additions and 23 deletions

View File

@@ -617,6 +617,8 @@ const RenderSurface* ResolveFrameStageOutputSurface(
bool ShouldGraphOwnStageColorTransitions(
CameraFrameStage stage) {
return stage == CameraFrameStage::MainScene ||
stage == CameraFrameStage::PostProcess ||
stage == CameraFrameStage::FinalOutput ||
stage == CameraFrameStage::ObjectId;
}
@@ -685,20 +687,13 @@ bool ExecuteFrameStage(
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameExecutionState& executionState,
const RenderSurface* outputSurfaceOverride = nullptr) {
const RenderPassContext* passContextOverride = nullptr) {
const RenderPassContext defaultPassContext =
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
const RenderPassContext overridePassContext = {
defaultPassContext.renderContext,
outputSurfaceOverride != nullptr
? *outputSurfaceOverride
: defaultPassContext.surface,
defaultPassContext.sceneData,
defaultPassContext.sourceSurface,
defaultPassContext.sourceColorView,
defaultPassContext.sourceColorState
};
const RenderPassContext& passContext = overridePassContext;
const RenderPassContext& passContext =
passContextOverride != nullptr
? *passContextOverride
: defaultPassContext;
switch (stage) {
case CameraFrameStage::PreScenePasses:
@@ -713,14 +708,14 @@ bool ExecuteFrameStage(
shadowState.shadowCasterRequest,
plan.request.context,
sceneData,
outputSurfaceOverride);
passContextOverride != nullptr ? &passContext.surface : nullptr);
case CameraFrameStage::DepthOnly:
return ExecuteScenePassRequest(
executionState.depthOnlyPass,
plan.request.depthOnly,
plan.request.context,
sceneData,
outputSurfaceOverride);
passContextOverride != nullptr ? &passContext.surface : nullptr);
case CameraFrameStage::MainScene:
return executionState.pipeline != nullptr &&
executionState.pipeline->Render(
@@ -750,9 +745,7 @@ bool ExecuteFrameStage(
ExecuteStandalonePass(
executionState.objectIdPass,
plan.request.context,
outputSurfaceOverride != nullptr
? *outputSurfaceOverride
: plan.request.objectId.surface,
passContext.surface,
sceneData);
case CameraFrameStage::PostScenePasses:
return ExecutePassSequenceStage(
@@ -887,7 +880,8 @@ bool ExecuteRenderGraphPlan(
importedTextures,
stageName + ".Source",
stagePassContext.sourceSurface,
RenderGraphSurfaceImportUsage::Source);
RenderGraphSurfaceImportUsage::Source,
IsFullscreenSequenceStage(stage));
const RenderGraphImportedSurface outputSurface =
ImportRenderGraphSurface(
graphBuilder,
@@ -898,10 +892,17 @@ bool ExecuteRenderGraphPlan(
ShouldGraphOwnStageColorTransitions(stage),
ShouldGraphOwnStageDepthTransitions(stage));
const RenderSurface stageSurfaceTemplate = stagePassContext.surface;
const bool hasStageSourceSurface = stagePassContext.sourceSurface != nullptr;
const RenderSurface stageSourceSurfaceTemplate =
hasStageSourceSurface
? *stagePassContext.sourceSurface
: RenderSurface();
const RHI::RHIResourceView* const stageSourceColorView = stagePassContext.sourceColorView;
const RHI::ResourceStates stageSourceColorState = stagePassContext.sourceColorState;
graphBuilder.AddRasterPass(
stageName,
[&, sourceSurface, outputSurface, stage, stageSurfaceTemplate](
[&, sourceSurface, outputSurface, stage, stageSurfaceTemplate, hasStageSourceSurface, stageSourceSurfaceTemplate, stageSourceColorView, stageSourceColorState](
RenderGraphPassBuilder& passBuilder) {
if (IsFullscreenSequenceStage(stage)) {
ReadRenderGraphColorSurface(passBuilder, sourceSurface);
@@ -911,27 +912,55 @@ bool ExecuteRenderGraphPlan(
WriteRenderGraphSurface(passBuilder, outputSurface);
}
passBuilder.SetExecuteCallback(
[&, stage, outputSurface, stageSurfaceTemplate](
[&, stage, sourceSurface, outputSurface, stageSurfaceTemplate, hasStageSourceSurface, stageSourceSurfaceTemplate, stageSourceColorView, stageSourceColorState](
const RenderGraphExecutionContext& executionContext) {
if (!stageExecutionSucceeded) {
return;
}
const RenderSurface* outputSurfaceOverride = nullptr;
const RenderSurface* resolvedSourceSurface =
hasStageSourceSurface
? &stageSourceSurfaceTemplate
: nullptr;
RHI::RHIResourceView* resolvedSourceColorView =
const_cast<RHI::RHIResourceView*>(stageSourceColorView);
RHI::ResourceStates resolvedSourceColorState = stageSourceColorState;
RenderSurface graphManagedSourceSurface = {};
if (IsFullscreenSequenceStage(stage) &&
hasStageSourceSurface &&
CanUseGraphManagedImportedSurface(sourceSurface, executionContext)) {
graphManagedSourceSurface =
BuildGraphManagedImportedSurface(
stageSourceSurfaceTemplate,
RHI::ResourceStates::PixelShaderResource,
RHI::ResourceStates::PixelShaderResource);
resolvedSourceSurface = &graphManagedSourceSurface;
resolvedSourceColorState = RHI::ResourceStates::PixelShaderResource;
}
const RenderSurface* resolvedOutputSurface = &stageSurfaceTemplate;
RenderSurface graphManagedOutputSurface = {};
if (CanUseGraphManagedImportedSurface(outputSurface, executionContext)) {
graphManagedOutputSurface =
BuildGraphManagedPassSurface(stageSurfaceTemplate);
outputSurfaceOverride = &graphManagedOutputSurface;
resolvedOutputSurface = &graphManagedOutputSurface;
}
const RenderPassContext passContextOverride = {
plan.request.context,
*resolvedOutputSurface,
sceneData,
resolvedSourceSurface,
resolvedSourceColorView,
resolvedSourceColorState
};
stageExecutionSucceeded = ExecuteFrameStage(
stage,
plan,
shadowState,
sceneData,
executionState,
outputSurfaceOverride);
&passContextOverride);
});
});
}