From 39c7ef5fdf029f948cfad0f997947de79aba12db Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 14 Apr 2026 23:15:40 +0800 Subject: [PATCH] Extract camera frame render-graph stage state module --- engine/CMakeLists.txt | 2 + .../CameraFrameRenderGraphStageRecording.cpp | 136 +----------------- .../CameraFrameRenderGraphStageState.cpp | 136 ++++++++++++++++++ .../CameraFrameRenderGraphStageState.h | 47 ++++++ 4 files changed, 186 insertions(+), 135 deletions(-) create mode 100644 engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp create mode 100644 engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 453496dc..6f71b783 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -538,6 +538,8 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphExecution.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Caches/DirectionalShadowSurfaceCache.cpp diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp index 5ac6a7e2..7db3bfda 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp @@ -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, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp new file mode 100644 index 00000000..5fae3afd --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp @@ -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 diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h new file mode 100644 index 00000000..b2cd8d7a --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h @@ -0,0 +1,47 @@ +#pragma once + +#include + +#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