Add gaussian splat integration baseline
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <XCEngine/Resources/Shader/Shader.h>
|
||||
#include <XCEngine/Resources/Shader/ShaderLoader.h>
|
||||
#include <XCEngine/RHI/RHIEnums.h>
|
||||
#include <XCEngine/RHI/OpenGL/OpenGLPipelineLayout.h>
|
||||
#include <XCEngine/RHI/ShaderCompiler/SpirvShaderCompiler.h>
|
||||
|
||||
#include <fstream>
|
||||
@@ -885,7 +886,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinGaussianSplatShaderUsesAuthoringContrac
|
||||
|
||||
const ShaderPass* pass = shader->FindPass("GaussianSplat");
|
||||
ASSERT_NE(pass, nullptr);
|
||||
EXPECT_EQ(pass->resources.Size(), 6u);
|
||||
EXPECT_EQ(pass->resources.Size(), 4u);
|
||||
EXPECT_TRUE(pass->hasFixedFunctionState);
|
||||
EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::None);
|
||||
EXPECT_FALSE(pass->fixedFunctionState.depthWriteEnable);
|
||||
@@ -910,35 +911,15 @@ TEST(BuiltinForwardPipeline_Test, BuiltinGaussianSplatShaderUsesAuthoringContrac
|
||||
ResolveBuiltinPassResourceSemantic(*order),
|
||||
BuiltinPassResourceSemantic::GaussianSplatOrderBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* positions =
|
||||
shader->FindPassResourceBinding("GaussianSplat", "GaussianSplatPositions");
|
||||
ASSERT_NE(positions, nullptr);
|
||||
EXPECT_EQ(positions->type, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(positions->set, 2u);
|
||||
EXPECT_EQ(positions->binding, 1u);
|
||||
const ShaderResourceBindingDesc* viewData =
|
||||
shader->FindPassResourceBinding("GaussianSplat", "GaussianSplatViewDataBuffer");
|
||||
ASSERT_NE(viewData, nullptr);
|
||||
EXPECT_EQ(viewData->type, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(viewData->set, 2u);
|
||||
EXPECT_EQ(viewData->binding, 1u);
|
||||
EXPECT_EQ(
|
||||
ResolveBuiltinPassResourceSemantic(*positions),
|
||||
BuiltinPassResourceSemantic::GaussianSplatPositionBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* other =
|
||||
shader->FindPassResourceBinding("GaussianSplat", "GaussianSplatOther");
|
||||
ASSERT_NE(other, nullptr);
|
||||
EXPECT_EQ(other->type, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(other->set, 2u);
|
||||
EXPECT_EQ(other->binding, 2u);
|
||||
EXPECT_EQ(
|
||||
ResolveBuiltinPassResourceSemantic(*other),
|
||||
BuiltinPassResourceSemantic::GaussianSplatOtherBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* color =
|
||||
shader->FindPassResourceBinding("GaussianSplat", "GaussianSplatColor");
|
||||
ASSERT_NE(color, nullptr);
|
||||
EXPECT_EQ(color->type, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(color->set, 2u);
|
||||
EXPECT_EQ(color->binding, 3u);
|
||||
EXPECT_EQ(
|
||||
ResolveBuiltinPassResourceSemantic(*color),
|
||||
BuiltinPassResourceSemantic::GaussianSplatColorBuffer);
|
||||
ResolveBuiltinPassResourceSemantic(*viewData),
|
||||
BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer);
|
||||
|
||||
delete shader;
|
||||
}
|
||||
@@ -958,24 +939,21 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoaded
|
||||
BuiltinPassResourceBindingPlan plan = {};
|
||||
String error;
|
||||
EXPECT_TRUE(TryBuildBuiltinPassResourceBindingPlan(*pass, plan, &error)) << error.CStr();
|
||||
ASSERT_EQ(plan.bindings.Size(), 6u);
|
||||
ASSERT_EQ(plan.bindings.Size(), 4u);
|
||||
EXPECT_TRUE(plan.perObject.IsValid());
|
||||
EXPECT_TRUE(plan.material.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatOrderBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatPositionBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatOtherBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatColorBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatViewDataBuffer.IsValid());
|
||||
EXPECT_FALSE(plan.gaussianSplatPositionBuffer.IsValid());
|
||||
EXPECT_FALSE(plan.gaussianSplatOtherBuffer.IsValid());
|
||||
EXPECT_FALSE(plan.gaussianSplatColorBuffer.IsValid());
|
||||
EXPECT_FALSE(plan.gaussianSplatSHBuffer.IsValid());
|
||||
EXPECT_EQ(plan.perObject.set, 0u);
|
||||
EXPECT_EQ(plan.material.set, 1u);
|
||||
EXPECT_EQ(plan.gaussianSplatOrderBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatOrderBuffer.binding, 0u);
|
||||
EXPECT_EQ(plan.gaussianSplatPositionBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatPositionBuffer.binding, 1u);
|
||||
EXPECT_EQ(plan.gaussianSplatOtherBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatOtherBuffer.binding, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatColorBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatColorBuffer.binding, 3u);
|
||||
EXPECT_EQ(plan.gaussianSplatViewDataBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatViewDataBuffer.binding, 1u);
|
||||
EXPECT_EQ(plan.firstDescriptorSet, 0u);
|
||||
EXPECT_EQ(plan.descriptorSetCount, 3u);
|
||||
|
||||
@@ -985,34 +963,23 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoaded
|
||||
EXPECT_TRUE(setLayouts[0].usesPerObject);
|
||||
EXPECT_TRUE(setLayouts[1].usesMaterial);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatOrderBuffer);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatPositionBuffer);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatOtherBuffer);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatColorBuffer);
|
||||
ASSERT_EQ(setLayouts[2].bindings.size(), 4u);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatViewDataBuffer);
|
||||
EXPECT_FALSE(setLayouts[2].usesGaussianSplatPositionBuffer);
|
||||
EXPECT_FALSE(setLayouts[2].usesGaussianSplatOtherBuffer);
|
||||
EXPECT_FALSE(setLayouts[2].usesGaussianSplatColorBuffer);
|
||||
ASSERT_EQ(setLayouts[2].bindings.size(), 2u);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[0].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[1].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[2].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[3].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[0].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[1].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[2].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[3].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
|
||||
delete shader;
|
||||
}
|
||||
@@ -1052,22 +1019,16 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringGauss
|
||||
d3d12Source,
|
||||
"cbuffer MaterialConstants",
|
||||
"register(b1)"));
|
||||
EXPECT_NE(d3d12Source.find("float4 gPointScaleParams;"), std::string::npos);
|
||||
EXPECT_NE(d3d12Source.find("float4 gOpacityScaleParams;"), std::string::npos);
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<uint> GaussianSplatOrderBuffer",
|
||||
"register(t0)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<float3> GaussianSplatPositions",
|
||||
"StructuredBuffer<GaussianSplatViewData> GaussianSplatViewDataBuffer",
|
||||
"register(t1)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<GaussianSplatOtherData> GaussianSplatOther",
|
||||
"register(t2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<float4> GaussianSplatColor",
|
||||
"register(t3)"));
|
||||
EXPECT_EQ(d3d12Source.find("space0"), std::string::npos);
|
||||
EXPECT_EQ(d3d12Source.find("space1"), std::string::npos);
|
||||
EXPECT_EQ(d3d12Source.find("space2"), std::string::npos);
|
||||
@@ -1095,22 +1056,16 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringGauss
|
||||
vulkanSource,
|
||||
"cbuffer MaterialConstants",
|
||||
"register(b0, space1)"));
|
||||
EXPECT_NE(vulkanSource.find("float4 gPointScaleParams;"), std::string::npos);
|
||||
EXPECT_NE(vulkanSource.find("float4 gOpacityScaleParams;"), std::string::npos);
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<uint> GaussianSplatOrderBuffer",
|
||||
"register(t0, space2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<float3> GaussianSplatPositions",
|
||||
"StructuredBuffer<GaussianSplatViewData> GaussianSplatViewDataBuffer",
|
||||
"register(t1, space2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<GaussianSplatOtherData> GaussianSplatOther",
|
||||
"register(t2, space2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<float4> GaussianSplatColor",
|
||||
"register(t3, space2)"));
|
||||
|
||||
delete shader;
|
||||
}
|
||||
@@ -1126,7 +1081,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinGaussianSplatUtilitiesShaderUsesCompute
|
||||
|
||||
const ShaderPass* pass = shader->FindPass("GaussianSplatPrepareOrder");
|
||||
ASSERT_NE(pass, nullptr);
|
||||
EXPECT_EQ(pass->resources.Size(), 4u);
|
||||
EXPECT_EQ(pass->resources.Size(), 7u);
|
||||
|
||||
const ShaderResourceBindingDesc* perObject =
|
||||
shader->FindPassResourceBinding("GaussianSplatPrepareOrder", "PerObjectConstants");
|
||||
@@ -1148,6 +1103,26 @@ TEST(BuiltinForwardPipeline_Test, BuiltinGaussianSplatUtilitiesShaderUsesCompute
|
||||
ResolveBuiltinPassResourceSemantic(*positions),
|
||||
BuiltinPassResourceSemantic::GaussianSplatPositionBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* other =
|
||||
shader->FindPassResourceBinding("GaussianSplatPrepareOrder", "GaussianSplatOther");
|
||||
ASSERT_NE(other, nullptr);
|
||||
EXPECT_EQ(other->type, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(other->set, 2u);
|
||||
EXPECT_EQ(other->binding, 1u);
|
||||
EXPECT_EQ(
|
||||
ResolveBuiltinPassResourceSemantic(*other),
|
||||
BuiltinPassResourceSemantic::GaussianSplatOtherBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* color =
|
||||
shader->FindPassResourceBinding("GaussianSplatPrepareOrder", "GaussianSplatColor");
|
||||
ASSERT_NE(color, nullptr);
|
||||
EXPECT_EQ(color->type, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(color->set, 2u);
|
||||
EXPECT_EQ(color->binding, 2u);
|
||||
EXPECT_EQ(
|
||||
ResolveBuiltinPassResourceSemantic(*color),
|
||||
BuiltinPassResourceSemantic::GaussianSplatColorBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* sortDistances =
|
||||
shader->FindPassResourceBinding("GaussianSplatPrepareOrder", "GaussianSplatSortDistances");
|
||||
ASSERT_NE(sortDistances, nullptr);
|
||||
@@ -1168,6 +1143,16 @@ TEST(BuiltinForwardPipeline_Test, BuiltinGaussianSplatUtilitiesShaderUsesCompute
|
||||
ResolveBuiltinPassResourceSemantic(*orderBuffer),
|
||||
BuiltinPassResourceSemantic::GaussianSplatOrderBuffer);
|
||||
|
||||
const ShaderResourceBindingDesc* viewData =
|
||||
shader->FindPassResourceBinding("GaussianSplatPrepareOrder", "GaussianSplatViewDataBuffer");
|
||||
ASSERT_NE(viewData, nullptr);
|
||||
EXPECT_EQ(viewData->type, ShaderResourceType::RWStructuredBuffer);
|
||||
EXPECT_EQ(viewData->set, 4u);
|
||||
EXPECT_EQ(viewData->binding, 2u);
|
||||
EXPECT_EQ(
|
||||
ResolveBuiltinPassResourceSemantic(*viewData),
|
||||
BuiltinPassResourceSemantic::GaussianSplatViewDataBuffer);
|
||||
|
||||
const ShaderStageVariant* computeVariant = shader->FindVariant(
|
||||
"GaussianSplatPrepareOrder",
|
||||
XCEngine::Resources::ShaderType::Compute,
|
||||
@@ -1193,17 +1178,26 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoaded
|
||||
BuiltinPassResourceBindingPlan plan = {};
|
||||
String error;
|
||||
EXPECT_TRUE(TryBuildBuiltinPassResourceBindingPlan(*pass, plan, &error)) << error.CStr();
|
||||
ASSERT_EQ(plan.bindings.Size(), 4u);
|
||||
ASSERT_EQ(plan.bindings.Size(), 7u);
|
||||
EXPECT_TRUE(plan.perObject.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatPositionBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatOtherBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatColorBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatSortDistanceBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatOrderBuffer.IsValid());
|
||||
EXPECT_TRUE(plan.gaussianSplatViewDataBuffer.IsValid());
|
||||
EXPECT_EQ(plan.perObject.set, 0u);
|
||||
EXPECT_EQ(plan.gaussianSplatPositionBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatOtherBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatOtherBuffer.binding, 1u);
|
||||
EXPECT_EQ(plan.gaussianSplatColorBuffer.set, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatColorBuffer.binding, 2u);
|
||||
EXPECT_EQ(plan.gaussianSplatSortDistanceBuffer.set, 4u);
|
||||
EXPECT_EQ(plan.gaussianSplatSortDistanceBuffer.binding, 0u);
|
||||
EXPECT_EQ(plan.gaussianSplatOrderBuffer.set, 4u);
|
||||
EXPECT_EQ(plan.gaussianSplatOrderBuffer.binding, 1u);
|
||||
EXPECT_EQ(plan.gaussianSplatViewDataBuffer.set, 4u);
|
||||
EXPECT_EQ(plan.gaussianSplatViewDataBuffer.binding, 2u);
|
||||
EXPECT_EQ(plan.firstDescriptorSet, 0u);
|
||||
EXPECT_EQ(plan.descriptorSetCount, 5u);
|
||||
|
||||
@@ -1212,25 +1206,98 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoaded
|
||||
ASSERT_EQ(setLayouts.size(), 5u);
|
||||
EXPECT_TRUE(setLayouts[0].usesPerObject);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatPositionBuffer);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatOtherBuffer);
|
||||
EXPECT_TRUE(setLayouts[2].usesGaussianSplatColorBuffer);
|
||||
EXPECT_TRUE(setLayouts[4].usesGaussianSplatSortDistanceBuffer);
|
||||
EXPECT_TRUE(setLayouts[4].usesGaussianSplatOrderBuffer);
|
||||
ASSERT_EQ(setLayouts[4].bindings.size(), 2u);
|
||||
EXPECT_TRUE(setLayouts[4].usesGaussianSplatViewDataBuffer);
|
||||
ASSERT_EQ(setLayouts[2].bindings.size(), 3u);
|
||||
ASSERT_EQ(setLayouts[4].bindings.size(), 3u);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[0].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[1].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[2].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[4].bindings[0].type),
|
||||
DescriptorType::UAV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[4].bindings[1].type),
|
||||
DescriptorType::UAV);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[4].bindings[2].type),
|
||||
DescriptorType::UAV);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[0].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[1].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[2].bindings[2].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[4].bindings[0].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[4].bindings[1].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
EXPECT_EQ(
|
||||
setLayouts[4].bindings[2].resourceDimension,
|
||||
ResourceViewDimension::StructuredBuffer);
|
||||
|
||||
delete shader;
|
||||
}
|
||||
|
||||
TEST(BuiltinForwardPipeline_Test, OpenGLPipelineLayoutUsesUnifiedStorageBufferBindingsForGaussianSplatUtilities) {
|
||||
ShaderLoader loader;
|
||||
LoadResult result = loader.Load(GetBuiltinGaussianSplatUtilitiesShaderPath());
|
||||
ASSERT_TRUE(result);
|
||||
ASSERT_NE(result.resource, nullptr);
|
||||
|
||||
Shader* shader = static_cast<Shader*>(result.resource);
|
||||
ASSERT_NE(shader, nullptr);
|
||||
|
||||
const ShaderPass* pass = shader->FindPass("GaussianSplatPrepareOrder");
|
||||
ASSERT_NE(pass, nullptr);
|
||||
|
||||
BuiltinPassResourceBindingPlan plan = {};
|
||||
String error;
|
||||
ASSERT_TRUE(TryBuildBuiltinPassResourceBindingPlan(*pass, plan, &error)) << error.CStr();
|
||||
|
||||
std::vector<BuiltinPassSetLayoutMetadata> setLayouts;
|
||||
ASSERT_TRUE(TryBuildBuiltinPassSetLayouts(plan, setLayouts, &error)) << error.CStr();
|
||||
ASSERT_EQ(setLayouts.size(), 5u);
|
||||
|
||||
RHIPipelineLayoutDesc layoutDesc = {};
|
||||
layoutDesc.setLayoutCount = static_cast<uint32_t>(setLayouts.size());
|
||||
std::vector<DescriptorSetLayoutDesc> layoutViews(setLayouts.size());
|
||||
for (size_t setIndex = 0; setIndex < setLayouts.size(); ++setIndex) {
|
||||
layoutViews[setIndex].bindingCount = static_cast<uint32_t>(setLayouts[setIndex].bindings.size());
|
||||
layoutViews[setIndex].bindings =
|
||||
setLayouts[setIndex].bindings.empty() ? nullptr : setLayouts[setIndex].bindings.data();
|
||||
}
|
||||
layoutDesc.setLayouts = layoutViews.data();
|
||||
|
||||
OpenGLPipelineLayout pipelineLayout;
|
||||
ASSERT_TRUE(pipelineLayout.Initialize(layoutDesc));
|
||||
|
||||
EXPECT_EQ(pipelineLayout.GetConstantBufferBindingPoint(0u, 0u), 0u);
|
||||
EXPECT_EQ(pipelineLayout.GetShaderResourceBindingPoint(2u, 0u), 0u);
|
||||
EXPECT_EQ(pipelineLayout.GetShaderResourceBindingPoint(2u, 1u), 1u);
|
||||
EXPECT_EQ(pipelineLayout.GetShaderResourceBindingPoint(2u, 2u), 2u);
|
||||
EXPECT_EQ(pipelineLayout.GetUnorderedAccessBindingPoint(4u, 0u), 3u);
|
||||
EXPECT_EQ(pipelineLayout.GetUnorderedAccessBindingPoint(4u, 1u), 4u);
|
||||
EXPECT_EQ(pipelineLayout.GetUnorderedAccessBindingPoint(4u, 2u), 5u);
|
||||
|
||||
pipelineLayout.Shutdown();
|
||||
delete shader;
|
||||
}
|
||||
|
||||
TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesGaussianSplatUtilitiesComputeBindingsToDescriptorSpaces) {
|
||||
ShaderLoader loader;
|
||||
LoadResult result = loader.Load(GetBuiltinGaussianSplatUtilitiesShaderPath());
|
||||
@@ -1264,8 +1331,16 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesGaussianSplatU
|
||||
"register(b0)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<float3> GaussianSplatPositions",
|
||||
"StructuredBuffer<float4> GaussianSplatPositions",
|
||||
"register(t0)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<GaussianSplatOtherData> GaussianSplatOther",
|
||||
"register(t1)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"StructuredBuffer<float4> GaussianSplatColor",
|
||||
"register(t2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"RWStructuredBuffer<uint> GaussianSplatSortDistances",
|
||||
@@ -1274,6 +1349,10 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesGaussianSplatU
|
||||
d3d12Source,
|
||||
"RWStructuredBuffer<uint> GaussianSplatOrderBuffer",
|
||||
"register(u1)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
d3d12Source,
|
||||
"RWStructuredBuffer<GaussianSplatViewData> GaussianSplatViewDataBuffer",
|
||||
"register(u2)"));
|
||||
|
||||
const ShaderStageVariant* vulkanCompute = shader->FindVariant(
|
||||
"GaussianSplatPrepareOrder",
|
||||
@@ -1296,8 +1375,16 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesGaussianSplatU
|
||||
"register(b0, space0)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<float3> GaussianSplatPositions",
|
||||
"StructuredBuffer<float4> GaussianSplatPositions",
|
||||
"register(t0, space2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<GaussianSplatOtherData> GaussianSplatOther",
|
||||
"register(t1, space2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"StructuredBuffer<float4> GaussianSplatColor",
|
||||
"register(t2, space2)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"RWStructuredBuffer<uint> GaussianSplatSortDistances",
|
||||
@@ -1306,6 +1393,72 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesGaussianSplatU
|
||||
vulkanSource,
|
||||
"RWStructuredBuffer<uint> GaussianSplatOrderBuffer",
|
||||
"register(u1, space4)"));
|
||||
EXPECT_TRUE(SourceContainsRegisterBinding(
|
||||
vulkanSource,
|
||||
"RWStructuredBuffer<GaussianSplatViewData> GaussianSplatViewDataBuffer",
|
||||
"register(u2, space4)"));
|
||||
|
||||
delete shader;
|
||||
}
|
||||
|
||||
TEST(BuiltinForwardPipeline_Test, OpenGLRuntimeTranspilesGaussianSplatUtilitiesComputeVariant) {
|
||||
ShaderLoader loader;
|
||||
LoadResult result = loader.Load(GetBuiltinGaussianSplatUtilitiesShaderPath());
|
||||
ASSERT_TRUE(result);
|
||||
ASSERT_NE(result.resource, nullptr);
|
||||
|
||||
Shader* shader = static_cast<Shader*>(result.resource);
|
||||
ASSERT_NE(shader, nullptr);
|
||||
|
||||
const ShaderPass* pass = shader->FindPass("GaussianSplatPrepareOrder");
|
||||
ASSERT_NE(pass, nullptr);
|
||||
|
||||
const ShaderStageVariant* openGLCompute = shader->FindVariant(
|
||||
"GaussianSplatPrepareOrder",
|
||||
XCEngine::Resources::ShaderType::Compute,
|
||||
XCEngine::Resources::ShaderBackend::OpenGL);
|
||||
ASSERT_NE(openGLCompute, nullptr);
|
||||
|
||||
ShaderCompileDesc compileDesc = {};
|
||||
::XCEngine::Rendering::Internal::ApplyShaderStageVariant(
|
||||
*pass,
|
||||
XCEngine::Resources::ShaderBackend::OpenGL,
|
||||
*openGLCompute,
|
||||
compileDesc);
|
||||
|
||||
XCEngine::RHI::CompiledSpirvShader spirvShader = {};
|
||||
std::string errorMessage;
|
||||
ASSERT_TRUE(
|
||||
XCEngine::RHI::CompileSpirvShader(
|
||||
compileDesc,
|
||||
XCEngine::RHI::SpirvTargetEnvironment::Vulkan,
|
||||
spirvShader,
|
||||
&errorMessage))
|
||||
<< errorMessage;
|
||||
|
||||
std::string glslSource;
|
||||
ASSERT_TRUE(XCEngine::RHI::TranspileSpirvToOpenGLGLSL(spirvShader, glslSource, &errorMessage))
|
||||
<< errorMessage;
|
||||
ASSERT_FALSE(glslSource.empty());
|
||||
|
||||
EXPECT_NE(
|
||||
glslSource.find("layout(binding = 0, std430) readonly buffer type_StructuredBuffer_v4float"),
|
||||
std::string::npos);
|
||||
EXPECT_NE(
|
||||
glslSource.find("layout(binding = 1, std430) readonly buffer type_StructuredBuffer_GaussianSplatOtherData"),
|
||||
std::string::npos);
|
||||
EXPECT_NE(
|
||||
glslSource.find("layout(binding = 2, std430) readonly buffer GaussianSplatColor"),
|
||||
std::string::npos);
|
||||
EXPECT_NE(
|
||||
glslSource.find("layout(binding = 3, std430) buffer type_RWStructuredBuffer_uint"),
|
||||
std::string::npos);
|
||||
EXPECT_NE(
|
||||
glslSource.find("layout(binding = 4, std430) buffer GaussianSplatOrderBuffer"),
|
||||
std::string::npos);
|
||||
EXPECT_NE(
|
||||
glslSource.find("layout(binding = 5, std430) buffer type_RWStructuredBuffer_GaussianSplatViewData"),
|
||||
std::string::npos);
|
||||
|
||||
delete shader;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user