From c7241338c9cb4b7a72ed419b95fbb6b95ddec4d9 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 08:10:06 +0800 Subject: [PATCH] refactor(rendering): route camera-stage recording through shared graph contract --- engine/CMakeLists.txt | 2 + .../CameraFrameRenderGraphStageContract.cpp | 63 ++++++++++++ .../CameraFrameRenderGraphStageContract.h | 32 ++++++ ...meraFrameRenderGraphStagePassRecording.cpp | 52 +++------- ...FrameRenderGraphStageSequenceRecording.cpp | 69 ++++++------- tests/Rendering/unit/CMakeLists.txt | 1 + ...mera_frame_render_graph_stage_contract.cpp | 97 +++++++++++++++++++ 7 files changed, 240 insertions(+), 76 deletions(-) create mode 100644 engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp create mode 100644 engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h create mode 100644 tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 4d521f84..ac700d1d 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -551,6 +551,8 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp new file mode 100644 index 00000000..b213ff85 --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp @@ -0,0 +1,63 @@ +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h" + +#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h" + +namespace XCEngine { +namespace Rendering { + +CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( + const CameraFrameStageGraphBuildState& stageState) { + return { + stageState.hasSourceSurface + ? &stageState.sourceSurfaceTemplate + : nullptr, + stageState.sourceColorView, + stageState.sourceColorState, + GetPrimaryColorTexture(stageState.sourceSurface) + }; +} + +RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( + const CameraFrameRenderGraphStageContext& context, + const CameraFrameStageGraphBuildState& stageState, + const Containers::String& passName, + const RenderSceneData& sceneData, + const CameraFrameRenderGraphSourceBinding& sourceBinding, + std::vector colorTargets, + RenderGraphTextureHandle depthTarget) { + return { + context.builder.graphBuilder, + passName, + context.plan.request.context, + sceneData, + stageState.surfaceTemplate, + sourceBinding.sourceSurfaceTemplate, + sourceBinding.sourceColorView, + sourceBinding.sourceColorState, + sourceBinding.sourceColor, + std::move(colorTargets), + depthTarget, + &context.builder.stageExecutionSucceeded, + &context.builder.blackboard + }; +} + +RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( + const CameraFrameRenderGraphStageContext& context, + const CameraFrameStageGraphBuildState& stageState, + const Containers::String& passName, + const RenderSceneData& sceneData, + std::vector colorTargets, + RenderGraphTextureHandle depthTarget) { + return BuildCameraFrameStageGraphRecordingContext( + context, + stageState, + passName, + sceneData, + BuildCameraFrameStageGraphSourceBinding(stageState), + std::move(colorTargets), + depthTarget); +} + +} // namespace Rendering +} // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h new file mode 100644 index 00000000..5eb98e5b --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" + +namespace XCEngine { +namespace Rendering { + +CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( + const CameraFrameStageGraphBuildState& stageState); + +RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( + const CameraFrameRenderGraphStageContext& context, + const CameraFrameStageGraphBuildState& stageState, + const Containers::String& passName, + const RenderSceneData& sceneData, + const CameraFrameRenderGraphSourceBinding& sourceBinding, + std::vector colorTargets, + RenderGraphTextureHandle depthTarget); + +RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( + const CameraFrameRenderGraphStageContext& context, + const CameraFrameStageGraphBuildState& stageState, + const Containers::String& passName, + const RenderSceneData& sceneData, + std::vector colorTargets, + RenderGraphTextureHandle depthTarget); + +} // namespace Rendering +} // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp index 1463adf4..6c96f779 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp @@ -2,12 +2,12 @@ #include "Debug/Logger.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h" #include "Rendering/Graph/RenderGraph.h" -#include namespace XCEngine { namespace Rendering { @@ -46,26 +46,15 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( return true; }; - const RenderGraphRecordingContext commonContext = { - builder.graphBuilder, - stageState.stageName, - context.plan.request.context, - stageSceneData, - stageState.surfaceTemplate, - stageState.hasSourceSurface - ? &stageState.sourceSurfaceTemplate - : nullptr, - stageState.sourceColorView, - stageState.sourceColorState, - GetPrimaryColorTexture(stageState.sourceSurface), - std::vector{ stageState.outputColor }, - stageState.outputSurface.depthTexture, - &builder.stageExecutionSucceeded, - &builder.blackboard - }; const RenderPassRenderGraphContext standalonePassContext = BuildRenderPassRenderGraphContext( - commonContext, + BuildCameraFrameStageGraphRecordingContext( + context, + stageState, + stageState.stageName, + stageSceneData, + std::vector{ stageState.outputColor }, + stageState.outputSurface.depthTexture), beginStandalonePass); if (!standaloneStagePass->RecordRenderGraph(standalonePassContext)) { Debug::Logger::Get().Error( @@ -91,26 +80,15 @@ bool TryRecordCameraFrameMainSceneGraphPass( } handled = true; - const RenderGraphRecordingContext commonContext = { - builder.graphBuilder, - stageState.stageName, - context.plan.request.context, - context.sceneData, - stageState.surfaceTemplate, - stageState.hasSourceSurface - ? &stageState.sourceSurfaceTemplate - : nullptr, - stageState.sourceColorView, - stageState.sourceColorState, - GetPrimaryColorTexture(stageState.sourceSurface), - std::vector{ stageState.outputColor }, - stageState.outputSurface.depthTexture, - &builder.stageExecutionSucceeded, - &builder.blackboard - }; const RenderPipelineMainSceneRenderGraphContext mainSceneContext = BuildRenderPipelineMainSceneRenderGraphContext( - commonContext); + BuildCameraFrameStageGraphRecordingContext( + context, + stageState, + stageState.stageName, + context.sceneData, + std::vector{ stageState.outputColor }, + stageState.outputSurface.depthTexture)); if (!builder.executionState.pipeline->RecordMainSceneRenderGraph(mainSceneContext)) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp index 337c0176..3f90f414 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp @@ -2,11 +2,11 @@ #include "Debug/Logger.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h" #include "Rendering/Graph/RenderGraph.h" -#include #include namespace XCEngine { @@ -57,13 +57,13 @@ bool RecordSequencePass( bool RecordRegularPassSequenceStage( CameraFrameStage stage, const Containers::String& stageName, + const CameraFrameRenderGraphStageContext& stageContext, + const CameraFrameStageGraphBuildState& stageState, const RenderPassContext& stagePassContext, const RenderGraphImportedSurface& outputSurface, const RenderSceneData& sceneData, RenderPassSequence* stageSequence, CameraFrameExecutionState& executionState, - RenderGraphBuilder& graphBuilder, - RenderGraphBlackboard& blackboard, bool& stageExecutionSucceeded) { if (stageSequence == nullptr || stageSequence->GetPassCount() == 0u) { return true; @@ -103,24 +103,16 @@ bool RecordRegularPassSequenceStage( stageSequence->GetPassCount() == 1u ? stageName : BuildRenderGraphSequencePassName(stageName, passIndex); - const RenderGraphRecordingContext commonContext = { - graphBuilder, - passName, - stagePassContext.renderContext, - sceneData, - stagePassContext.surface, - stagePassContext.sourceSurface, - stagePassContext.sourceColorView, - stagePassContext.sourceColorState, - {}, - outputSurface.colorTextures, - outputSurface.depthTexture, - &stageExecutionSucceeded, - &blackboard - }; const RenderPassRenderGraphContext passContext = BuildRenderPassRenderGraphContext( - commonContext, + BuildCameraFrameStageGraphRecordingContext( + stageContext, + stageState, + passName, + sceneData, + BuildCameraFrameStageGraphSourceBinding(stageState), + outputSurface.colorTextures, + outputSurface.depthTexture), beginSequencePass); if (!RecordSequencePass( *pass, @@ -140,6 +132,8 @@ bool RecordRegularPassSequenceStage( bool RecordFullscreenPassSequenceStage( CameraFrameStage stage, const Containers::String& stageName, + const CameraFrameRenderGraphStageContext& stageContext, + const CameraFrameStageGraphBuildState& stageState, const RenderPassContext& stagePassContext, const CameraFrameRenderGraphSourceBinding& binding, RenderGraphTextureHandle finalOutputColor, @@ -147,7 +141,6 @@ bool RecordFullscreenPassSequenceStage( RenderPassSequence* stageSequence, CameraFrameExecutionState& executionState, RenderGraphBuilder& graphBuilder, - RenderGraphBlackboard& blackboard, bool& stageExecutionSucceeded) { if (stageSequence == nullptr || stageSequence->GetPassCount() == 0u) { return true; @@ -208,24 +201,21 @@ bool RecordFullscreenPassSequenceStage( passIndex == 0u ? binding.sourceColorState : RHI::ResourceStates::PixelShaderResource; - const RenderGraphRecordingContext commonContext = { - graphBuilder, - passName, - stagePassContext.renderContext, - sceneData, - stagePassContext.surface, - sourceSurfaceTemplate, - sourceColorView, - sourceColorState, - currentSourceColor, - std::vector{ passOutputColor }, - {}, - &stageExecutionSucceeded, - &blackboard - }; const RenderPassRenderGraphContext passContext = BuildRenderPassRenderGraphContext( - commonContext, + BuildCameraFrameStageGraphRecordingContext( + stageContext, + stageState, + passName, + sceneData, + { + sourceSurfaceTemplate, + sourceColorView, + sourceColorState, + currentSourceColor + }, + std::vector{ passOutputColor }, + {}), beginSequencePass); if (!RecordSequencePass( *pass, @@ -267,6 +257,8 @@ bool TryRecordCameraFrameStageSequence( ? RecordFullscreenPassSequenceStage( stageState.stage, stageState.stageName, + context, + stageState, stagePassContext, ResolveCameraFrameFullscreenStageGraphSourceBinding( context.plan, @@ -282,18 +274,17 @@ bool TryRecordCameraFrameStageSequence( stageState.stageSequence, builder.executionState, builder.graphBuilder, - builder.blackboard, builder.stageExecutionSucceeded) : RecordRegularPassSequenceStage( stageState.stage, stageState.stageName, + context, + stageState, stagePassContext, stageState.outputSurface, context.sceneData, stageState.stageSequence, builder.executionState, - builder.graphBuilder, - builder.blackboard, builder.stageExecutionSucceeded); if (!recordResult) { Debug::Logger::Get().Error( diff --git a/tests/Rendering/unit/CMakeLists.txt b/tests/Rendering/unit/CMakeLists.txt index 3cb4f060..0a493eb2 100644 --- a/tests/Rendering/unit/CMakeLists.txt +++ b/tests/Rendering/unit/CMakeLists.txt @@ -7,6 +7,7 @@ set(RENDERING_UNIT_TEST_SOURCES test_object_id_encoding.cpp test_builtin_forward_pipeline.cpp test_camera_frame_render_graph_frame_data.cpp + test_camera_frame_render_graph_stage_contract.cpp test_builtin_gaussian_splat_pass_resources.cpp test_camera_frame_render_graph_stage_policy.cpp test_camera_scene_renderer.cpp diff --git a/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp b/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp new file mode 100644 index 00000000..2ca62c1d --- /dev/null +++ b/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp @@ -0,0 +1,97 @@ +#include + +#include +#include +#include + +#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRuntime.h" +#include "Rendering/Graph/RenderGraph.h" + +using namespace XCEngine::Rendering; + +TEST(CameraFrameRenderGraphStageContract_Test, BuildsSourceBindingFromStageState) { + CameraFrameStageGraphBuildState stageState = {}; + stageState.hasSourceSurface = true; + stageState.sourceSurfaceTemplate = RenderSurface(640, 360); + stageState.sourceColorView = + reinterpret_cast(11); + stageState.sourceColorState = XCEngine::RHI::ResourceStates::CopySrc; + stageState.sourceSurface.colorTextures.push_back(RenderGraphTextureHandle{ 7u }); + + const CameraFrameRenderGraphSourceBinding binding = + BuildCameraFrameStageGraphSourceBinding(stageState); + + EXPECT_EQ(binding.sourceSurfaceTemplate, &stageState.sourceSurfaceTemplate); + EXPECT_EQ(binding.sourceColorView, stageState.sourceColorView); + EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc); + EXPECT_EQ(binding.sourceColor.index, 7u); +} + +TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageStateAndOverrides) { + RenderGraph graph = {}; + RenderGraphBuilder graphBuilder(graph); + RenderGraphBlackboard blackboard = {}; + CameraFrameRenderGraphFrameData& frameData = + EmplaceCameraFrameRenderGraphFrameData(blackboard); + RenderGraphImportedTextureRegistry importedTextures = {}; + CameraFrameExecutionState executionState = {}; + bool stageExecutionSucceeded = true; + CameraFrameRenderGraphBuilderContext builderContext = { + graphBuilder, + blackboard, + frameData, + importedTextures, + executionState, + stageExecutionSucceeded + }; + CameraFramePlan plan = {}; + plan.request.context.backendType = XCEngine::RHI::RHIType::D3D12; + DirectionalShadowExecutionState shadowState = {}; + RenderSceneData sceneData = {}; + const CameraFrameRenderGraphStageContext context = { + plan, + shadowState, + sceneData, + builderContext + }; + + CameraFrameStageGraphBuildState stageState = {}; + stageState.stageName = "PostProcess"; + stageState.surfaceTemplate = RenderSurface(800, 600); + RenderSurface sourceSurface(800, 600); + + const RenderGraphRecordingContext recordingContext = + BuildCameraFrameStageGraphRecordingContext( + context, + stageState, + "PostProcess.Pass0", + sceneData, + { + &sourceSurface, + reinterpret_cast(22), + XCEngine::RHI::ResourceStates::PixelShaderResource, + RenderGraphTextureHandle{ 9u } + }, + std::vector{ RenderGraphTextureHandle{ 13u } }, + RenderGraphTextureHandle{ 14u }); + + EXPECT_EQ(&recordingContext.graphBuilder, &graphBuilder); + EXPECT_STREQ(recordingContext.passName.CStr(), "PostProcess.Pass0"); + EXPECT_EQ(&recordingContext.renderContext, &plan.request.context); + EXPECT_EQ(&recordingContext.sceneData, &sceneData); + EXPECT_EQ(recordingContext.sourceSurface, &sourceSurface); + EXPECT_EQ( + recordingContext.sourceColorView, + reinterpret_cast(22)); + EXPECT_EQ( + recordingContext.sourceColorState, + XCEngine::RHI::ResourceStates::PixelShaderResource); + EXPECT_EQ(recordingContext.sourceColorTexture.index, 9u); + ASSERT_EQ(recordingContext.colorTargets.size(), 1u); + EXPECT_EQ(recordingContext.colorTargets[0].index, 13u); + EXPECT_EQ(recordingContext.depthTarget.index, 14u); + EXPECT_EQ(recordingContext.executionSucceeded, &stageExecutionSucceeded); + EXPECT_EQ(recordingContext.blackboard, &blackboard); +}