diff --git a/engine/src/Rendering/Execution/CameraRenderer.cpp b/engine/src/Rendering/Execution/CameraRenderer.cpp index ae8d2cb8..67209c9f 100644 --- a/engine/src/Rendering/Execution/CameraRenderer.cpp +++ b/engine/src/Rendering/Execution/CameraRenderer.cpp @@ -616,13 +616,15 @@ const RenderSurface* ResolveFrameStageOutputSurface( bool ShouldGraphOwnStageColorTransitions( CameraFrameStage stage) { - return stage == CameraFrameStage::ObjectId; + return stage == CameraFrameStage::MainScene || + stage == CameraFrameStage::ObjectId; } bool ShouldGraphOwnStageDepthTransitions( CameraFrameStage stage) { return stage == CameraFrameStage::ShadowCaster || stage == CameraFrameStage::DepthOnly || + stage == CameraFrameStage::MainScene || stage == CameraFrameStage::ObjectId; } diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 3163663f..d0e05745 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -29,6 +29,7 @@ struct MockPipelineState { int shutdownCalls = 0; int renderCalls = 0; bool renderResult = true; + bool lastSurfaceAutoTransitionEnabled = true; uint32_t lastSurfaceWidth = 0; uint32_t lastSurfaceHeight = 0; int32_t lastRenderAreaX = 0; @@ -404,6 +405,7 @@ public: const RenderSceneData& sceneData) override { m_state->eventLog.push_back("pipeline"); ++m_state->renderCalls; + m_state->lastSurfaceAutoTransitionEnabled = surface.IsAutoTransitionEnabled(); m_state->lastSurfaceWidth = surface.GetWidth(); m_state->lastSurfaceHeight = surface.GetHeight(); const XCEngine::Math::RectInt renderArea = surface.GetRenderArea(); @@ -1413,6 +1415,33 @@ TEST(CameraRenderer_Test, ExecutesShadowCasterAndDepthOnlyRequestsBeforeMainPipe EXPECT_FLOAT_EQ(depthPassRaw->lastClearColor.a, 1.0f); } +TEST(CameraRenderer_Test, UsesGraphManagedSurfaceForMainSceneWhenOutputAttachmentsExist) { + Scene scene("CameraRendererGraphManagedMainScene"); + + GameObject* cameraObject = scene.CreateGameObject("Camera"); + auto* camera = cameraObject->AddComponent(); + camera->SetPrimary(true); + camera->SetDepth(3.0f); + + auto state = std::make_shared(); + CameraRenderer renderer(std::make_unique(state)); + + CameraRenderRequest request; + request.scene = &scene; + request.camera = camera; + request.context = CreateValidContext(); + request.surface = RenderSurface(320, 180); + request.surface.SetColorAttachment(reinterpret_cast(1)); + request.surface.SetDepthAttachment(reinterpret_cast(2)); + request.cameraDepth = camera->GetDepth(); + + ASSERT_TRUE(renderer.Render(CameraFramePlan::FromRequest(request))); + EXPECT_EQ(state->renderCalls, 1); + EXPECT_FALSE(state->lastSurfaceAutoTransitionEnabled); + EXPECT_EQ(state->lastSurfaceWidth, 320u); + EXPECT_EQ(state->lastSurfaceHeight, 180u); +} + TEST(CameraRenderer_Test, AutoAllocatesDirectionalShadowSurfaceFromShadowPlan) { Scene scene("CameraRendererAutoDirectionalShadowScene");