Add runtime material buffer bindings
This commit is contained in:
@@ -1560,6 +1560,83 @@ TEST(BuiltinPassLayout_Test, RejectsDuplicateBindingsInOneSet) {
|
||||
EXPECT_EQ(error, "Builtin pass encountered duplicate bindings inside one descriptor set");
|
||||
}
|
||||
|
||||
TEST(BuiltinPassLayout_Test, AcceptsRuntimeMaterialBufferBindingsWithoutBuiltinSemanticMetadata) {
|
||||
Array<ShaderResourceBindingDesc> bindings;
|
||||
|
||||
ShaderResourceBindingDesc perObjectBinding = {};
|
||||
perObjectBinding.name = "PerObjectConstants";
|
||||
perObjectBinding.type = ShaderResourceType::ConstantBuffer;
|
||||
perObjectBinding.set = 0u;
|
||||
perObjectBinding.binding = 0u;
|
||||
perObjectBinding.semantic = "PerObject";
|
||||
bindings.PushBack(perObjectBinding);
|
||||
|
||||
ShaderResourceBindingDesc materialBinding = {};
|
||||
materialBinding.name = "MaterialConstants";
|
||||
materialBinding.type = ShaderResourceType::ConstantBuffer;
|
||||
materialBinding.set = 1u;
|
||||
materialBinding.binding = 0u;
|
||||
materialBinding.semantic = "Material";
|
||||
bindings.PushBack(materialBinding);
|
||||
|
||||
ShaderResourceBindingDesc bufferBinding = {};
|
||||
bufferBinding.name = "VolumeNodes";
|
||||
bufferBinding.type = ShaderResourceType::StructuredBuffer;
|
||||
bufferBinding.set = 2u;
|
||||
bufferBinding.binding = 0u;
|
||||
bindings.PushBack(bufferBinding);
|
||||
|
||||
BuiltinPassResourceBindingPlan plan = {};
|
||||
String error;
|
||||
ASSERT_TRUE(TryBuildBuiltinPassResourceBindingPlan(bindings, plan, &error)) << error.CStr();
|
||||
EXPECT_TRUE(plan.usesMaterialBuffers);
|
||||
ASSERT_EQ(plan.materialBufferBindings.Size(), 1u);
|
||||
EXPECT_EQ(plan.materialBufferBindings[0].name, "VolumeNodes");
|
||||
EXPECT_EQ(plan.materialBufferBindings[0].semantic, BuiltinPassResourceSemantic::MaterialBuffer);
|
||||
EXPECT_EQ(plan.materialBufferBindings[0].resourceType, ShaderResourceType::StructuredBuffer);
|
||||
EXPECT_EQ(plan.materialBufferBindings[0].location.set, 2u);
|
||||
EXPECT_EQ(plan.materialBufferBindings[0].location.binding, 0u);
|
||||
|
||||
std::vector<BuiltinPassSetLayoutMetadata> setLayouts;
|
||||
ASSERT_TRUE(TryBuildBuiltinPassSetLayouts(plan, setLayouts, &error)) << error.CStr();
|
||||
ASSERT_EQ(setLayouts.size(), 3u);
|
||||
EXPECT_TRUE(setLayouts[2].usesMaterialBuffers);
|
||||
ASSERT_EQ(setLayouts[2].materialBufferBindings.size(), 1u);
|
||||
EXPECT_EQ(setLayouts[2].materialBufferBindings[0].name, "VolumeNodes");
|
||||
ASSERT_EQ(setLayouts[2].bindings.size(), 1u);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[2].bindings[0].type),
|
||||
DescriptorType::SRV);
|
||||
EXPECT_EQ(setLayouts[2].bindings[0].resourceDimension, ResourceViewDimension::StructuredBuffer);
|
||||
}
|
||||
|
||||
TEST(BuiltinPassLayout_Test, AcceptsRuntimeMaterialRawUavBufferBindings) {
|
||||
Array<ShaderResourceBindingDesc> bindings;
|
||||
|
||||
ShaderResourceBindingDesc bufferBinding = {};
|
||||
bufferBinding.name = "VolumeCounters";
|
||||
bufferBinding.type = ShaderResourceType::RWRawBuffer;
|
||||
bufferBinding.set = 4u;
|
||||
bufferBinding.binding = 3u;
|
||||
bindings.PushBack(bufferBinding);
|
||||
|
||||
BuiltinPassResourceBindingPlan plan = {};
|
||||
String error;
|
||||
ASSERT_TRUE(TryBuildBuiltinPassResourceBindingPlan(bindings, plan, &error)) << error.CStr();
|
||||
ASSERT_EQ(plan.materialBufferBindings.Size(), 1u);
|
||||
EXPECT_EQ(plan.materialBufferBindings[0].semantic, BuiltinPassResourceSemantic::MaterialBuffer);
|
||||
|
||||
std::vector<BuiltinPassSetLayoutMetadata> setLayouts;
|
||||
ASSERT_TRUE(TryBuildBuiltinPassSetLayouts(plan, setLayouts, &error)) << error.CStr();
|
||||
ASSERT_EQ(setLayouts.size(), 5u);
|
||||
ASSERT_EQ(setLayouts[4].bindings.size(), 1u);
|
||||
EXPECT_EQ(
|
||||
static_cast<DescriptorType>(setLayouts[4].bindings[0].type),
|
||||
DescriptorType::UAV);
|
||||
EXPECT_EQ(setLayouts[4].bindings[0].resourceDimension, ResourceViewDimension::RawBuffer);
|
||||
EXPECT_TRUE(setLayouts[4].usesMaterialBuffers);
|
||||
}
|
||||
|
||||
TEST(BuiltinDepthOnlyPass_Test, UsesFloat3PositionInputLayoutForStaticMeshVertices) {
|
||||
const InputLayoutDesc inputLayout = BuiltinDepthOnlyPass::BuildInputLayout();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user