tests: Test updating descriptor set with mutable type
diff --git a/tests/vklayertests_descriptor_renderpass_framebuffer.cpp b/tests/vklayertests_descriptor_renderpass_framebuffer.cpp
index 7f9b2e5..8f12649 100644
--- a/tests/vklayertests_descriptor_renderpass_framebuffer.cpp
+++ b/tests/vklayertests_descriptor_renderpass_framebuffer.cpp
@@ -10395,6 +10395,95 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, InvalidWriteMutableDescriptorSet) {
+ TEST_DESCRIPTION("Write mutable descriptor set with invalid type.");
+
+ AddRequiredExtensions(VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (!AreRequestedExtensionsEnabled()) {
+ printf("%s Extension %s is not supported, skipping test.\n", kSkipPrefix, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkDescriptorPoolSize ds_type_count = {};
+ ds_type_count.type = VK_DESCRIPTOR_TYPE_MUTABLE_VALVE;
+ ds_type_count.descriptorCount = 1;
+
+ VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>();
+ ds_pool_ci.maxSets = 1;
+ ds_pool_ci.poolSizeCount = 1;
+ ds_pool_ci.pPoolSizes = &ds_type_count;
+
+ vk_testing::DescriptorPool pool;
+ pool.init(*m_device, ds_pool_ci);
+
+ VkDescriptorSetLayoutBinding dsl_binding = {};
+ dsl_binding.binding = 0;
+ dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_MUTABLE_VALVE;
+ dsl_binding.descriptorCount = 1;
+ dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
+ dsl_binding.pImmutableSamplers = nullptr;
+
+ VkDescriptorType types[2] = {
+ VK_DESCRIPTOR_TYPE_SAMPLER,
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+ };
+
+ VkMutableDescriptorTypeListVALVE list = {};
+ list.descriptorTypeCount = 2;
+ list.pDescriptorTypes = types;
+
+ VkMutableDescriptorTypeCreateInfoVALVE mdtci = LvlInitStruct<VkMutableDescriptorTypeCreateInfoVALVE>();
+ mdtci.mutableDescriptorTypeListCount = 1;
+ mdtci.pMutableDescriptorTypeLists = &list;
+
+ auto ds_layout_ci = LvlInitStruct<VkDescriptorSetLayoutCreateInfo>(&mdtci);
+ ds_layout_ci.bindingCount = 1;
+ ds_layout_ci.pBindings = &dsl_binding;
+
+ vk_testing::DescriptorSetLayout ds_layout;
+ ds_layout.init(*m_device, ds_layout_ci);
+ VkDescriptorSetLayout ds_layout_handle = ds_layout.handle();
+
+ VkDescriptorSetAllocateInfo allocate_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
+ allocate_info.descriptorPool = pool.handle();
+ allocate_info.descriptorSetCount = 1;
+ allocate_info.pSetLayouts = &ds_layout_handle;
+
+ VkDescriptorSet descriptor_set;
+ vk::AllocateDescriptorSets(device(), &allocate_info, &descriptor_set);
+
+ VkBufferCreateInfo buffer_ci = LvlInitStruct<VkBufferCreateInfo>();
+ buffer_ci.size = 32;
+ buffer_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+
+ VkBufferObj buffer;
+ buffer.init(*m_device, buffer_ci);
+
+ VkDescriptorBufferInfo buffer_info = {};
+ buffer_info.buffer = buffer.handle();
+ buffer_info.offset = 0;
+ buffer_info.range = buffer_ci.size;
+
+ VkWriteDescriptorSet descriptor_write = LvlInitStruct<VkWriteDescriptorSet>();
+ descriptor_write.dstSet = descriptor_set;
+ descriptor_write.dstBinding = 0;
+ descriptor_write.descriptorCount = 1;
+ descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptor_write.pBufferInfo = &buffer_info;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-dstSet-04611");
+ vk::UpdateDescriptorSets(device(), 1, &descriptor_write, 0, nullptr);
+ m_errorMonitor->VerifyFound();
+
+ descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ m_errorMonitor->ExpectSuccess();
+ vk::UpdateDescriptorSets(device(), 1, &descriptor_write, 0, nullptr);
+ m_errorMonitor->VerifyNotFound();
+}
+
TEST_F(VkLayerTest, MutableDescriptors) {
TEST_DESCRIPTION("Test mutable descriptors");