From ac5bf9976d6f8e30c492e0dd85c51be6d5de3af1 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 08:14:13 +0800 Subject: [PATCH] refactor(rendering): formalize camera-stage fallback surface contract --- .../CameraFrameRenderGraphStageContract.cpp | 46 +++++++++++++++ .../CameraFrameRenderGraphStageContract.h | 18 ++++++ ...meraFrameRenderGraphStagePassRecording.cpp | 57 +++++-------------- ...mera_frame_render_graph_stage_contract.cpp | 57 +++++++++++++++++++ 4 files changed, 135 insertions(+), 43 deletions(-) diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp index b213ff85..4b7f9478 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp @@ -59,5 +59,51 @@ RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( depthTarget); } +CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurfaceResolution( + const CameraFrameStageGraphBuildState& stageState, + bool graphOwnsSourceTransitions, + bool graphOwnsOutputTransitions) { + CameraFrameStageFallbackSurfaceResolution resolution = {}; + resolution.hasSourceSurface = stageState.hasSourceSurface; + resolution.sourceColorView = stageState.sourceColorView; + resolution.sourceColorState = stageState.sourceColorState; + resolution.outputSurface = graphOwnsOutputTransitions + ? BuildGraphManagedPassSurface(stageState.surfaceTemplate) + : stageState.surfaceTemplate; + + if (!stageState.hasSourceSurface) { + return resolution; + } + + resolution.sourceSurface = stageState.sourceSurfaceTemplate; + if (IsCameraFrameFullscreenSequenceStage(stageState.stage) && + graphOwnsSourceTransitions) { + resolution.sourceSurface = + BuildGraphManagedImportedSurface( + stageState.sourceSurfaceTemplate, + RHI::ResourceStates::PixelShaderResource, + RHI::ResourceStates::PixelShaderResource); + resolution.sourceColorState = RHI::ResourceStates::PixelShaderResource; + } + + return resolution; +} + +RenderPassContext BuildCameraFrameStageFallbackPassContext( + const CameraFrameStageFallbackSurfaceResolution& resolution, + const RenderContext& renderContext, + const RenderSceneData& sceneData) { + return { + renderContext, + resolution.outputSurface, + sceneData, + resolution.hasSourceSurface + ? &resolution.sourceSurface + : nullptr, + resolution.sourceColorView, + resolution.sourceColorState + }; +} + } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h index 5eb98e5b..df239b25 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h @@ -8,6 +8,14 @@ namespace XCEngine { namespace Rendering { +struct CameraFrameStageFallbackSurfaceResolution { + RenderSurface sourceSurface = {}; + RenderSurface outputSurface = {}; + bool hasSourceSurface = false; + RHI::RHIResourceView* sourceColorView = nullptr; + RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common; +}; + CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( const CameraFrameStageGraphBuildState& stageState); @@ -28,5 +36,15 @@ RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( std::vector colorTargets, RenderGraphTextureHandle depthTarget); +CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurfaceResolution( + const CameraFrameStageGraphBuildState& stageState, + bool graphOwnsSourceTransitions, + bool graphOwnsOutputTransitions); + +RenderPassContext BuildCameraFrameStageFallbackPassContext( + const CameraFrameStageFallbackSurfaceResolution& resolution, + const RenderContext& renderContext, + const RenderSceneData& sceneData); + } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp index 6c96f779..79b14fdb 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp @@ -128,49 +128,20 @@ void AddCameraFrameStageFallbackRasterPass( return; } - const RenderSurface* resolvedSourceSurface = - capturedStageState.hasSourceSurface - ? &capturedStageState.sourceSurfaceTemplate - : nullptr; - RHI::RHIResourceView* resolvedSourceColorView = - capturedStageState.sourceColorView; - RHI::ResourceStates resolvedSourceColorState = - capturedStageState.sourceColorState; - RenderSurface graphManagedSourceSurface = {}; - if (IsCameraFrameFullscreenSequenceStage(capturedStageState.stage) && - capturedStageState.hasSourceSurface && - CanUseGraphManagedImportedSurface( - capturedStageState.sourceSurface, - executionContext)) { - graphManagedSourceSurface = - BuildGraphManagedImportedSurface( - capturedStageState.sourceSurfaceTemplate, - RHI::ResourceStates::PixelShaderResource, - RHI::ResourceStates::PixelShaderResource); - resolvedSourceSurface = &graphManagedSourceSurface; - resolvedSourceColorState = RHI::ResourceStates::PixelShaderResource; - } - - const RenderSurface* resolvedOutputSurface = - &capturedStageState.surfaceTemplate; - RenderSurface graphManagedOutputSurface = {}; - if (CanUseGraphManagedImportedSurface( - capturedStageState.outputSurface, - executionContext)) { - graphManagedOutputSurface = - BuildGraphManagedPassSurface( - capturedStageState.surfaceTemplate); - resolvedOutputSurface = &graphManagedOutputSurface; - } - - const RenderPassContext passContextOverride = { - planPtr->request.context, - *resolvedOutputSurface, - *sceneDataPtr, - resolvedSourceSurface, - resolvedSourceColorView, - resolvedSourceColorState - }; + const CameraFrameStageFallbackSurfaceResolution surfaceResolution = + ResolveCameraFrameStageFallbackSurfaceResolution( + capturedStageState, + CanUseGraphManagedImportedSurface( + capturedStageState.sourceSurface, + executionContext), + CanUseGraphManagedImportedSurface( + capturedStageState.outputSurface, + executionContext)); + const RenderPassContext passContextOverride = + BuildCameraFrameStageFallbackPassContext( + surfaceResolution, + planPtr->request.context, + *sceneDataPtr); *stageExecutionSucceeded = ExecuteCameraFrameRecordedStage( capturedStageState.stage, { 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 index 2ca62c1d..48f6798a 100644 --- a/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp +++ b/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp @@ -95,3 +95,60 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageSt EXPECT_EQ(recordingContext.executionSucceeded, &stageExecutionSucceeded); EXPECT_EQ(recordingContext.blackboard, &blackboard); } + +TEST(CameraFrameRenderGraphStageContract_Test, ResolvesFullscreenFallbackSurfaceOverrides) { + CameraFrameStageGraphBuildState stageState = {}; + stageState.stage = CameraFrameStage::PostProcess; + stageState.hasSourceSurface = true; + stageState.surfaceTemplate = RenderSurface(800, 600); + stageState.surfaceTemplate.SetAutoTransitionEnabled(true); + stageState.sourceSurfaceTemplate = RenderSurface(800, 600); + stageState.sourceSurfaceTemplate.SetAutoTransitionEnabled(true); + stageState.sourceColorView = + reinterpret_cast(31); + stageState.sourceColorState = XCEngine::RHI::ResourceStates::CopySrc; + + const CameraFrameStageFallbackSurfaceResolution resolution = + ResolveCameraFrameStageFallbackSurfaceResolution( + stageState, + true, + true); + + EXPECT_TRUE(resolution.hasSourceSurface); + EXPECT_FALSE(resolution.sourceSurface.IsAutoTransitionEnabled()); + EXPECT_FALSE(resolution.outputSurface.IsAutoTransitionEnabled()); + EXPECT_EQ(resolution.sourceColorView, stageState.sourceColorView); + EXPECT_EQ( + resolution.sourceColorState, + XCEngine::RHI::ResourceStates::PixelShaderResource); +} + +TEST(CameraFrameRenderGraphStageContract_Test, BuildsFallbackPassContextFromResolvedSurfaces) { + CameraFrameStageFallbackSurfaceResolution resolution = {}; + resolution.hasSourceSurface = true; + resolution.sourceSurface = RenderSurface(320, 180); + resolution.outputSurface = RenderSurface(640, 360); + resolution.sourceColorView = + reinterpret_cast(41); + resolution.sourceColorState = XCEngine::RHI::ResourceStates::PixelShaderResource; + + RenderContext renderContext = {}; + renderContext.backendType = XCEngine::RHI::RHIType::D3D12; + RenderSceneData sceneData = {}; + + const RenderPassContext passContext = + BuildCameraFrameStageFallbackPassContext( + resolution, + renderContext, + sceneData); + + EXPECT_EQ(&passContext.renderContext, &renderContext); + EXPECT_EQ(&passContext.sceneData, &sceneData); + ASSERT_NE(passContext.sourceSurface, nullptr); + EXPECT_EQ(passContext.sourceSurface->GetWidth(), 320u); + EXPECT_EQ(passContext.surface.GetWidth(), 640u); + EXPECT_EQ(passContext.sourceColorView, resolution.sourceColorView); + EXPECT_EQ( + passContext.sourceColorState, + XCEngine::RHI::ResourceStates::PixelShaderResource); +}