refactor: generalize renderer builtin post process
This commit is contained in:
@@ -5,8 +5,8 @@ project(XCEngine_RenderingUnitTests)
|
||||
set(RENDERING_UNIT_TEST_SOURCES
|
||||
test_render_pass.cpp
|
||||
test_builtin_forward_pipeline.cpp
|
||||
test_builtin_scene_view_post_pass_plan.cpp
|
||||
test_builtin_scene_view_post_pass_sequence_builder.cpp
|
||||
test_builtin_post_process_pass_plan.cpp
|
||||
test_builtin_post_process_pass_sequence_builder.cpp
|
||||
test_camera_scene_renderer.cpp
|
||||
test_scene_render_request_planner.cpp
|
||||
test_scene_render_request_utils.cpp
|
||||
|
||||
143
tests/Rendering/unit/test_builtin_post_process_pass_plan.cpp
Normal file
143
tests/Rendering/unit/test_builtin_post_process_pass_plan.cpp
Normal file
@@ -0,0 +1,143 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <XCEngine/Rendering/Passes/BuiltinPostProcessPassPlan.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
using XCEngine::Rendering::Passes::BuildBuiltinPostProcessPassPlan;
|
||||
using XCEngine::Rendering::Passes::BuiltinPostProcessPassPlanInput;
|
||||
using XCEngine::Rendering::Passes::BuiltinPostProcessPassStep;
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, ReturnsInvalidPlanWhenNoBuiltinEffectIsAvailable) {
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan({});
|
||||
|
||||
EXPECT_FALSE(plan.valid);
|
||||
EXPECT_TRUE(plan.steps.empty());
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasGridOverlay = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::InfiniteGrid,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, BuildsGridAndSelectionOutlinePlanWhenObjectIdShaderViewExists) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasGridOverlay = true;
|
||||
input.hasSelection = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::InfiniteGrid,
|
||||
BuiltinPostProcessPassStep::SelectionOutline,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissingAndGridExists) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasGridOverlay = true;
|
||||
input.hasSelection = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::InfiniteGrid,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasGridOverlay = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::SelectionMaskDebug,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, DebugMaskPlanFallsBackToTransitionsWhenGridExistsButObjectIdShaderViewIsMissing) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasGridOverlay = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, BuildsSelectionOnlyOutlinePlanWhenGridOverlayIsUnavailable) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasSelection = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::SelectionOutline,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassPlan_Test, BuildsDebugMaskWithoutGridWhenObjectIdShaderViewExists) {
|
||||
BuiltinPostProcessPassPlanInput input = {};
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinPostProcessPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinPostProcessPassStep>{
|
||||
BuiltinPostProcessPassStep::ColorToRenderTarget,
|
||||
BuiltinPostProcessPassStep::SelectionMaskDebug,
|
||||
BuiltinPostProcessPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -0,0 +1,109 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <XCEngine/Rendering/Passes/BuiltinPostProcessPassSequenceBuilder.h>
|
||||
|
||||
namespace {
|
||||
|
||||
using XCEngine::Rendering::Passes::BuiltinPostProcessPassSequenceBuilder;
|
||||
using XCEngine::Rendering::Passes::BuiltinPostProcessPassSequenceInput;
|
||||
using XCEngine::Rendering::Passes::ObjectIdOutlineStyle;
|
||||
using XCEngine::Rendering::RenderPassSequence;
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, ReturnsInvalidSequenceWhenNoBuiltinEffectIsRequested) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
|
||||
const auto result = builder.Build({}, sequence);
|
||||
|
||||
EXPECT_FALSE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 0u);
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, BuildsGridOnlySequenceWhenNothingIsSelected) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinPostProcessPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, BuildsGridAndSelectionOutlineSequenceWhenObjectIdTextureViewExists) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinPostProcessPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
input.objectIdTextureView = reinterpret_cast<XCEngine::RHI::RHIResourceView*>(1);
|
||||
input.selectedObjectIds = { 7u, 11u };
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 4u);
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, ReportsMissingObjectIdTextureViewAndFallsBackToGridOnlySequence) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinPostProcessPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
input.selectedObjectIds = { 42u };
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_TRUE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, BuildsDebugMaskSequenceWhenRequested) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinPostProcessPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
input.objectIdTextureView = reinterpret_cast<XCEngine::RHI::RHIResourceView*>(1);
|
||||
input.selectedObjectIds = { 5u };
|
||||
input.outlineStyle = ObjectIdOutlineStyle{};
|
||||
input.outlineStyle.debugSelectionMask = true;
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, BuildsSelectionOnlyOutlineSequenceWhenGridDataIsUnavailable) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinPostProcessPassSequenceInput input = {};
|
||||
input.objectIdTextureView = reinterpret_cast<XCEngine::RHI::RHIResourceView*>(1);
|
||||
input.selectedObjectIds = { 13u };
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
TEST(BuiltinPostProcessPassSequenceBuilder_Test, ReportsInvalidSelectionOnlySequenceWhenObjectIdTextureViewIsMissing) {
|
||||
BuiltinPostProcessPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinPostProcessPassSequenceInput input = {};
|
||||
input.selectedObjectIds = { 13u };
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_FALSE(result.valid);
|
||||
EXPECT_TRUE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 0u);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -1,108 +0,0 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
using XCEngine::Rendering::Passes::BuildBuiltinSceneViewPostPassPlan;
|
||||
using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassPlanInput;
|
||||
using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassStep;
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, ReturnsInvalidPlanWhenOverlayIsUnavailable) {
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan({});
|
||||
|
||||
EXPECT_FALSE(plan.valid);
|
||||
EXPECT_TRUE(plan.steps.empty());
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, BuildsSelectionOutlinePlanWhenObjectIdShaderViewExists) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::SelectionOutline,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissing) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::InfiniteGrid,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
input.hasObjectIdShaderView = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::SelectionMaskDebug,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassPlan_Test, DebugMaskPlanFallsBackWhenObjectIdShaderViewIsMissing) {
|
||||
BuiltinSceneViewPostPassPlanInput input = {};
|
||||
input.overlayValid = true;
|
||||
input.hasSelection = true;
|
||||
input.debugSelectionMask = true;
|
||||
|
||||
const auto plan = BuildBuiltinSceneViewPostPassPlan(input);
|
||||
|
||||
ASSERT_TRUE(plan.valid);
|
||||
EXPECT_EQ(
|
||||
plan.steps,
|
||||
(std::vector<BuiltinSceneViewPostPassStep>{
|
||||
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
|
||||
BuiltinSceneViewPostPassStep::ColorToShaderResource
|
||||
}));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -1,82 +0,0 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassSequenceBuilder.h>
|
||||
|
||||
namespace {
|
||||
|
||||
using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassSequenceBuilder;
|
||||
using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassSequenceInput;
|
||||
using XCEngine::Rendering::Passes::ObjectIdOutlineStyle;
|
||||
using XCEngine::Rendering::RenderPassSequence;
|
||||
|
||||
TEST(BuiltinSceneViewPostPassSequenceBuilder_Test, ReturnsInvalidSequenceWhenGridDataIsUnavailable) {
|
||||
BuiltinSceneViewPostPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
|
||||
const auto result = builder.Build({}, sequence);
|
||||
|
||||
EXPECT_FALSE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 0u);
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassSequenceBuilder_Test, BuildsGridOnlySequenceWhenNothingIsSelected) {
|
||||
BuiltinSceneViewPostPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinSceneViewPostPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassSequenceBuilder_Test, BuildsSelectionOutlineSequenceWhenObjectIdTextureViewExists) {
|
||||
BuiltinSceneViewPostPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinSceneViewPostPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
input.objectIdTextureView = reinterpret_cast<XCEngine::RHI::RHIResourceView*>(1);
|
||||
input.selectedObjectIds = { 7u, 11u };
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 4u);
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassSequenceBuilder_Test, ReportsMissingObjectIdTextureViewAndFallsBackToGridOnlySequence) {
|
||||
BuiltinSceneViewPostPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinSceneViewPostPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
input.selectedObjectIds = { 42u };
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_TRUE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
TEST(BuiltinSceneViewPostPassSequenceBuilder_Test, BuildsDebugMaskSequenceWhenRequested) {
|
||||
BuiltinSceneViewPostPassSequenceBuilder builder;
|
||||
RenderPassSequence sequence;
|
||||
BuiltinSceneViewPostPassSequenceInput input = {};
|
||||
input.gridPassData.valid = true;
|
||||
input.objectIdTextureView = reinterpret_cast<XCEngine::RHI::RHIResourceView*>(1);
|
||||
input.selectedObjectIds = { 5u };
|
||||
input.outlineStyle = ObjectIdOutlineStyle{};
|
||||
input.outlineStyle.debugSelectionMask = true;
|
||||
|
||||
const auto result = builder.Build(input, sequence);
|
||||
|
||||
EXPECT_TRUE(result.valid);
|
||||
EXPECT_FALSE(result.missingObjectIdTextureViewForSelection);
|
||||
EXPECT_EQ(sequence.GetPassCount(), 3u);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -438,8 +438,8 @@ TEST(CameraRenderer_Test, ShutsDownSequencesWhenPostPassInitializationFails) {
|
||||
"shutdown:pre" }));
|
||||
}
|
||||
|
||||
TEST(CameraRenderer_Test, RejectsBuiltinSceneViewPostProcessThatCannotProduceFreshObjectIdData) {
|
||||
Scene scene("CameraRendererSceneViewPostProcessValidationScene");
|
||||
TEST(CameraRenderer_Test, RejectsBuiltinPostProcessThatCannotProduceFreshObjectIdData) {
|
||||
Scene scene("CameraRendererBuiltinPostProcessValidationScene");
|
||||
|
||||
GameObject* cameraObject = scene.CreateGameObject("Camera");
|
||||
auto* camera = cameraObject->AddComponent<CameraComponent>();
|
||||
@@ -455,8 +455,8 @@ TEST(CameraRenderer_Test, RejectsBuiltinSceneViewPostProcessThatCannotProduceFre
|
||||
request.context = CreateValidContext();
|
||||
request.surface = RenderSurface(512, 512);
|
||||
request.cameraDepth = camera->GetDepth();
|
||||
request.builtinSceneViewPostProcess.gridPassData.valid = true;
|
||||
request.builtinSceneViewPostProcess.objectIdTextureView =
|
||||
request.builtinPostProcess.gridPassData.valid = true;
|
||||
request.builtinPostProcess.objectIdTextureView =
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(1);
|
||||
|
||||
EXPECT_FALSE(renderer.Render(request));
|
||||
|
||||
@@ -22,6 +22,7 @@ using XCEngine::RHI::RHIResourceView;
|
||||
using XCEngine::RHI::ResourceStates;
|
||||
using XCEngine::RHI::ResourceViewDimension;
|
||||
using XCEngine::RHI::ResourceViewType;
|
||||
using XCEngine::Rendering::BuiltinPostProcessRequest;
|
||||
using XCEngine::Rendering::RenderPass;
|
||||
using XCEngine::Rendering::RenderPassContext;
|
||||
using XCEngine::Rendering::RenderPassSequence;
|
||||
@@ -127,25 +128,39 @@ TEST(ViewportRenderFlowUtilsTest, ApplyViewportFailureStatusRespectsSetIfEmptyBe
|
||||
TEST(ViewportRenderFlowUtilsTest, ApplySceneRenderRequestSetupAttachesOptionalPassesAndObjectIdSurface) {
|
||||
DummyResourceView depthView(ResourceViewType::DepthStencil, Format::D24_UNorm_S8_UInt);
|
||||
DummyResourceView objectIdView(ResourceViewType::RenderTarget);
|
||||
DummyResourceView objectIdShaderView(ResourceViewType::ShaderResource);
|
||||
|
||||
ViewportRenderTargets targets = {};
|
||||
targets.width = 800;
|
||||
targets.height = 600;
|
||||
targets.depthView = &depthView;
|
||||
targets.objectIdView = &objectIdView;
|
||||
targets.objectIdShaderView = &objectIdShaderView;
|
||||
targets.objectIdState = ResourceStates::Common;
|
||||
|
||||
RenderPassSequence postPasses;
|
||||
postPasses.AddPass(std::make_unique<NoopRenderPass>());
|
||||
|
||||
BuiltinPostProcessRequest builtinPostProcess = {};
|
||||
builtinPostProcess.gridPassData.valid = true;
|
||||
builtinPostProcess.selectedObjectIds = { 7u };
|
||||
|
||||
XCEngine::Rendering::CameraRenderRequest request = {};
|
||||
request.surface = RenderSurface(800, 600);
|
||||
request.surface.SetRenderArea(XCEngine::Math::RectInt(64, 32, 320, 240));
|
||||
|
||||
ApplySceneViewportRenderRequestSetup(targets, &postPasses, request);
|
||||
ApplySceneViewportRenderRequestSetup(
|
||||
targets,
|
||||
&builtinPostProcess,
|
||||
&postPasses,
|
||||
request);
|
||||
|
||||
EXPECT_EQ(request.postScenePasses, &postPasses);
|
||||
EXPECT_TRUE(request.objectId.IsRequested());
|
||||
EXPECT_TRUE(request.builtinPostProcess.IsRequested());
|
||||
EXPECT_EQ(request.builtinPostProcess.objectIdTextureView, &objectIdShaderView);
|
||||
ASSERT_EQ(request.builtinPostProcess.selectedObjectIds.size(), 1u);
|
||||
EXPECT_EQ(request.builtinPostProcess.selectedObjectIds[0], 7u);
|
||||
ASSERT_EQ(request.objectId.surface.GetColorAttachments().size(), 1u);
|
||||
EXPECT_EQ(request.objectId.surface.GetColorAttachments()[0], &objectIdView);
|
||||
EXPECT_EQ(request.objectId.surface.GetDepthAttachment(), &depthView);
|
||||
@@ -168,13 +183,15 @@ TEST(ViewportRenderFlowUtilsTest, ApplySceneRenderRequestSetupSkipsUnavailableOp
|
||||
XCEngine::Rendering::CameraRenderRequest request = {};
|
||||
request.postScenePasses = reinterpret_cast<RenderPassSequence*>(static_cast<uintptr_t>(0x1));
|
||||
request.objectId.surface = RenderSurface(1, 1);
|
||||
request.builtinPostProcess.gridPassData.valid = true;
|
||||
request.objectId.surface.SetColorAttachment(
|
||||
reinterpret_cast<RHIResourceView*>(static_cast<uintptr_t>(0x2)));
|
||||
|
||||
ApplySceneViewportRenderRequestSetup(targets, &postPasses, request);
|
||||
ApplySceneViewportRenderRequestSetup(targets, nullptr, &postPasses, request);
|
||||
|
||||
EXPECT_EQ(request.postScenePasses, nullptr);
|
||||
EXPECT_FALSE(request.objectId.IsRequested());
|
||||
EXPECT_FALSE(request.builtinPostProcess.IsRequested());
|
||||
}
|
||||
|
||||
TEST(ViewportRenderFlowUtilsTest, MarkSceneRenderSuccessMovesTargetsToShaderResourceState) {
|
||||
@@ -191,7 +208,7 @@ TEST(ViewportRenderFlowUtilsTest, MarkSceneRenderSuccessMovesTargetsToShaderReso
|
||||
|
||||
XCEngine::Rendering::CameraRenderRequest request = {};
|
||||
request.surface = RenderSurface(640, 360);
|
||||
ApplySceneViewportRenderRequestSetup(targets, nullptr, request);
|
||||
ApplySceneViewportRenderRequestSetup(targets, nullptr, nullptr, request);
|
||||
|
||||
MarkSceneViewportRenderSuccess(targets, request);
|
||||
EXPECT_EQ(targets.colorState, ResourceStates::PixelShaderResource);
|
||||
|
||||
Reference in New Issue
Block a user