Files
XCEngine/tests/Rendering/unit/test_fullscreen_pass_factory.cpp
ssdfasd 5fd474d08d feat(rendering): add shader-vector fullscreen SRP seam
Generalize the native fullscreen pass and descriptor plumbing so managed SRP can request shader-driven fullscreen stages without being locked to the ColorScale path.

Keep ColorScale as a convenience descriptor mapped to the builtin color-scale shader, and add native fullscreen factory coverage for the new shader-vector path.
2026-04-18 16:08:01 +08:00

79 lines
3.0 KiB
C++

#include <gtest/gtest.h>
#include <XCEngine/Rendering/Passes/BuiltinVectorFullscreenPass.h>
#include <XCEngine/Rendering/Planning/FullscreenPassFactory.h>
#include <XCEngine/Resources/BuiltinResources.h>
namespace {
void ExpectVector4Eq(
const XCEngine::Math::Vector4& actual,
const XCEngine::Math::Vector4& expected) {
EXPECT_FLOAT_EQ(actual.x, expected.x);
EXPECT_FLOAT_EQ(actual.y, expected.y);
EXPECT_FLOAT_EQ(actual.z, expected.z);
EXPECT_FLOAT_EQ(actual.w, expected.w);
}
} // namespace
TEST(FullscreenPassFactory_Test, BuildsColorScaleDescriptorIntoBuiltinVectorFullscreenPass) {
const XCEngine::Math::Vector4 payload(1.1f, 0.95f, 0.9f, 1.0f);
const XCEngine::Rendering::FullscreenPassStack fullscreenPasses = {
XCEngine::Rendering::FullscreenPassDesc::MakeColorScale(payload)
};
std::unique_ptr<XCEngine::Rendering::RenderPassSequence> sequence =
XCEngine::Rendering::BuildFullscreenPassSequence(fullscreenPasses);
ASSERT_NE(sequence, nullptr);
ASSERT_EQ(sequence->GetPassCount(), 1u);
auto* pass = dynamic_cast<XCEngine::Rendering::Passes::BuiltinVectorFullscreenPass*>(
sequence->GetPass(0u));
ASSERT_NE(pass, nullptr);
ExpectVector4Eq(pass->GetVectorPayload(), payload);
EXPECT_EQ(
pass->GetShaderPath(),
XCEngine::Resources::GetBuiltinColorScalePostProcessShaderPath());
EXPECT_EQ(
pass->GetPreferredPassName(),
XCEngine::Containers::String("ColorScale"));
}
TEST(FullscreenPassFactory_Test, BuildsShaderVectorDescriptorIntoBuiltinVectorFullscreenPass) {
const XCEngine::Containers::String shaderPath(
"builtin://shaders/color-scale-post-process");
const XCEngine::Containers::String passName("ColorScale");
const XCEngine::Math::Vector4 payload(0.95f, 1.05f, 1.1f, 1.0f);
const XCEngine::Rendering::FullscreenPassStack fullscreenPasses = {
XCEngine::Rendering::FullscreenPassDesc::MakeShaderVector(
shaderPath,
payload,
passName)
};
std::unique_ptr<XCEngine::Rendering::RenderPassSequence> sequence =
XCEngine::Rendering::BuildFullscreenPassSequence(fullscreenPasses);
ASSERT_NE(sequence, nullptr);
ASSERT_EQ(sequence->GetPassCount(), 1u);
auto* pass = dynamic_cast<XCEngine::Rendering::Passes::BuiltinVectorFullscreenPass*>(
sequence->GetPass(0u));
ASSERT_NE(pass, nullptr);
ExpectVector4Eq(pass->GetVectorPayload(), payload);
EXPECT_EQ(pass->GetShaderPath(), shaderPath);
EXPECT_EQ(pass->GetPreferredPassName(), passName);
}
TEST(FullscreenPassFactory_Test, IgnoresInvalidShaderVectorDescriptor) {
XCEngine::Rendering::FullscreenPassStack fullscreenPasses = {
XCEngine::Rendering::FullscreenPassDesc::MakeShaderVector(
XCEngine::Containers::String(),
XCEngine::Math::Vector4::One())
};
std::unique_ptr<XCEngine::Rendering::RenderPassSequence> sequence =
XCEngine::Rendering::BuildFullscreenPassSequence(fullscreenPasses);
EXPECT_EQ(sequence, nullptr);
}