---
 src/amd/vulkan/radv_descriptor_set.c | 30 +++++++++++++++++++++++++++-
 src/amd/vulkan/radv_descriptor_set.h |  1 +
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_descriptor_set.c 
b/src/amd/vulkan/radv_descriptor_set.c
index 7a3a611dd68..9b35451c497 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -30,6 +30,7 @@
 #include "util/mesa-sha1.h"
 #include "radv_private.h"
 #include "sid.h"
+#include "vk_util.h"
 
 
 static bool has_equal_immutable_samplers(const VkSampler *samplers, uint32_t 
count)
@@ -76,6 +77,8 @@ VkResult radv_CreateDescriptorSetLayout(
        struct radv_descriptor_set_layout *set_layout;
 
        assert(pCreateInfo->sType == 
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
+       const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT *variable_flags =
+               vk_find_struct_const(pCreateInfo->pNext, 
DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT);
 
        uint32_t max_binding = 0;
        uint32_t immutable_sampler_count = 0;
@@ -164,6 +167,14 @@ VkResult radv_CreateDescriptorSetLayout(
                set_layout->binding[b].offset = set_layout->size;
                set_layout->binding[b].dynamic_offset_offset = 
dynamic_offset_count;
 
+               if (variable_flags && binding->binding < 
variable_flags->bindingCount &&
+                   (variable_flags->pBindingFlags[binding->binding] & 
VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT)) {
+                       assert(!binding->pImmutableSamplers); /* Terribly ill 
defined  how many samplers are valid */
+                       assert(binding->binding == max_binding);
+
+                       set_layout->has_variable_descriptors = true;
+               }
+
                if (binding->pImmutableSamplers) {
                        set_layout->binding[b].immutable_samplers_offset = 
samplers_offset;
                        set_layout->binding[b].immutable_samplers_equal =
@@ -225,6 +236,14 @@ void radv_GetDescriptorSetLayoutSupport(VkDevice device,
                return;
        }
 
+       const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT *variable_flags =
+               vk_find_struct_const(pCreateInfo->pNext, 
DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT);
+       VkDescriptorSetVariableDescriptorCountLayoutSupportEXT *variable_count =
+               vk_find_struct((void*)pCreateInfo->pNext, 
DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT);
+       if (variable_count) {
+               variable_count->maxVariableDescriptorCount = 0;
+       }
+
        bool supported = true;
        uint64_t size = 0;
        for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
@@ -272,9 +291,18 @@ void radv_GetDescriptorSetLayoutSupport(VkDevice device,
                        supported = false;
                }
                size = align_u64(size, descriptor_alignment);
-               if (descriptor_size && (UINT64_MAX - size) / descriptor_size < 
binding->descriptorCount) {
+
+               uint64_t max_count = UINT64_MAX;
+               if (descriptor_size)
+                       max_count = (UINT64_MAX - size) / descriptor_size;
+
+               if (max_count < binding->descriptorCount) {
                        supported = false;
                }
+               if (variable_flags && binding->binding 
<variable_flags->bindingCount && variable_count &&
+                   (variable_flags->pBindingFlags[binding->binding] & 
VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT)) {
+                       variable_count->maxVariableDescriptorCount = 
MIN2(UINT32_MAX, max_count);
+               }
                size += binding->descriptorCount * descriptor_size;
        }
 
diff --git a/src/amd/vulkan/radv_descriptor_set.h 
b/src/amd/vulkan/radv_descriptor_set.h
index e6749311e2a..d1cba953f7e 100644
--- a/src/amd/vulkan/radv_descriptor_set.h
+++ b/src/amd/vulkan/radv_descriptor_set.h
@@ -65,6 +65,7 @@ struct radv_descriptor_set_layout {
    uint16_t dynamic_offset_count;
 
    bool has_immutable_samplers;
+   bool has_variable_descriptors;
 
    /* Bindings in this descriptor set */
    struct radv_descriptor_set_binding_layout binding[0];
-- 
2.17.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to