#if defined(XCENGINE_SUPPORT_VULKAN) #include "fixtures/VulkanTestFixture.h" #include "XCEngine/RHI/RHIPipelineLayout.h" #include "XCEngine/RHI/Vulkan/VulkanPipelineLayout.h" using namespace XCEngine::RHI; namespace { TEST_F(VulkanGraphicsFixture, PipelineLayout_ExplicitSetLayoutsAggregateBindingCounts) { DescriptorSetLayoutBinding set0Bindings[1] = {}; set0Bindings[0].binding = 0; set0Bindings[0].type = static_cast(DescriptorType::CBV); set0Bindings[0].count = 1; DescriptorSetLayoutBinding set1Bindings[1] = {}; set1Bindings[0].binding = 3; set1Bindings[0].type = static_cast(DescriptorType::SRV); set1Bindings[0].count = 2; DescriptorSetLayoutBinding set2Bindings[1] = {}; set2Bindings[0].binding = 1; set2Bindings[0].type = static_cast(DescriptorType::UAV); set2Bindings[0].count = 1; DescriptorSetLayoutBinding set3Bindings[1] = {}; set3Bindings[0].binding = 5; set3Bindings[0].type = static_cast(DescriptorType::Sampler); set3Bindings[0].count = 1; DescriptorSetLayoutDesc setLayouts[4] = {}; setLayouts[0].bindings = set0Bindings; setLayouts[0].bindingCount = 1; setLayouts[1].bindings = set1Bindings; setLayouts[1].bindingCount = 1; setLayouts[2].bindings = set2Bindings; setLayouts[2].bindingCount = 1; setLayouts[3].bindings = set3Bindings; setLayouts[3].bindingCount = 1; RHIPipelineLayoutDesc desc = {}; desc.setLayouts = setLayouts; desc.setLayoutCount = 4; RHIPipelineLayout* layout = m_device->CreatePipelineLayout(desc); ASSERT_NE(layout, nullptr); auto* vulkanLayout = static_cast(layout); EXPECT_TRUE(vulkanLayout->UsesSetLayouts()); EXPECT_NE(vulkanLayout->GetPipelineLayout(), VK_NULL_HANDLE); const RHIPipelineLayoutDesc& resolvedDesc = vulkanLayout->GetDesc(); ASSERT_NE(resolvedDesc.setLayouts, nullptr); EXPECT_EQ(resolvedDesc.setLayoutCount, 4u); EXPECT_EQ(resolvedDesc.constantBufferCount, 1u); EXPECT_EQ(resolvedDesc.textureCount, 2u); EXPECT_EQ(resolvedDesc.uavCount, 1u); EXPECT_EQ(resolvedDesc.samplerCount, 1u); EXPECT_EQ(resolvedDesc.setLayouts[1].bindings[0].binding, 3u); EXPECT_EQ(resolvedDesc.setLayouts[1].bindings[0].count, 2u); EXPECT_EQ(resolvedDesc.setLayouts[3].bindings[0].type, static_cast(DescriptorType::Sampler)); layout->Shutdown(); delete layout; } TEST_F(VulkanGraphicsFixture, PipelineLayout_FlatCountsSynthesizePerTypeSetLayouts) { RHIPipelineLayoutDesc desc = {}; desc.constantBufferCount = 2; desc.textureCount = 1; desc.uavCount = 1; desc.samplerCount = 1; RHIPipelineLayout* layout = m_device->CreatePipelineLayout(desc); ASSERT_NE(layout, nullptr); auto* vulkanLayout = static_cast(layout); EXPECT_NE(vulkanLayout->GetPipelineLayout(), VK_NULL_HANDLE); const RHIPipelineLayoutDesc& resolvedDesc = vulkanLayout->GetDesc(); ASSERT_NE(resolvedDesc.setLayouts, nullptr); EXPECT_TRUE(vulkanLayout->UsesSetLayouts()); EXPECT_EQ(resolvedDesc.setLayoutCount, 4u); EXPECT_EQ(resolvedDesc.setLayouts[0].bindings[0].type, static_cast(DescriptorType::CBV)); EXPECT_EQ(resolvedDesc.setLayouts[0].bindings[0].count, 2u); EXPECT_EQ(resolvedDesc.setLayouts[1].bindings[0].type, static_cast(DescriptorType::SRV)); EXPECT_EQ(resolvedDesc.setLayouts[1].bindings[0].count, 1u); EXPECT_EQ(resolvedDesc.setLayouts[2].bindings[0].type, static_cast(DescriptorType::UAV)); EXPECT_EQ(resolvedDesc.setLayouts[3].bindings[0].type, static_cast(DescriptorType::Sampler)); layout->Shutdown(); delete layout; } } // namespace #endif