anv: Put binding flags in descriptor set layouts
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 2 Oct 2018 20:35:59 +0000 (15:35 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Fri, 19 Apr 2019 19:56:42 +0000 (19:56 +0000)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/intel/vulkan/anv_descriptor_set.c
src/intel/vulkan/anv_private.h

index 52e0a233b8460030b72badbab4500cea9d2b8f0f..c8747caa060c0dca99fc48838591ba86fb31dd4e 100644 (file)
@@ -330,6 +330,7 @@ VkResult anv_CreateDescriptorSetLayout(
       /* Initialize all binding_layout entries to -1 */
       memset(&set_layout->binding[b], -1, sizeof(set_layout->binding[b]));
 
+      set_layout->binding[b].flags = 0;
       set_layout->binding[b].data = 0;
       set_layout->binding[b].max_plane_count = 0;
       set_layout->binding[b].array_size = 0;
@@ -353,6 +354,12 @@ VkResult anv_CreateDescriptorSetLayout(
       set_layout->binding[b].immutable_samplers = (void *)binding;
    }
 
+   const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT *binding_flags_info =
+      vk_find_struct_const(pCreateInfo->pNext,
+                           DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT);
+   if (binding_flags_info)
+      assert(binding_flags_info->bindingCount == pCreateInfo->bindingCount);
+
    for (uint32_t b = 0; b <= max_binding; b++) {
       const VkDescriptorSetLayoutBinding *binding =
          (void *)set_layout->binding[b].immutable_samplers;
@@ -372,6 +379,14 @@ VkResult anv_CreateDescriptorSetLayout(
 #ifndef NDEBUG
       set_layout->binding[b].type = binding->descriptorType;
 #endif
+
+      if (binding_flags_info) {
+         uint32_t binding_strct_idx = binding - pCreateInfo->pBindings;
+         assert(binding_strct_idx < binding_flags_info->bindingCount);
+         set_layout->binding[b].flags =
+            binding_flags_info->pBindingFlags[binding_strct_idx];
+      }
+
       set_layout->binding[b].data =
          anv_descriptor_data_for_type(&device->instance->physicalDevice,
                                       binding->descriptorType);
@@ -480,6 +495,7 @@ static void
 sha1_update_descriptor_set_binding_layout(struct mesa_sha1 *ctx,
    const struct anv_descriptor_set_binding_layout *layout)
 {
+   SHA1_UPDATE_VALUE(ctx, layout->flags);
    SHA1_UPDATE_VALUE(ctx, layout->data);
    SHA1_UPDATE_VALUE(ctx, layout->max_plane_count);
    SHA1_UPDATE_VALUE(ctx, layout->array_size);
index cb00d8c87319100cd81c5b840765d4c2958b96a3..1916104197a97ab6e995ae13384a6b0c775c78de 100644 (file)
@@ -1595,6 +1595,9 @@ struct anv_descriptor_set_binding_layout {
    VkDescriptorType type;
 #endif
 
+   /* Flags provided when this binding was created */
+   VkDescriptorBindingFlagsEXT flags;
+
    /* Bitfield representing the type of data this descriptor contains */
    enum anv_descriptor_data data;