Track fullscreen surface states across frames
This commit is contained in:
@@ -2057,6 +2057,148 @@ TEST(SceneRenderer_Test, RoutesPostProcessIntoIntermediateSurfaceBeforeFinalOutp
|
||||
delete backBufferColorView;
|
||||
}
|
||||
|
||||
TEST(SceneRenderer_Test, ReusesTrackedSceneColorStateAcrossFramesWhenPostProcessIsEnabled) {
|
||||
Scene scene("SceneRendererTrackedSceneColorStateScene");
|
||||
|
||||
GameObject* cameraObject = scene.CreateGameObject("Camera");
|
||||
auto* camera = cameraObject->AddComponent<CameraComponent>();
|
||||
camera->SetPrimary(true);
|
||||
camera->SetDepth(2.0f);
|
||||
camera->SetPostProcessPasses({
|
||||
XCEngine::Rendering::CameraPostProcessPassDesc::MakeColorScale(
|
||||
XCEngine::Math::Vector4(1.0f, 0.9f, 0.8f, 1.0f))
|
||||
});
|
||||
|
||||
auto pipelineState = std::make_shared<MockPipelineState>();
|
||||
auto allocationState = std::make_shared<MockShadowAllocationState>();
|
||||
MockShadowDevice device(allocationState);
|
||||
|
||||
RenderContext context = CreateValidContext();
|
||||
context.device = &device;
|
||||
|
||||
auto* backBufferColorView = new MockShadowView(
|
||||
allocationState,
|
||||
XCEngine::RHI::ResourceViewType::RenderTarget,
|
||||
XCEngine::RHI::Format::R8G8B8A8_UNorm,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D);
|
||||
auto* depthView = new MockShadowView(
|
||||
allocationState,
|
||||
XCEngine::RHI::ResourceViewType::DepthStencil,
|
||||
XCEngine::RHI::Format::D24_UNorm_S8_UInt,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D);
|
||||
|
||||
RenderSurface surface(800, 600);
|
||||
surface.SetColorAttachment(backBufferColorView);
|
||||
surface.SetDepthAttachment(depthView);
|
||||
|
||||
SceneRenderer renderer(std::make_unique<MockPipeline>(pipelineState));
|
||||
|
||||
std::vector<CameraRenderRequest> firstFrameRequests =
|
||||
renderer.BuildRenderRequests(scene, nullptr, context, surface);
|
||||
ASSERT_EQ(firstFrameRequests.size(), 1u);
|
||||
EXPECT_EQ(
|
||||
firstFrameRequests[0].GetMainSceneSurface().GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::Common);
|
||||
|
||||
RenderPassSequence postProcessPasses;
|
||||
postProcessPasses.AddPass(std::make_unique<MockScenePass>(pipelineState, "postProcess"));
|
||||
firstFrameRequests[0].postProcess.passes = &postProcessPasses;
|
||||
|
||||
ASSERT_TRUE(renderer.Render(firstFrameRequests));
|
||||
|
||||
const std::vector<CameraRenderRequest> secondFrameRequests =
|
||||
renderer.BuildRenderRequests(scene, nullptr, context, surface);
|
||||
ASSERT_EQ(secondFrameRequests.size(), 1u);
|
||||
EXPECT_EQ(
|
||||
secondFrameRequests[0].GetMainSceneSurface().GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(
|
||||
secondFrameRequests[0].GetMainSceneSurface().GetColorStateAfter(),
|
||||
XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
|
||||
delete depthView;
|
||||
delete backBufferColorView;
|
||||
}
|
||||
|
||||
TEST(SceneRenderer_Test, ReusesTrackedPostProcessOutputStateAcrossFramesWhenFinalOutputIsEnabled) {
|
||||
Scene scene("SceneRendererTrackedPostProcessOutputStateScene");
|
||||
|
||||
GameObject* cameraObject = scene.CreateGameObject("Camera");
|
||||
auto* camera = cameraObject->AddComponent<CameraComponent>();
|
||||
camera->SetPrimary(true);
|
||||
camera->SetDepth(2.0f);
|
||||
camera->SetPostProcessPasses({
|
||||
XCEngine::Rendering::CameraPostProcessPassDesc::MakeColorScale(
|
||||
XCEngine::Math::Vector4(1.0f, 0.9f, 0.8f, 1.0f))
|
||||
});
|
||||
|
||||
FinalColorOverrideSettings finalColorOverrides = {};
|
||||
finalColorOverrides.overrideOutputTransferMode = true;
|
||||
finalColorOverrides.outputTransferMode = FinalColorOutputTransferMode::LinearToSRGB;
|
||||
camera->SetFinalColorOverrides(finalColorOverrides);
|
||||
|
||||
auto pipelineState = std::make_shared<MockPipelineState>();
|
||||
auto allocationState = std::make_shared<MockShadowAllocationState>();
|
||||
MockShadowDevice device(allocationState);
|
||||
|
||||
RenderContext context = CreateValidContext();
|
||||
context.device = &device;
|
||||
|
||||
auto* backBufferColorView = new MockShadowView(
|
||||
allocationState,
|
||||
XCEngine::RHI::ResourceViewType::RenderTarget,
|
||||
XCEngine::RHI::Format::R8G8B8A8_UNorm,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D);
|
||||
auto* depthView = new MockShadowView(
|
||||
allocationState,
|
||||
XCEngine::RHI::ResourceViewType::DepthStencil,
|
||||
XCEngine::RHI::Format::D24_UNorm_S8_UInt,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D);
|
||||
|
||||
RenderSurface surface(800, 600);
|
||||
surface.SetColorAttachment(backBufferColorView);
|
||||
surface.SetDepthAttachment(depthView);
|
||||
|
||||
SceneRenderer renderer(std::make_unique<MockPipeline>(pipelineState));
|
||||
|
||||
std::vector<CameraRenderRequest> firstFrameRequests =
|
||||
renderer.BuildRenderRequests(scene, nullptr, context, surface);
|
||||
ASSERT_EQ(firstFrameRequests.size(), 1u);
|
||||
EXPECT_TRUE(firstFrameRequests[0].postProcess.IsRequested());
|
||||
EXPECT_TRUE(firstFrameRequests[0].finalOutput.IsRequested());
|
||||
EXPECT_EQ(
|
||||
firstFrameRequests[0].GetMainSceneSurface().GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::Common);
|
||||
EXPECT_EQ(
|
||||
firstFrameRequests[0].postProcess.destinationSurface.GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::Common);
|
||||
|
||||
RenderPassSequence postProcessPasses;
|
||||
postProcessPasses.AddPass(std::make_unique<MockScenePass>(pipelineState, "postProcess"));
|
||||
RenderPassSequence finalOutputPasses;
|
||||
finalOutputPasses.AddPass(std::make_unique<MockScenePass>(pipelineState, "finalOutput"));
|
||||
firstFrameRequests[0].postProcess.passes = &postProcessPasses;
|
||||
firstFrameRequests[0].finalOutput.passes = &finalOutputPasses;
|
||||
|
||||
ASSERT_TRUE(renderer.Render(firstFrameRequests));
|
||||
|
||||
const std::vector<CameraRenderRequest> secondFrameRequests =
|
||||
renderer.BuildRenderRequests(scene, nullptr, context, surface);
|
||||
ASSERT_EQ(secondFrameRequests.size(), 1u);
|
||||
EXPECT_EQ(
|
||||
secondFrameRequests[0].GetMainSceneSurface().GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(
|
||||
secondFrameRequests[0].postProcess.destinationSurface.GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(
|
||||
secondFrameRequests[0].finalOutput.sourceSurface.GetColorStateBefore(),
|
||||
XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
|
||||
delete depthView;
|
||||
delete backBufferColorView;
|
||||
}
|
||||
|
||||
TEST(CameraRenderer_Test, UsesResolvedRenderAreaForCameraViewportDimensions) {
|
||||
Scene scene("CameraRendererViewportRectScene");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user