tests: Test updating mutable descriptor set
diff --git a/tests/vklayertests_buffer_image_memory_sampler.cpp b/tests/vklayertests_buffer_image_memory_sampler.cpp
index 53ab88b..9cda022 100644
--- a/tests/vklayertests_buffer_image_memory_sampler.cpp
+++ b/tests/vklayertests_buffer_image_memory_sampler.cpp
@@ -14788,4 +14788,115 @@
vk::UpdateDescriptorSets(m_device->device(), 0, nullptr, 1, ©_set);
m_errorMonitor->VerifyFound();
}
-}
\ No newline at end of file
+}
+
+
+TEST_F(VkLayerTest, ValidateUpdatingMutableDescriptors) {
+ TEST_DESCRIPTION("Validate updating mutable descriptors.");
+
+ 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;
+ }
+ auto mutable_descriptor_type_features = LvlInitStruct<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE>();
+ auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mutable_descriptor_type_features);
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (mutable_descriptor_type_features.mutableDescriptorType == VK_FALSE) {
+ printf("%s mutableDescriptorType feature not supported. Skipped.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ VkDescriptorType descriptor_types[] = {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER};
+
+ VkMutableDescriptorTypeListVALVE mutable_descriptor_type_list = {};
+ mutable_descriptor_type_list.descriptorTypeCount = 1;
+ mutable_descriptor_type_list.pDescriptorTypes = descriptor_types;
+
+ VkMutableDescriptorTypeCreateInfoVALVE mdtci = LvlInitStruct<VkMutableDescriptorTypeCreateInfoVALVE>();
+ mdtci.mutableDescriptorTypeListCount = 1;
+ mdtci.pMutableDescriptorTypeLists = &mutable_descriptor_type_list;
+
+ VkDescriptorPoolSize pool_sizes[2] = {};
+ pool_sizes[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ pool_sizes[0].descriptorCount = 2;
+ pool_sizes[1].type = VK_DESCRIPTOR_TYPE_MUTABLE_VALVE;
+ pool_sizes[1].descriptorCount = 2;
+
+ VkDescriptorPoolCreateInfo ds_pool_ci = LvlInitStruct<VkDescriptorPoolCreateInfo>(&mdtci);
+ ds_pool_ci.maxSets = 2;
+ ds_pool_ci.poolSizeCount = 2;
+ ds_pool_ci.pPoolSizes = pool_sizes;
+
+ vk_testing::DescriptorPool pool;
+ pool.init(*m_device, ds_pool_ci);
+
+ VkDescriptorSetLayoutBinding bindings[2] = {};
+ bindings[0].binding = 0;
+ bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_MUTABLE_VALVE;
+ bindings[0].descriptorCount = 1;
+ bindings[0].stageFlags = VK_SHADER_STAGE_ALL;
+ bindings[0].pImmutableSamplers = nullptr;
+ bindings[1].binding = 1;
+ bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ bindings[1].descriptorCount = 1;
+ bindings[1].stageFlags = VK_SHADER_STAGE_ALL;
+ bindings[1].pImmutableSamplers = nullptr;
+
+ VkDescriptorSetLayoutCreateInfo create_info = LvlInitStruct<VkDescriptorSetLayoutCreateInfo>(&mdtci);
+ create_info.bindingCount = 2;
+ create_info.pBindings = bindings;
+
+ vk_testing::DescriptorSetLayout set_layout;
+ set_layout.init(*m_device, create_info);
+ VkDescriptorSetLayout set_layout_handle = set_layout.handle();
+
+ VkDescriptorSetLayout layouts[2] = {set_layout_handle, set_layout_handle};
+
+ VkDescriptorSetAllocateInfo allocate_info = LvlInitStruct<VkDescriptorSetAllocateInfo>();
+ allocate_info.descriptorPool = pool.handle();
+ allocate_info.descriptorSetCount = 2;
+ allocate_info.pSetLayouts = layouts;
+
+ VkDescriptorSet descriptor_sets[2];
+ vk::AllocateDescriptorSets(device(), &allocate_info, descriptor_sets);
+
+ VkImageObj image(m_device);
+ image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
+
+ VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
+ VkSampler sampler;
+ vk::CreateSampler(device(), &sampler_ci, nullptr, &sampler);
+
+ VkDescriptorImageInfo image_info = {};
+ image_info.imageView = view;
+ image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ image_info.sampler = sampler;
+
+ VkWriteDescriptorSet descriptor_write = LvlInitStruct<VkWriteDescriptorSet>();
+ descriptor_write.dstSet = descriptor_sets[1];
+ descriptor_write.dstBinding = 1;
+ descriptor_write.descriptorCount = 1;
+ descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptor_write.pImageInfo = &image_info;
+
+ vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, nullptr);
+
+ VkCopyDescriptorSet copy_set = LvlInitStruct<VkCopyDescriptorSet>();
+ copy_set.srcSet = descriptor_sets[1];
+ copy_set.srcBinding = 1;
+ copy_set.dstSet = descriptor_sets[0];
+ copy_set.dstBinding = 0;
+ copy_set.descriptorCount = 1;
+
+ vk::DestroySampler(device(), sampler, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00325");
+ vk::UpdateDescriptorSets(m_device->device(), 0, nullptr, 1, ©_set);
+ m_errorMonitor->VerifyFound();
+}