99 lines
3.7 KiB
C++
99 lines
3.7 KiB
C++
#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<uint32_t>(DescriptorType::CBV);
|
|
set0Bindings[0].count = 1;
|
|
|
|
DescriptorSetLayoutBinding set1Bindings[1] = {};
|
|
set1Bindings[0].binding = 3;
|
|
set1Bindings[0].type = static_cast<uint32_t>(DescriptorType::SRV);
|
|
set1Bindings[0].count = 2;
|
|
|
|
DescriptorSetLayoutBinding set2Bindings[1] = {};
|
|
set2Bindings[0].binding = 1;
|
|
set2Bindings[0].type = static_cast<uint32_t>(DescriptorType::UAV);
|
|
set2Bindings[0].count = 1;
|
|
|
|
DescriptorSetLayoutBinding set3Bindings[1] = {};
|
|
set3Bindings[0].binding = 5;
|
|
set3Bindings[0].type = static_cast<uint32_t>(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<VulkanPipelineLayout*>(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<uint32_t>(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<VulkanPipelineLayout*>(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<uint32_t>(DescriptorType::CBV));
|
|
EXPECT_EQ(resolvedDesc.setLayouts[0].bindings[0].count, 2u);
|
|
EXPECT_EQ(resolvedDesc.setLayouts[1].bindings[0].type, static_cast<uint32_t>(DescriptorType::SRV));
|
|
EXPECT_EQ(resolvedDesc.setLayouts[1].bindings[0].count, 1u);
|
|
EXPECT_EQ(resolvedDesc.setLayouts[2].bindings[0].type, static_cast<uint32_t>(DescriptorType::UAV));
|
|
EXPECT_EQ(resolvedDesc.setLayouts[3].bindings[0].type, static_cast<uint32_t>(DescriptorType::Sampler));
|
|
|
|
layout->Shutdown();
|
|
delete layout;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
#endif
|