refactor(rendering): route camera-stage graph pass recording through contract

This commit is contained in:
2026-04-15 08:51:40 +08:00
parent 302a13bc99
commit 31a979f779
4 changed files with 293 additions and 34 deletions

View File

@@ -3,6 +3,7 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h"
#include "Rendering/Graph/RenderGraph.h"
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
namespace XCEngine {
namespace Rendering {
@@ -35,6 +36,52 @@ RenderPassContext BuildCameraFrameStageGraphPassContext(
};
}
RenderPassRenderGraphContext BuildCameraFrameStandaloneStageRenderGraphContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData,
RenderPass& pass,
bool& stageExecutionSucceeded) {
bool* const stageExecutionSucceededPtr = &stageExecutionSucceeded;
RenderPass* const passPtr = &pass;
const RenderPassGraphBeginCallback beginPass =
[stageExecutionSucceededPtr, passPtr, renderContext = &context.plan.request.context](
const RenderPassContext&) -> bool {
if (!InitializeCameraFrameStandalonePass(
passPtr,
*renderContext)) {
*stageExecutionSucceededPtr = false;
return false;
}
return true;
};
return BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
context,
stageState,
stageState.stageName,
sceneData,
std::vector<RenderGraphTextureHandle>{ stageState.outputColor },
stageState.outputSurface.depthTexture),
beginPass);
}
bool RecordCameraFrameStandaloneStageRenderGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData,
RenderPass& pass,
bool& stageExecutionSucceeded) {
return pass.RecordRenderGraph(
BuildCameraFrameStandaloneStageRenderGraphContext(
context,
stageState,
sceneData,
pass,
stageExecutionSucceeded));
}
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
@@ -158,6 +205,29 @@ RenderPassContext BuildCameraFrameStageFallbackPassContext(
};
}
RenderPipelineMainSceneRenderGraphContext BuildCameraFrameMainSceneStageRenderGraphContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState) {
return BuildRenderPipelineMainSceneRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
context,
stageState,
stageState.stageName,
context.sceneData,
std::vector<RenderGraphTextureHandle>{ stageState.outputColor },
stageState.outputSurface.depthTexture));
}
bool RecordCameraFrameMainSceneGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
RenderPipelineRenderer& pipeline) {
return pipeline.RecordMainSceneRenderGraph(
BuildCameraFrameMainSceneStageRenderGraphContext(
context,
stageState));
}
void RecordCameraFrameStageFallbackPassIO(
const CameraFrameStageGraphBuildState& stageState,
RenderGraphPassBuilder& passBuilder) {

View File

@@ -28,6 +28,20 @@ RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData);
RenderPassRenderGraphContext BuildCameraFrameStandaloneStageRenderGraphContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData,
RenderPass& pass,
bool& stageExecutionSucceeded);
bool RecordCameraFrameStandaloneStageRenderGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData,
RenderPass& pass,
bool& stageExecutionSucceeded);
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
@@ -65,6 +79,15 @@ RenderPassContext BuildCameraFrameStageFallbackPassContext(
const RenderContext& renderContext,
const RenderSceneData& sceneData);
RenderPipelineMainSceneRenderGraphContext BuildCameraFrameMainSceneStageRenderGraphContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState);
bool RecordCameraFrameMainSceneGraphPass(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,
RenderPipelineRenderer& pipeline);
void RecordCameraFrameStageFallbackPassIO(
const CameraFrameStageGraphBuildState& stageState,
RenderGraphPassBuilder& passBuilder);

View File

@@ -33,30 +33,12 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass(
stageState.stage,
context,
stageState.surfaceTemplate);
bool* const stageExecutionSucceeded = &builder.stageExecutionSucceeded;
const RenderPassGraphBeginCallback beginStandalonePass =
[stageExecutionSucceeded, standaloneStagePass, renderContext = &context.plan.request.context](
const RenderPassContext&) -> bool {
if (!InitializeCameraFrameStandalonePass(
standaloneStagePass,
*renderContext)) {
*stageExecutionSucceeded = false;
return false;
}
return true;
};
const RenderPassRenderGraphContext standalonePassContext =
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
context,
stageState,
stageState.stageName,
stageSceneData,
std::vector<RenderGraphTextureHandle>{ stageState.outputColor },
stageState.outputSurface.depthTexture),
beginStandalonePass);
if (!standaloneStagePass->RecordRenderGraph(standalonePassContext)) {
if (!RecordCameraFrameStandaloneStageRenderGraphPass(
context,
stageState,
stageSceneData,
*standaloneStagePass,
builder.stageExecutionSucceeded)) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,
Containers::String("CameraRenderer::Render failed: RenderPass::RecordRenderGraph returned false for ") +
@@ -80,16 +62,10 @@ bool TryRecordCameraFrameMainSceneGraphPass(
}
handled = true;
const RenderPipelineMainSceneRenderGraphContext mainSceneContext =
BuildRenderPipelineMainSceneRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
context,
stageState,
stageState.stageName,
context.sceneData,
std::vector<RenderGraphTextureHandle>{ stageState.outputColor },
stageState.outputSurface.depthTexture));
if (!builder.executionState.pipeline->RecordMainSceneRenderGraph(mainSceneContext)) {
if (!RecordCameraFrameMainSceneGraphPass(
context,
stageState,
*builder.executionState.pipeline)) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,
"CameraRenderer::Render failed: RenderPipeline::RecordMainSceneRenderGraph returned false");