Extract camera frame render-graph stage state module

This commit is contained in:
2026-04-14 23:15:40 +08:00
parent abf30ecfd3
commit 39c7ef5fdf
4 changed files with 186 additions and 135 deletions

View File

@@ -3,6 +3,7 @@
#include "Debug/Logger.h"
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
#include "Rendering/Graph/RenderGraph.h"
#include "Rendering/Graph/RenderGraphCompiler.h"
@@ -183,45 +184,6 @@ bool RecordSequencePass(
: Internal::RecordRasterRenderPass(pass, context, io);
}
const RenderSurface* ResolveFrameStageOutputSurface(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState) {
switch (stage) {
case CameraFrameStage::ShadowCaster:
return shadowState.shadowCasterRequest.IsRequested()
? &shadowState.shadowCasterRequest.surface
: nullptr;
case CameraFrameStage::DepthOnly:
return plan.request.depthOnly.IsRequested()
? &plan.request.depthOnly.surface
: nullptr;
case CameraFrameStage::ObjectId:
return plan.request.objectId.IsRequested()
? &plan.request.objectId.surface
: nullptr;
default:
return plan.GetOutputSurface(stage);
}
}
RenderPassContext BuildFrameStagePassContext(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData) {
const RenderSurface* outputSurface =
ResolveFrameStageOutputSurface(stage, plan, shadowState);
return {
plan.request.context,
outputSurface != nullptr ? *outputSurface : plan.request.surface,
sceneData,
plan.GetSourceSurface(stage),
plan.GetSourceColorView(stage),
plan.GetSourceColorState(stage)
};
}
bool ExecuteRecordedFrameStage(
CameraFrameStage stage,
const CameraFramePlan& plan,
@@ -444,102 +406,6 @@ bool RecordFullscreenPassSequenceStage(
return true;
}
struct CameraFrameStageGraphBuildState {
CameraFrameStage stage = CameraFrameStage::MainScene;
Containers::String stageName = {};
RenderPassSequence* stageSequence = nullptr;
RenderSurface surfaceTemplate = {};
bool hasSourceSurface = false;
RenderSurface sourceSurfaceTemplate = {};
RHI::RHIResourceView* sourceColorView = nullptr;
RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common;
RenderGraphImportedSurface sourceSurface = {};
RenderGraphImportedSurface outputSurface = {};
RenderGraphTextureHandle outputColor = {};
};
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFramePlan& plan,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData) {
return {
plan.request.context,
stageState.surfaceTemplate,
sceneData,
stageState.hasSourceSurface
? &stageState.sourceSurfaceTemplate
: nullptr,
stageState.sourceColorView,
stageState.sourceColorState
};
}
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
RenderGraphBuilder& graphBuilder,
RenderGraphImportedTextureRegistry& importedTextures) {
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = stage;
stageState.stageName = Containers::String(GetCameraFrameStageName(stage));
stageState.stageSequence = plan.GetPassSequence(stage);
const RenderPassContext stagePassContext =
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
stageState.surfaceTemplate = stagePassContext.surface;
stageState.hasSourceSurface = stagePassContext.sourceSurface != nullptr;
if (stageState.hasSourceSurface) {
stageState.sourceSurfaceTemplate = *stagePassContext.sourceSurface;
}
stageState.sourceColorView = stagePassContext.sourceColorView;
stageState.sourceColorState = stagePassContext.sourceColorState;
stageState.sourceSurface =
ImportRenderGraphSurface(
graphBuilder,
importedTextures,
stageState.stageName + ".Source",
stagePassContext.sourceSurface,
RenderGraphSurfaceImportUsage::Source,
IsCameraFrameFullscreenSequenceStage(stage));
stageState.outputSurface =
ImportRenderGraphSurface(
graphBuilder,
importedTextures,
stageState.stageName + ".Output",
&stagePassContext.surface,
RenderGraphSurfaceImportUsage::Output,
DoesCameraFrameStageGraphOwnColorTransitions(stage),
DoesCameraFrameStageGraphOwnDepthTransitions(stage));
stageState.outputColor =
ResolveStageOutputColorHandle(
stage,
plan,
stageState.stageName,
stagePassContext,
stageState.outputSurface,
graphBuilder);
return stageState;
}
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const DirectionalShadowExecutionState& shadowState,
CameraFrameRenderGraphResources& frameResources) {
if (stageState.stage == CameraFrameStage::ShadowCaster &&
shadowState.HasShadowSampling() &&
stageState.outputSurface.depthTexture.IsValid()) {
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
}
WriteCameraFrameRenderGraphStageSurfaceResources(
frameResources,
stageState.stage,
stageState.outputColor,
stageState.outputSurface.depthTexture);
}
bool TryRecordCameraFrameStageSequence(
const CameraFrameStageGraphBuildState& stageState,
const CameraFramePlan& plan,

View File

@@ -0,0 +1,136 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
#include "Rendering/Execution/CameraFrameRenderGraphResources.h"
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
namespace XCEngine {
namespace Rendering {
namespace {
const RenderSurface* ResolveFrameStageOutputSurface(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState) {
switch (stage) {
case CameraFrameStage::ShadowCaster:
return shadowState.shadowCasterRequest.IsRequested()
? &shadowState.shadowCasterRequest.surface
: nullptr;
case CameraFrameStage::DepthOnly:
return plan.request.depthOnly.IsRequested()
? &plan.request.depthOnly.surface
: nullptr;
case CameraFrameStage::ObjectId:
return plan.request.objectId.IsRequested()
? &plan.request.objectId.surface
: nullptr;
default:
return plan.GetOutputSurface(stage);
}
}
RenderPassContext BuildFrameStagePassContext(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData) {
const RenderSurface* outputSurface =
ResolveFrameStageOutputSurface(stage, plan, shadowState);
return {
plan.request.context,
outputSurface != nullptr ? *outputSurface : plan.request.surface,
sceneData,
plan.GetSourceSurface(stage),
plan.GetSourceColorView(stage),
plan.GetSourceColorState(stage)
};
}
} // namespace
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFramePlan& plan,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData) {
return {
plan.request.context,
stageState.surfaceTemplate,
sceneData,
stageState.hasSourceSurface
? &stageState.sourceSurfaceTemplate
: nullptr,
stageState.sourceColorView,
stageState.sourceColorState
};
}
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
RenderGraphBuilder& graphBuilder,
RenderGraphImportedTextureRegistry& importedTextures) {
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = stage;
stageState.stageName = Containers::String(GetCameraFrameStageName(stage));
stageState.stageSequence = plan.GetPassSequence(stage);
const RenderPassContext stagePassContext =
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
stageState.surfaceTemplate = stagePassContext.surface;
stageState.hasSourceSurface = stagePassContext.sourceSurface != nullptr;
if (stageState.hasSourceSurface) {
stageState.sourceSurfaceTemplate = *stagePassContext.sourceSurface;
}
stageState.sourceColorView = stagePassContext.sourceColorView;
stageState.sourceColorState = stagePassContext.sourceColorState;
stageState.sourceSurface =
ImportRenderGraphSurface(
graphBuilder,
importedTextures,
stageState.stageName + ".Source",
stagePassContext.sourceSurface,
RenderGraphSurfaceImportUsage::Source,
IsCameraFrameFullscreenSequenceStage(stage));
stageState.outputSurface =
ImportRenderGraphSurface(
graphBuilder,
importedTextures,
stageState.stageName + ".Output",
&stagePassContext.surface,
RenderGraphSurfaceImportUsage::Output,
DoesCameraFrameStageGraphOwnColorTransitions(stage),
DoesCameraFrameStageGraphOwnDepthTransitions(stage));
stageState.outputColor =
ResolveStageOutputColorHandle(
stage,
plan,
stageState.stageName,
stagePassContext,
stageState.outputSurface,
graphBuilder);
return stageState;
}
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const DirectionalShadowExecutionState& shadowState,
CameraFrameRenderGraphResources& frameResources) {
if (stageState.stage == CameraFrameStage::ShadowCaster &&
shadowState.HasShadowSampling() &&
stageState.outputSurface.depthTexture.IsValid()) {
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
}
WriteCameraFrameRenderGraphStageSurfaceResources(
frameResources,
stageState.stage,
stageState.outputColor,
stageState.outputSurface.depthTexture);
}
} // namespace Rendering
} // namespace XCEngine

View File

@@ -0,0 +1,47 @@
#pragma once
#include <XCEngine/Rendering/RenderPass.h>
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
namespace XCEngine {
namespace Rendering {
struct CameraFrameRenderGraphResources;
struct DirectionalShadowExecutionState;
class RenderGraphBuilder;
struct CameraFrameStageGraphBuildState {
CameraFrameStage stage = CameraFrameStage::MainScene;
Containers::String stageName = {};
RenderPassSequence* stageSequence = nullptr;
RenderSurface surfaceTemplate = {};
bool hasSourceSurface = false;
RenderSurface sourceSurfaceTemplate = {};
RHI::RHIResourceView* sourceColorView = nullptr;
RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common;
RenderGraphImportedSurface sourceSurface = {};
RenderGraphImportedSurface outputSurface = {};
RenderGraphTextureHandle outputColor = {};
};
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFramePlan& plan,
const CameraFrameStageGraphBuildState& stageState,
const RenderSceneData& sceneData);
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
CameraFrameStage stage,
const CameraFramePlan& plan,
const DirectionalShadowExecutionState& shadowState,
const RenderSceneData& sceneData,
RenderGraphBuilder& graphBuilder,
RenderGraphImportedTextureRegistry& importedTextures);
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const DirectionalShadowExecutionState& shadowState,
CameraFrameRenderGraphResources& frameResources);
} // namespace Rendering
} // namespace XCEngine