Formalize gaussian splat prepare-order pass

This commit is contained in:
2026-04-11 03:02:30 +08:00
parent 5191bb1149
commit fac6e588a8
16 changed files with 1529 additions and 68 deletions

View File

@@ -2,6 +2,8 @@
#include <XCEngine/Resources/Shader/Shader.h>
#include <XCEngine/Core/Asset/ResourceTypes.h>
#include <XCEngine/Core/Containers/Array.h>
#include <XCEngine/RHI/RHITypes.h>
#include "Rendering/Internal/ShaderVariantUtils.h"
using namespace XCEngine::Resources;
using namespace XCEngine::Containers;
@@ -77,6 +79,69 @@ TEST(Shader, AddGetAttributes) {
EXPECT_EQ(attributes[0].name, "aPosition");
}
TEST(Shader, StoresBackendCompiledBinariesPerBackend) {
ShaderStageVariant variant = {};
variant.stage = ShaderType::Fragment;
variant.language = ShaderLanguage::HLSL;
variant.backend = ShaderBackend::Generic;
Array<XCEngine::Core::uint8> d3d12Payload;
d3d12Payload.PushBack(0x01);
d3d12Payload.PushBack(0x02);
variant.SetCompiledBinaryForBackend(ShaderBackend::D3D12, d3d12Payload);
Array<XCEngine::Core::uint8> vulkanPayload;
vulkanPayload.PushBack(0x03);
vulkanPayload.PushBack(0x04);
vulkanPayload.PushBack(0x05);
variant.SetCompiledBinaryForBackend(ShaderBackend::Vulkan, vulkanPayload);
const Array<XCEngine::Core::uint8>* d3d12Binary =
variant.GetCompiledBinaryForBackend(ShaderBackend::D3D12);
ASSERT_NE(d3d12Binary, nullptr);
ASSERT_EQ(d3d12Binary->Size(), 2u);
EXPECT_EQ((*d3d12Binary)[1], 0x02);
const Array<XCEngine::Core::uint8>* vulkanBinary =
variant.GetCompiledBinaryForBackend(ShaderBackend::Vulkan);
ASSERT_NE(vulkanBinary, nullptr);
ASSERT_EQ(vulkanBinary->Size(), 3u);
EXPECT_EQ((*vulkanBinary)[2], 0x05);
EXPECT_EQ(variant.GetCompiledBinaryForBackend(ShaderBackend::OpenGL), nullptr);
}
TEST(Shader, ApplyShaderStageVariantCarriesMatchedBackendCompiledBinary) {
ShaderPass pass = {};
pass.name = "ForwardLit";
ShaderStageVariant variant = {};
variant.stage = ShaderType::Fragment;
variant.language = ShaderLanguage::HLSL;
variant.backend = ShaderBackend::Generic;
variant.entryPoint = "MainPS";
variant.profile = "ps_5_1";
variant.sourceCode = "float4 MainPS() : SV_TARGET { return 1; }";
Array<XCEngine::Core::uint8> vulkanPayload;
vulkanPayload.PushBack(0x07);
vulkanPayload.PushBack(0x08);
vulkanPayload.PushBack(0x09);
variant.SetCompiledBinaryForBackend(ShaderBackend::Vulkan, vulkanPayload);
XCEngine::RHI::ShaderCompileDesc compileDesc = {};
::XCEngine::Rendering::Internal::ApplyShaderStageVariant(
pass,
ShaderBackend::Vulkan,
variant,
compileDesc);
EXPECT_EQ(compileDesc.compiledBinaryBackend, XCEngine::RHI::ShaderBinaryBackend::Vulkan);
ASSERT_EQ(compileDesc.compiledBinary.size(), 3u);
EXPECT_EQ(compileDesc.compiledBinary[0], 0x07);
EXPECT_EQ(compileDesc.compiledBinary[2], 0x09);
}
TEST(Shader, FindsBackendSpecificVariantAndFallsBackToGeneric) {
Shader shader;