refactor(rendering): move sequence graph pass authoring into contract

This commit is contained in:
2026-04-15 10:30:04 +08:00
parent 1c9f9a835d
commit e42b0dc50b
4 changed files with 346 additions and 171 deletions

View File

@@ -2,12 +2,27 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
#include "Rendering/Graph/RenderGraph.h"
#include <XCEngine/Rendering/RenderPassGraphContract.h>
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
namespace XCEngine {
namespace Rendering {
namespace {
bool RecordCameraFrameCompatibleGraphPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context,
const RenderPassGraphIO& io) {
return pass.SupportsRenderGraph()
? pass.RecordRenderGraph(context)
: RecordRasterRenderPass(pass, context, io);
}
} // namespace
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
const CameraFrameStageGraphBuildState& stageState) {
return {
@@ -82,6 +97,32 @@ bool RecordCameraFrameStandaloneStageRenderGraphPass(
stageExecutionSucceeded));
}
bool RecordCameraFrameRegularSequenceStageRenderGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const Containers::String& passName,
const RenderGraphImportedSurface& outputSurface,
const RenderPassGraphBeginCallback& beginPassCallback,
RenderPass& pass) {
return RecordCameraFrameCompatibleGraphPass(
pass,
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
context,
stageState,
passName,
context.sceneData,
BuildCameraFrameStageGraphSourceBinding(stageState),
outputSurface.colorTextures,
outputSurface.depthTexture),
beginPassCallback),
{
false,
GetPrimaryColorTexture(outputSurface).IsValid(),
outputSurface.depthTexture.IsValid()
});
}
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
@@ -159,6 +200,61 @@ RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
depthTarget);
}
bool RecordCameraFrameFullscreenSequenceStageGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const Containers::String& passName,
const CameraFrameRenderGraphSourceBinding& binding,
RenderGraphTextureHandle finalOutputColor,
size_t passIndex,
size_t passCount,
RenderGraphTextureHandle& currentSourceColor,
const RenderPassGraphBeginCallback& beginPassCallback,
RenderPass& pass) {
const bool isLastPass = (passIndex + 1u) == passCount;
const RenderGraphTextureHandle passOutputColor =
isLastPass
? finalOutputColor
: context.builder.graphBuilder.CreateTransientTexture(
passName + ".Color",
BuildFullscreenTransientTextureDesc(stageState.surfaceTemplate));
const CameraFrameRenderGraphSourceBinding passSourceBinding = {
passIndex == 0u
? binding.sourceSurfaceTemplate
: &stageState.surfaceTemplate,
passIndex == 0u
? binding.sourceColorView
: nullptr,
passIndex == 0u
? binding.sourceColorState
: RHI::ResourceStates::PixelShaderResource,
currentSourceColor
};
const bool recordSucceeded =
RecordCameraFrameCompatibleGraphPass(
pass,
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
context,
stageState,
passName,
context.sceneData,
passSourceBinding,
std::vector<RenderGraphTextureHandle>{ passOutputColor },
{}),
beginPassCallback),
{
true,
true,
false
});
if (recordSucceeded) {
currentSourceColor = passOutputColor;
}
return recordSucceeded;
}
CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurfaceResolution(
const CameraFrameStageGraphBuildState& stageState,
bool graphOwnsSourceTransitions,

View File

@@ -42,6 +42,14 @@ bool RecordCameraFrameStandaloneStageRenderGraphPass(
RenderPass& pass,
bool& stageExecutionSucceeded);
bool RecordCameraFrameRegularSequenceStageRenderGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const Containers::String& passName,
const RenderGraphImportedSurface& outputSurface,
const RenderPassGraphBeginCallback& beginPassCallback,
RenderPass& pass);
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
@@ -69,6 +77,18 @@ RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
std::vector<RenderGraphTextureHandle> colorTargets,
RenderGraphTextureHandle depthTarget);
bool RecordCameraFrameFullscreenSequenceStageGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const Containers::String& passName,
const CameraFrameRenderGraphSourceBinding& binding,
RenderGraphTextureHandle finalOutputColor,
size_t passIndex,
size_t passCount,
RenderGraphTextureHandle& currentSourceColor,
const RenderPassGraphBeginCallback& beginPassCallback,
RenderPass& pass);
CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurfaceResolution(
const CameraFrameStageGraphBuildState& stageState,
bool graphOwnsSourceTransitions,

View File

@@ -7,7 +7,6 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
#include "Rendering/Graph/RenderGraph.h"
#include <XCEngine/Rendering/RenderPassGraphContract.h>
namespace XCEngine {
namespace Rendering {
@@ -45,15 +44,6 @@ std::unique_ptr<ScopedInitializedPassSequence>* ResolveStageSequenceState(
}
}
bool RecordSequencePass(
RenderPass& pass,
const RenderPassRenderGraphContext& context,
const RenderPassGraphIO& io) {
return pass.SupportsRenderGraph()
? pass.RecordRenderGraph(context)
: RecordRasterRenderPass(pass, context, io);
}
RenderPassGraphBeginCallback BuildSequenceBeginCallback(
CameraFrameStage stage,
RenderPassSequence* stageSequence,
@@ -129,135 +119,6 @@ bool RecordStageSequencePasses(
return true;
}
bool RecordRegularPassSequenceStage(
CameraFrameStage stage,
const Containers::String& stageName,
const CameraFrameRenderGraphStageContext& stageContext,
const CameraFrameStageGraphBuildState& stageState,
const RenderPassContext& stagePassContext,
const RenderGraphImportedSurface& outputSurface,
const RenderSceneData& sceneData,
RenderPassSequence* stageSequence,
CameraFrameExecutionState& executionState,
bool& stageExecutionSucceeded) {
const bool writesColor = GetPrimaryColorTexture(outputSurface).IsValid();
const bool writesDepth = outputSurface.depthTexture.IsValid();
return RecordStageSequencePasses(
stage,
stageName,
stageSequence,
executionState,
stagePassContext.renderContext,
stageExecutionSucceeded,
[&stageContext, &stageState, &sceneData, &outputSurface, writesColor, writesDepth](
RenderPass& pass,
size_t,
const Containers::String& passName,
const RenderPassGraphBeginCallback& beginSequencePass) {
const RenderPassRenderGraphContext passContext =
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
stageContext,
stageState,
passName,
sceneData,
BuildCameraFrameStageGraphSourceBinding(stageState),
outputSurface.colorTextures,
outputSurface.depthTexture),
beginSequencePass);
return RecordSequencePass(
pass,
passContext,
{
false,
writesColor,
writesDepth
});
});
}
bool RecordFullscreenPassSequenceStage(
CameraFrameStage stage,
const Containers::String& stageName,
const CameraFrameRenderGraphStageContext& stageContext,
const CameraFrameStageGraphBuildState& stageState,
const RenderPassContext& stagePassContext,
const CameraFrameRenderGraphSourceBinding& binding,
RenderGraphTextureHandle finalOutputColor,
const RenderSceneData& sceneData,
RenderPassSequence* stageSequence,
CameraFrameExecutionState& executionState,
RenderGraphBuilder& graphBuilder,
bool& stageExecutionSucceeded) {
RenderGraphTextureHandle currentSourceColor = binding.sourceColor;
const RenderGraphTextureDesc transientDesc =
BuildFullscreenTransientTextureDesc(stagePassContext.surface);
return RecordStageSequencePasses(
stage,
stageName,
stageSequence,
executionState,
stagePassContext.renderContext,
stageExecutionSucceeded,
[&stageContext, &stageState, &stagePassContext, &sceneData, &graphBuilder, &transientDesc, &binding, finalOutputColor, &currentSourceColor, stageSequence](
RenderPass& pass,
size_t passIndex,
const Containers::String& passName,
const RenderPassGraphBeginCallback& beginSequencePass) {
const bool isLastPass = (passIndex + 1u) == stageSequence->GetPassCount();
const RenderGraphTextureHandle passOutputColor =
isLastPass
? finalOutputColor
: graphBuilder.CreateTransientTexture(
passName + ".Color",
transientDesc);
const RenderSurface* const sourceSurfaceTemplate =
passIndex == 0u
? binding.sourceSurfaceTemplate
: &stagePassContext.surface;
RHI::RHIResourceView* const sourceColorView =
passIndex == 0u
? binding.sourceColorView
: nullptr;
const RHI::ResourceStates sourceColorState =
passIndex == 0u
? binding.sourceColorState
: RHI::ResourceStates::PixelShaderResource;
const RenderPassRenderGraphContext passContext =
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
stageContext,
stageState,
passName,
sceneData,
{
sourceSurfaceTemplate,
sourceColorView,
sourceColorState,
currentSourceColor
},
std::vector<RenderGraphTextureHandle>{ passOutputColor },
{}),
beginSequencePass);
const bool recordSucceeded =
RecordSequencePass(
pass,
passContext,
{
true,
true,
false
});
if (recordSucceeded) {
currentSourceColor = passOutputColor;
}
return recordSucceeded;
});
}
} // namespace
bool TryRecordCameraFrameStageSequence(
@@ -271,45 +132,68 @@ bool TryRecordCameraFrameStageSequence(
}
handled = true;
const RenderPassContext stagePassContext =
BuildCameraFrameStageGraphPassContext(
context,
stageState,
context.sceneData);
const CameraFrameRenderGraphSourceBinding sourceBinding =
BuildCameraFrameStageGraphSourceBinding(stageState);
const bool recordResult =
IsCameraFrameFullscreenSequenceStage(stageState.stage)
? RecordFullscreenPassSequenceStage(
stageState.stage,
stageState.stageName,
context,
stageState,
stagePassContext,
ResolveCameraFrameFullscreenStageGraphSourceBinding(
context.plan,
? [&]() {
RenderGraphTextureHandle currentSourceColor = {};
const CameraFrameRenderGraphSourceBinding fullscreenBinding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
context.plan,
stageState.stage,
stageState.surfaceTemplate,
sourceBinding.sourceSurfaceTemplate,
sourceBinding.sourceColorView,
sourceBinding.sourceColorState,
sourceBinding.sourceColor,
&builder.blackboard);
currentSourceColor = fullscreenBinding.sourceColor;
return RecordStageSequencePasses(
stageState.stage,
stageState.surfaceTemplate,
stagePassContext.sourceSurface,
stagePassContext.sourceColorView,
stagePassContext.sourceColorState,
GetPrimaryColorTexture(stageState.sourceSurface),
&builder.blackboard),
stageState.outputColor,
context.sceneData,
stageState.stageSequence,
builder.executionState,
builder.graphBuilder,
builder.stageExecutionSucceeded)
: RecordRegularPassSequenceStage(
stageState.stageName,
stageState.stageSequence,
builder.executionState,
context.plan.request.context,
builder.stageExecutionSucceeded,
[&context, &stageState, &fullscreenBinding, &currentSourceColor](
RenderPass& pass,
size_t passIndex,
const Containers::String& passName,
const RenderPassGraphBeginCallback& beginSequencePass) {
return RecordCameraFrameFullscreenSequenceStageGraphPass(
context,
stageState,
passName,
fullscreenBinding,
stageState.outputColor,
passIndex,
stageState.stageSequence->GetPassCount(),
currentSourceColor,
beginSequencePass,
pass);
});
}()
: RecordStageSequencePasses(
stageState.stage,
stageState.stageName,
context,
stageState,
stagePassContext,
stageState.outputSurface,
context.sceneData,
stageState.stageSequence,
builder.executionState,
builder.stageExecutionSucceeded);
context.plan.request.context,
builder.stageExecutionSucceeded,
[&context, &stageState](
RenderPass& pass,
size_t,
const Containers::String& passName,
const RenderPassGraphBeginCallback& beginSequencePass) {
return RecordCameraFrameRegularSequenceStageRenderGraphPass(
context,
stageState,
passName,
stageState.outputSurface,
beginSequencePass,
pass);
});
if (!recordResult) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,