From b1280f786ee19bd94d81606d5d2fe9d7d0d2879f Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Sun, 9 Jun 2019 12:25:42 -0500 Subject: [PATCH] Fix validation errors in buffer_device_address tests These tests could violate the per-stage descriptor limits. Create an empty descriptor set to use in place of the non-empty set if we run out of space. Components: Vulkan Affects: dEQP-VK.binding_model.buffer_device_address.* Change-Id: I7c252da604e7316f040fd3cc44091bfd405fc883 --- .../vktBindingBufferDeviceAddressTests.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp index ed95cbb..281f0ad 100644 --- a/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp +++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingBufferDeviceAddressTests.cpp @@ -503,12 +503,10 @@ tcu::TestStatus BufferAddressTestInstance::iterate (void) break; } - Move descriptorSetLayout; Move descriptorPool; Move descriptorSet; VkDescriptorPoolCreateFlags poolCreateFlags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - VkDescriptorSetLayoutCreateFlags layoutCreateFlags = 0; VkDescriptorSetLayoutBinding bindings[2]; bindings[0].binding = 0; @@ -521,17 +519,20 @@ tcu::TestStatus BufferAddressTestInstance::iterate (void) bindings[1].descriptorCount = 1; // Create a layout and allocate a descriptor set for it. - const VkDescriptorSetLayoutCreateInfo setLayoutCreateInfo = + VkDescriptorSetLayoutCreateInfo setLayoutCreateInfo = { vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, DE_NULL, - layoutCreateFlags, + 0, (deUint32)2, &bindings[0] }; - descriptorSetLayout = vk::createDescriptorSetLayout(vk, device, &setLayoutCreateInfo); + Move descriptorSetLayout = vk::createDescriptorSetLayout(vk, device, &setLayoutCreateInfo); + + setLayoutCreateInfo.bindingCount = 0; + Move emptyDescriptorSetLayout = vk::createDescriptorSetLayout(vk, device, &setLayoutCreateInfo); vk::DescriptorPoolBuilder poolBuilder; poolBuilder.addType(bindings[1].descriptorType, 1); @@ -644,10 +645,18 @@ tcu::TestStatus BufferAddressTestInstance::iterate (void) 128 // deUint32 size }; + deUint32 nonEmptySetLimit = m_data.base == BASE_UBO ? properties.properties.limits.maxPerStageDescriptorUniformBuffers : + properties.properties.limits.maxPerStageDescriptorStorageBuffers; + nonEmptySetLimit = de::min(nonEmptySetLimit, properties.properties.limits.maxPerStageDescriptorStorageImages); + vector descriptorSetLayoutsRaw(m_data.set+1); for (size_t i = 0; i < m_data.set+1; ++i) { - descriptorSetLayoutsRaw[i] = descriptorSetLayout.get(); + // use nonempty descriptor sets to consume resources until we run out of descriptors + if (i < nonEmptySetLimit - 1 || i == m_data.set) + descriptorSetLayoutsRaw[i] = descriptorSetLayout.get(); + else + descriptorSetLayoutsRaw[i] = emptyDescriptorSetLayout.get(); } const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = -- 2.7.4