Extract camera frame render-graph stage record context

This commit is contained in:
2026-04-15 00:08:39 +08:00
parent 8232f59276
commit d92afa27da
11 changed files with 94 additions and 129 deletions

View File

@@ -13,10 +13,7 @@ namespace {
using CameraFrameStageRecordHandler = bool (*)(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled);
constexpr std::array<CameraFrameStageRecordHandler, 3u> kCameraFrameStageRecordHandlers = {
@@ -29,32 +26,16 @@ constexpr std::array<CameraFrameStageRecordHandler, 3u> kCameraFrameStageRecordH
bool RecordCameraFrameRenderGraphStage(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session) {
const CameraFrameRenderGraphStageRecordContext& context) {
const CameraFrameStageGraphBuildState stageState =
BuildCameraFrameStageGraphBuildState(
stage,
plan,
shadowState,
sceneData,
session.graphBuilder,
session.importedTextures);
PublishCameraFrameStageGraphBuildState(
stageState,
shadowState,
session.frameResources);
context);
PublishCameraFrameStageGraphBuildState(stageState, context);
for (CameraFrameStageRecordHandler handler : kCameraFrameStageRecordHandlers) {
bool stageHandled = false;
if (!handler(
stageState,
plan,
shadowState,
sceneData,
session,
stageHandled)) {
if (!handler(stageState, context, stageHandled)) {
return false;
}
if (stageHandled) {
@@ -62,12 +43,7 @@ bool RecordCameraFrameRenderGraphStage(
}
}
AddCameraFrameStageFallbackRasterPass(
stageState,
plan,
shadowState,
sceneData,
session);
AddCameraFrameStageFallbackRasterPass(stageState, context);
return true;
}

View File

@@ -1,20 +1,13 @@
#pragma once
#include <XCEngine/Rendering/Execution/CameraFramePlan.h>
#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h"
namespace XCEngine {
namespace Rendering {
struct DirectionalShadowExecutionState;
bool RecordCameraFrameRenderGraphStage(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session);
const CameraFrameRenderGraphStageRecordContext& context);
} // namespace Rendering
} // namespace XCEngine

View File

@@ -4,6 +4,7 @@
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
#include "Rendering/Graph/RenderGraph.h"
@@ -192,11 +193,9 @@ bool ExecuteRecordedFrameStage(
bool TryRecordCameraFrameStageStandaloneRenderGraphPass(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled) {
CameraFrameRenderGraphRecordingSession& session = context.session;
RenderPass* const standaloneStagePass =
ResolveStandaloneStagePass(stageState.stage, session.executionState);
if (standaloneStagePass == nullptr ||
@@ -209,13 +208,13 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass(
const RenderSceneData stageSceneData =
BuildStandaloneStageSceneData(
stageState.stage,
plan,
shadowState,
sceneData,
context.plan,
context.shadowState,
context.sceneData,
stageState.surfaceTemplate);
bool* const stageExecutionSucceeded = &session.stageExecutionSucceeded;
const RenderPassGraphBeginCallback beginStandalonePass =
[stageExecutionSucceeded, standaloneStagePass, renderContext = &plan.request.context](
[stageExecutionSucceeded, standaloneStagePass, renderContext = &context.plan.request.context](
const RenderPassContext&) -> bool {
if (!InitializeStandalonePass(
standaloneStagePass,
@@ -229,7 +228,7 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass(
const RenderPassRenderGraphContext standalonePassContext = {
session.graphBuilder,
stageState.stageName,
plan.request.context,
context.plan.request.context,
stageSceneData,
stageState.surfaceTemplate,
stageState.hasSourceSurface
@@ -258,11 +257,9 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass(
bool TryRecordCameraFrameMainSceneGraphPass(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState&,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled) {
CameraFrameRenderGraphRecordingSession& session = context.session;
if (stageState.stage != CameraFrameStage::MainScene ||
session.executionState.pipeline == nullptr ||
!session.executionState.pipeline->SupportsMainSceneRenderGraph()) {
@@ -274,8 +271,8 @@ bool TryRecordCameraFrameMainSceneGraphPass(
const RenderPipelineMainSceneRenderGraphContext mainSceneContext = {
session.graphBuilder,
stageState.stageName,
plan.request.context,
sceneData,
context.plan.request.context,
context.sceneData,
stageState.surfaceTemplate,
stageState.hasSourceSurface
? &stageState.sourceSurfaceTemplate
@@ -299,16 +296,14 @@ bool TryRecordCameraFrameMainSceneGraphPass(
void AddCameraFrameStageFallbackRasterPass(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session) {
const CameraFrameRenderGraphStageRecordContext& context) {
CameraFrameRenderGraphRecordingSession& session = context.session;
const CameraFrameStageGraphBuildState capturedStageState = stageState;
CameraFrameExecutionState* const executionState = &session.executionState;
bool* const stageExecutionSucceeded = &session.stageExecutionSucceeded;
const CameraFramePlan* const planPtr = &plan;
const DirectionalShadowExecutionState* const shadowStatePtr = &shadowState;
const RenderSceneData* const sceneDataPtr = &sceneData;
const CameraFramePlan* const planPtr = &context.plan;
const DirectionalShadowExecutionState* const shadowStatePtr = &context.shadowState;
const RenderSceneData* const sceneDataPtr = &context.sceneData;
session.graphBuilder.AddRasterPass(
capturedStageState.stageName,
[capturedStageState, executionState, stageExecutionSucceeded, planPtr, shadowStatePtr, sceneDataPtr](

View File

@@ -3,34 +3,22 @@
namespace XCEngine {
namespace Rendering {
struct CameraFramePlan;
struct CameraFrameRenderGraphRecordingSession;
struct CameraFrameRenderGraphStageRecordContext;
struct CameraFrameStageGraphBuildState;
struct DirectionalShadowExecutionState;
struct RenderSceneData;
bool TryRecordCameraFrameStageStandaloneRenderGraphPass(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled);
bool TryRecordCameraFrameMainSceneGraphPass(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled);
void AddCameraFrameStageFallbackRasterPass(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session);
const CameraFrameRenderGraphStageRecordContext& context);
} // namespace Rendering
} // namespace XCEngine

View File

@@ -0,0 +1,21 @@
#pragma once
#include <XCEngine/Rendering/Execution/CameraFramePlan.h>
#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h"
namespace XCEngine {
namespace Rendering {
struct DirectionalShadowExecutionState;
struct RenderSceneData;
struct CameraFrameRenderGraphStageRecordContext {
const CameraFramePlan& plan;
const DirectionalShadowExecutionState& shadowState;
const RenderSceneData& sceneData;
CameraFrameRenderGraphRecordingSession& session;
};
} // namespace Rendering
} // namespace XCEngine

View File

@@ -3,6 +3,7 @@
#include "Rendering/Execution/CameraFrameRenderGraphResources.h"
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRuntime.h"
#include "Rendering/Graph/RenderGraph.h"
@@ -30,18 +31,19 @@ bool RecordCameraFrameRenderGraphStages(
executionState,
stageExecutionSucceeded
};
const CameraFrameRenderGraphStageRecordContext context = {
plan,
shadowState,
sceneData,
session
};
for (const CameraFrameStageInfo& stageInfo : kOrderedCameraFrameStages) {
if (!plan.HasFrameStage(stageInfo.stage) &&
stageInfo.stage != CameraFrameStage::MainScene) {
continue;
}
if (!RecordCameraFrameRenderGraphStage(
stageInfo.stage,
plan,
shadowState,
sceneData,
session)) {
if (!RecordCameraFrameRenderGraphStage(stageInfo.stage, context)) {
return false;
}
}

View File

@@ -3,6 +3,7 @@
#include "Debug/Logger.h"
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
#include "Rendering/Graph/RenderGraph.h"
@@ -243,11 +244,9 @@ bool RecordFullscreenPassSequenceStage(
bool TryRecordCameraFrameStageSequence(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState&,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled) {
CameraFrameRenderGraphRecordingSession& session = context.session;
if (stageState.stageSequence == nullptr) {
handled = false;
return true;
@@ -255,7 +254,10 @@ bool TryRecordCameraFrameStageSequence(
handled = true;
const RenderPassContext stagePassContext =
BuildCameraFrameStageGraphPassContext(plan, stageState, sceneData);
BuildCameraFrameStageGraphPassContext(
context,
stageState,
context.sceneData);
const bool recordResult =
IsCameraFrameFullscreenSequenceStage(stageState.stage)
? RecordFullscreenPassSequenceStage(
@@ -263,7 +265,7 @@ bool TryRecordCameraFrameStageSequence(
stageState.stageName,
stagePassContext,
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
context.plan,
stageState.stage,
stageState.surfaceTemplate,
stagePassContext.sourceSurface,
@@ -272,7 +274,7 @@ bool TryRecordCameraFrameStageSequence(
GetPrimaryColorTexture(stageState.sourceSurface),
&session.blackboard),
stageState.outputColor,
sceneData,
context.sceneData,
stageState.stageSequence,
session.executionState,
session.graphBuilder,
@@ -283,7 +285,7 @@ bool TryRecordCameraFrameStageSequence(
stageState.stageName,
stagePassContext,
stageState.outputSurface,
sceneData,
context.sceneData,
stageState.stageSequence,
session.executionState,
session.graphBuilder,

View File

@@ -3,19 +3,12 @@
namespace XCEngine {
namespace Rendering {
struct CameraFrameExecutionState;
struct CameraFramePlan;
struct CameraFrameRenderGraphRecordingSession;
struct CameraFrameRenderGraphStageRecordContext;
struct CameraFrameStageGraphBuildState;
struct DirectionalShadowExecutionState;
struct RenderSceneData;
bool TryRecordCameraFrameStageSequence(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
CameraFrameRenderGraphRecordingSession& session,
const CameraFrameRenderGraphStageRecordContext& context,
bool& handled);
} // namespace Rendering

View File

@@ -3,6 +3,7 @@
#include "Rendering/Execution/CameraFrameRenderGraphResources.h"
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h"
namespace XCEngine {
namespace Rendering {
@@ -51,11 +52,11 @@ RenderPassContext BuildFrameStagePassContext(
} // namespace
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFramePlan& plan,
const CameraFrameRenderGraphStageRecordContext& context,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData) {
return {
plan.request.context,
context.plan.request.context,
stageState.surfaceTemplate,
sceneData,
stageState.hasSourceSurface
@@ -68,18 +69,18 @@ RenderPassContext BuildCameraFrameStageGraphPassContext(
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
RenderGraphBuilder& graphBuilder,
RenderGraphImportedTextureRegistry& importedTextures) {
const CameraFrameRenderGraphStageRecordContext& context) {
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = stage;
stageState.stageName = Containers::String(GetCameraFrameStageName(stage));
stageState.stageSequence = plan.GetPassSequence(stage);
stageState.stageSequence = context.plan.GetPassSequence(stage);
const RenderPassContext stagePassContext =
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
BuildFrameStagePassContext(
stage,
context.plan,
context.shadowState,
context.sceneData);
stageState.surfaceTemplate = stagePassContext.surface;
stageState.hasSourceSurface = stagePassContext.sourceSurface != nullptr;
if (stageState.hasSourceSurface) {
@@ -89,16 +90,16 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
stageState.sourceColorState = stagePassContext.sourceColorState;
stageState.sourceSurface =
ImportRenderGraphSurface(
graphBuilder,
importedTextures,
context.session.graphBuilder,
context.session.importedTextures,
stageState.stageName + ".Source",
stagePassContext.sourceSurface,
RenderGraphSurfaceImportUsage::Source,
IsCameraFrameFullscreenSequenceStage(stage));
stageState.outputSurface =
ImportRenderGraphSurface(
graphBuilder,
importedTextures,
context.session.graphBuilder,
context.session.importedTextures,
stageState.stageName + ".Output",
&stagePassContext.surface,
RenderGraphSurfaceImportUsage::Output,
@@ -107,20 +108,20 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
stageState.outputColor =
ResolveStageOutputColorHandle(
stage,
plan,
context.plan,
stageState.stageName,
stagePassContext,
stageState.outputSurface,
graphBuilder);
context.session.graphBuilder);
return stageState;
}
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const DirectionalShadowExecutionState& shadowState,
CameraFrameRenderGraphResources& frameResources) {
const CameraFrameRenderGraphStageRecordContext& context) {
CameraFrameRenderGraphResources& frameResources = context.session.frameResources;
if (stageState.stage == CameraFrameStage::ShadowCaster &&
shadowState.HasShadowSampling() &&
context.shadowState.HasShadowSampling() &&
stageState.outputSurface.depthTexture.IsValid()) {
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
}

View File

@@ -7,9 +7,7 @@
namespace XCEngine {
namespace Rendering {
struct CameraFrameRenderGraphResources;
struct DirectionalShadowExecutionState;
class RenderGraphBuilder;
struct CameraFrameRenderGraphStageRecordContext;
struct CameraFrameStageGraphBuildState {
CameraFrameStage stage = CameraFrameStage::MainScene;
@@ -26,22 +24,17 @@ struct CameraFrameStageGraphBuildState {
};
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFramePlan& plan,
const CameraFrameRenderGraphStageRecordContext& context,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData);
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
RenderGraphBuilder& graphBuilder,
RenderGraphImportedTextureRegistry& importedTextures);
const CameraFrameRenderGraphStageRecordContext& context);
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const DirectionalShadowExecutionState& shadowState,
CameraFrameRenderGraphResources& frameResources);
const CameraFrameRenderGraphStageRecordContext& context);
} // namespace Rendering
} // namespace XCEngine