From 5edc4ed2429873b28d1e515d6ae71ec6dd062ad0 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 00:13:35 +0800 Subject: [PATCH] Extract camera frame render-graph stage pass runtime --- engine/CMakeLists.txt | 2 + ...meraFrameRenderGraphStagePassRecording.cpp | 209 ++---------------- ...CameraFrameRenderGraphStagePassRuntime.cpp | 186 ++++++++++++++++ .../CameraFrameRenderGraphStagePassRuntime.h | 36 +++ 4 files changed, 241 insertions(+), 192 deletions(-) create mode 100644 engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.cpp create mode 100644 engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index ef92c667..fa179b52 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -547,6 +547,8 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.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 diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp index 6ba13475..996d9609 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp @@ -2,8 +2,8 @@ #include "Debug/Logger.h" #include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h" -#include "Rendering/Execution/DirectionalShadowExecutionState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h" @@ -12,192 +12,15 @@ namespace XCEngine { namespace Rendering { -namespace { - -bool InitializeStandalonePass( - RenderPass* pass, - const RenderContext& context) { - if (pass == nullptr) { - return false; - } - - if (pass->Initialize(context)) { - return true; - } - - pass->Shutdown(); - return false; -} - -RenderSceneData BuildScenePassRequestSceneData( - const ScenePassRenderRequest& request, - const RenderSurface& requestSurface, - const RenderSceneData& baseSceneData) { - RenderSceneData sceneData = baseSceneData; - if (request.hasCameraDataOverride) { - sceneData.cameraData = request.cameraDataOverride; - } - - sceneData.cameraData.viewportWidth = requestSurface.GetRenderAreaWidth(); - sceneData.cameraData.viewportHeight = requestSurface.GetRenderAreaHeight(); - sceneData.cameraData.clearFlags = request.clearFlags; - if (request.hasClearColorOverride) { - sceneData.cameraData.clearColor = request.clearColorOverride; - } - - return sceneData; -} - -bool ExecuteScenePassRequest( - RenderPass* pass, - const ScenePassRenderRequest& request, - const RenderContext& context, - const RenderSceneData& baseSceneData, - const RenderSurface* surfaceOverride = nullptr) { - if (!request.IsRequested()) { - return true; - } - - if (!InitializeStandalonePass(pass, context)) { - return false; - } - - const RenderSurface& requestSurface = - surfaceOverride != nullptr ? *surfaceOverride : request.surface; - const RenderSceneData sceneData = - BuildScenePassRequestSceneData( - request, - requestSurface, - baseSceneData); - - const RenderPassContext passContext = { - context, - requestSurface, - sceneData, - nullptr, - nullptr, - RHI::ResourceStates::Common - }; - return pass->Execute(passContext); -} - -bool ExecuteStandalonePass( - RenderPass* pass, - const RenderContext& context, - const RenderSurface& surface, - const RenderSceneData& sceneData) { - if (pass == nullptr) { - return false; - } - - if (!InitializeStandalonePass(pass, context)) { - return false; - } - - const RenderPassContext passContext = { - context, - surface, - sceneData, - nullptr, - nullptr, - RHI::ResourceStates::Common - }; - return pass->Execute(passContext); -} - -RenderSceneData BuildStandaloneStageSceneData( - CameraFrameStage stage, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& baseSceneData, - const RenderSurface& stageSurface) { - if (stage == CameraFrameStage::ShadowCaster && - shadowState.shadowCasterRequest.IsRequested()) { - return BuildScenePassRequestSceneData( - shadowState.shadowCasterRequest, - stageSurface, - baseSceneData); - } - - if (const ScenePassRenderRequest* request = plan.GetScenePassRequest(stage); - request != nullptr) { - return BuildScenePassRequestSceneData( - *request, - stageSurface, - baseSceneData); - } - - return baseSceneData; -} - -RenderPass* ResolveStandaloneStagePass( - CameraFrameStage stage, - CameraFrameExecutionState& executionState) { - switch (stage) { - case CameraFrameStage::ShadowCaster: - return executionState.shadowCasterPass; - case CameraFrameStage::DepthOnly: - return executionState.depthOnlyPass; - case CameraFrameStage::ObjectId: - return executionState.objectIdPass; - default: - return nullptr; - } -} - -bool ExecuteRecordedFrameStage( - CameraFrameStage stage, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameExecutionState& executionState, - const RenderPassContext& passContext) { - switch (stage) { - case CameraFrameStage::ShadowCaster: - return ExecuteScenePassRequest( - executionState.shadowCasterPass, - shadowState.shadowCasterRequest, - plan.request.context, - sceneData, - &passContext.surface); - case CameraFrameStage::DepthOnly: - return ExecuteScenePassRequest( - executionState.depthOnlyPass, - plan.request.depthOnly, - plan.request.context, - sceneData, - &passContext.surface); - case CameraFrameStage::MainScene: - return executionState.pipeline != nullptr && - executionState.pipeline->Render( - FrameExecutionContext( - plan.request.context, - passContext.surface, - sceneData, - passContext.sourceSurface, - passContext.sourceColorView, - passContext.sourceColorState)); - case CameraFrameStage::ObjectId: - return !plan.request.objectId.IsRequested() || - ExecuteStandalonePass( - executionState.objectIdPass, - plan.request.context, - passContext.surface, - sceneData); - default: - return false; - } -} - -} // namespace - bool TryRecordCameraFrameStageStandaloneRenderGraphPass( const CameraFrameStageGraphBuildState& stageState, const CameraFrameRenderGraphStageRecordContext& context, bool& handled) { CameraFrameRenderGraphRecordingSession& session = context.session; RenderPass* const standaloneStagePass = - ResolveStandaloneStagePass(stageState.stage, session.executionState); + ResolveCameraFrameStandaloneStagePass( + stageState.stage, + session.executionState); if (standaloneStagePass == nullptr || !standaloneStagePass->SupportsRenderGraph()) { handled = false; @@ -206,17 +29,15 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( handled = true; const RenderSceneData stageSceneData = - BuildStandaloneStageSceneData( + BuildCameraFrameStandaloneStageSceneData( stageState.stage, - context.plan, - context.shadowState, - context.sceneData, + context, stageState.surfaceTemplate); bool* const stageExecutionSucceeded = &session.stageExecutionSucceeded; const RenderPassGraphBeginCallback beginStandalonePass = [stageExecutionSucceeded, standaloneStagePass, renderContext = &context.plan.request.context]( const RenderPassContext&) -> bool { - if (!InitializeStandalonePass( + if (!InitializeCameraFrameStandalonePass( standaloneStagePass, *renderContext)) { *stageExecutionSucceeded = false; @@ -301,12 +122,13 @@ void AddCameraFrameStageFallbackRasterPass( const CameraFrameStageGraphBuildState capturedStageState = stageState; CameraFrameExecutionState* const executionState = &session.executionState; bool* const stageExecutionSucceeded = &session.stageExecutionSucceeded; + CameraFrameRenderGraphRecordingSession* const sessionPtr = &session; 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]( + [capturedStageState, executionState, stageExecutionSucceeded, sessionPtr, planPtr, shadowStatePtr, sceneDataPtr]( RenderGraphPassBuilder& passBuilder) { if (IsCameraFrameFullscreenSequenceStage(capturedStageState.stage)) { ReadRenderGraphColorSurface(passBuilder, capturedStageState.sourceSurface); @@ -316,7 +138,7 @@ void AddCameraFrameStageFallbackRasterPass( WriteRenderGraphSurface(passBuilder, capturedStageState.outputSurface); } passBuilder.SetExecuteCallback( - [capturedStageState, executionState, stageExecutionSucceeded, planPtr, shadowStatePtr, sceneDataPtr]( + [capturedStageState, executionState, stageExecutionSucceeded, sessionPtr, planPtr, shadowStatePtr, sceneDataPtr]( const RenderGraphExecutionContext& executionContext) { if (!*stageExecutionSucceeded) { return; @@ -365,11 +187,14 @@ void AddCameraFrameStageFallbackRasterPass( resolvedSourceColorView, resolvedSourceColorState }; - *stageExecutionSucceeded = ExecuteRecordedFrameStage( + *stageExecutionSucceeded = ExecuteCameraFrameRecordedStage( capturedStageState.stage, - *planPtr, - *shadowStatePtr, - *sceneDataPtr, + { + *planPtr, + *shadowStatePtr, + *sceneDataPtr, + *sessionPtr + }, *executionState, passContextOverride); }); diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.cpp new file mode 100644 index 00000000..88052e7b --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.cpp @@ -0,0 +1,186 @@ +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h" + +#include "Rendering/Execution/DirectionalShadowExecutionState.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRuntime.h" + +namespace XCEngine { +namespace Rendering { + +namespace { + +RenderSceneData BuildScenePassRequestSceneData( + const ScenePassRenderRequest& request, + const RenderSurface& requestSurface, + const RenderSceneData& baseSceneData) { + RenderSceneData sceneData = baseSceneData; + if (request.hasCameraDataOverride) { + sceneData.cameraData = request.cameraDataOverride; + } + + sceneData.cameraData.viewportWidth = requestSurface.GetRenderAreaWidth(); + sceneData.cameraData.viewportHeight = requestSurface.GetRenderAreaHeight(); + sceneData.cameraData.clearFlags = request.clearFlags; + if (request.hasClearColorOverride) { + sceneData.cameraData.clearColor = request.clearColorOverride; + } + + return sceneData; +} + +bool ExecuteScenePassRequest( + RenderPass* pass, + const ScenePassRenderRequest& request, + const RenderContext& context, + const RenderSceneData& baseSceneData, + const RenderSurface* surfaceOverride = nullptr) { + if (!request.IsRequested()) { + return true; + } + + if (!InitializeCameraFrameStandalonePass(pass, context)) { + return false; + } + + const RenderSurface& requestSurface = + surfaceOverride != nullptr ? *surfaceOverride : request.surface; + const RenderSceneData sceneData = + BuildScenePassRequestSceneData( + request, + requestSurface, + baseSceneData); + + const RenderPassContext passContext = { + context, + requestSurface, + sceneData, + nullptr, + nullptr, + RHI::ResourceStates::Common + }; + return pass->Execute(passContext); +} + +bool ExecuteStandalonePass( + RenderPass* pass, + const RenderContext& context, + const RenderSurface& surface, + const RenderSceneData& sceneData) { + if (pass == nullptr) { + return false; + } + + if (!InitializeCameraFrameStandalonePass(pass, context)) { + return false; + } + + const RenderPassContext passContext = { + context, + surface, + sceneData, + nullptr, + nullptr, + RHI::ResourceStates::Common + }; + return pass->Execute(passContext); +} + +} // namespace + +bool InitializeCameraFrameStandalonePass( + RenderPass* pass, + const RenderContext& context) { + if (pass == nullptr) { + return false; + } + + if (pass->Initialize(context)) { + return true; + } + + pass->Shutdown(); + return false; +} + +RenderSceneData BuildCameraFrameStandaloneStageSceneData( + CameraFrameStage stage, + const CameraFrameRenderGraphStageRecordContext& context, + const RenderSurface& stageSurface) { + if (stage == CameraFrameStage::ShadowCaster && + context.shadowState.shadowCasterRequest.IsRequested()) { + return BuildScenePassRequestSceneData( + context.shadowState.shadowCasterRequest, + stageSurface, + context.sceneData); + } + + if (const ScenePassRenderRequest* request = context.plan.GetScenePassRequest(stage); + request != nullptr) { + return BuildScenePassRequestSceneData( + *request, + stageSurface, + context.sceneData); + } + + return context.sceneData; +} + +RenderPass* ResolveCameraFrameStandaloneStagePass( + CameraFrameStage stage, + CameraFrameExecutionState& executionState) { + switch (stage) { + case CameraFrameStage::ShadowCaster: + return executionState.shadowCasterPass; + case CameraFrameStage::DepthOnly: + return executionState.depthOnlyPass; + case CameraFrameStage::ObjectId: + return executionState.objectIdPass; + default: + return nullptr; + } +} + +bool ExecuteCameraFrameRecordedStage( + CameraFrameStage stage, + const CameraFrameRenderGraphStageRecordContext& context, + CameraFrameExecutionState& executionState, + const RenderPassContext& passContext) { + switch (stage) { + case CameraFrameStage::ShadowCaster: + return ExecuteScenePassRequest( + executionState.shadowCasterPass, + context.shadowState.shadowCasterRequest, + context.plan.request.context, + context.sceneData, + &passContext.surface); + case CameraFrameStage::DepthOnly: + return ExecuteScenePassRequest( + executionState.depthOnlyPass, + context.plan.request.depthOnly, + context.plan.request.context, + context.sceneData, + &passContext.surface); + case CameraFrameStage::MainScene: + return executionState.pipeline != nullptr && + executionState.pipeline->Render( + FrameExecutionContext( + context.plan.request.context, + passContext.surface, + context.sceneData, + passContext.sourceSurface, + passContext.sourceColorView, + passContext.sourceColorState)); + case CameraFrameStage::ObjectId: + return !context.plan.request.objectId.IsRequested() || + ExecuteStandalonePass( + executionState.objectIdPass, + context.plan.request.context, + passContext.surface, + context.sceneData); + default: + return false; + } +} + +} // namespace Rendering +} // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h new file mode 100644 index 00000000..3a9c30a4 --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +namespace XCEngine { +namespace Rendering { + +struct CameraFrameExecutionState; +struct CameraFrameRenderGraphStageRecordContext; +struct RenderPassContext; +struct RenderSceneData; +class RenderPass; +class RenderSurface; + +bool InitializeCameraFrameStandalonePass( + RenderPass* pass, + const RenderContext& context); + +RenderSceneData BuildCameraFrameStandaloneStageSceneData( + CameraFrameStage stage, + const CameraFrameRenderGraphStageRecordContext& context, + const RenderSurface& stageSurface); + +RenderPass* ResolveCameraFrameStandaloneStagePass( + CameraFrameStage stage, + CameraFrameExecutionState& executionState); + +bool ExecuteCameraFrameRecordedStage( + CameraFrameStage stage, + const CameraFrameRenderGraphStageRecordContext& context, + CameraFrameExecutionState& executionState, + const RenderPassContext& passContext); + +} // namespace Rendering +} // namespace XCEngine