turnip: Enable nonuniform descriptor indexing
authorHyunjun Ko <zzoon@igalia.com>
Tue, 16 Mar 2021 06:24:06 +0000 (06:24 +0000)
committerMarge Bot <eric+marge@anholt.net>
Wed, 17 Mar 2021 01:09:30 +0000 (01:09 +0000)
Signed-off-by: Hyunjun Ko <zzoon@igalia.com>
Reviewed-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9125>

docs/features.txt
src/freedreno/vulkan/tu_device.c
src/freedreno/vulkan/tu_extensions.py
src/freedreno/vulkan/tu_shader.c

index 0cb93a7..6117b17 100644 (file)
@@ -465,7 +465,7 @@ Vulkan 1.2 -- all DONE: anv
   VK_KHR_timeline_semaphore                             DONE (anv, radv)
   VK_KHR_uniform_buffer_standard_layout                 DONE (anv, lvp, radv)
   VK_KHR_vulkan_memory_model                            DONE (anv, radv)
-  VK_EXT_descriptor_indexing                            DONE (anv/gen9+, radv)
+  VK_EXT_descriptor_indexing                            DONE (anv/gen9+, radv, tu)
   VK_EXT_host_query_reset                               DONE (anv, lvp, radv, tu)
   VK_EXT_sampler_filter_minmax                          DONE (anv/gen9+, lvp, radv, tu)
   VK_EXT_scalar_block_layout                            DONE (anv, lvp, radv/gfx7+)
index f4fe8e5..fe05c11 100644 (file)
@@ -424,27 +424,27 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
          features->shaderFloat16                       = false;
          features->shaderInt8                          = false;
 
-         features->descriptorIndexing                                 = false;
+         features->descriptorIndexing                                 = true;
          features->shaderInputAttachmentArrayDynamicIndexing          = false;
-         features->shaderUniformTexelBufferArrayDynamicIndexing       = false;
-         features->shaderStorageTexelBufferArrayDynamicIndexing       = false;
-         features->shaderUniformBufferArrayNonUniformIndexing         = false;
-         features->shaderSampledImageArrayNonUniformIndexing          = false;
-         features->shaderStorageBufferArrayNonUniformIndexing         = false;
-         features->shaderStorageImageArrayNonUniformIndexing          = false;
+         features->shaderUniformTexelBufferArrayDynamicIndexing       = true;
+         features->shaderStorageTexelBufferArrayDynamicIndexing       = true;
+         features->shaderUniformBufferArrayNonUniformIndexing         = true;
+         features->shaderSampledImageArrayNonUniformIndexing          = true;
+         features->shaderStorageBufferArrayNonUniformIndexing         = true;
+         features->shaderStorageImageArrayNonUniformIndexing          = true;
          features->shaderInputAttachmentArrayNonUniformIndexing       = false;
-         features->shaderUniformTexelBufferArrayNonUniformIndexing    = false;
-         features->shaderStorageTexelBufferArrayNonUniformIndexing    = false;
+         features->shaderUniformTexelBufferArrayNonUniformIndexing    = true;
+         features->shaderStorageTexelBufferArrayNonUniformIndexing    = true;
          features->descriptorBindingUniformBufferUpdateAfterBind      = false;
-         features->descriptorBindingSampledImageUpdateAfterBind       = false;
-         features->descriptorBindingStorageImageUpdateAfterBind       = false;
-         features->descriptorBindingStorageBufferUpdateAfterBind      = false;
-         features->descriptorBindingUniformTexelBufferUpdateAfterBind = false;
-         features->descriptorBindingStorageTexelBufferUpdateAfterBind = false;
-         features->descriptorBindingUpdateUnusedWhilePending          = false;
-         features->descriptorBindingPartiallyBound                    = false;
-         features->descriptorBindingVariableDescriptorCount           = false;
-         features->runtimeDescriptorArray                             = false;
+         features->descriptorBindingSampledImageUpdateAfterBind       = true;
+         features->descriptorBindingStorageImageUpdateAfterBind       = true;
+         features->descriptorBindingStorageBufferUpdateAfterBind      = true;
+         features->descriptorBindingUniformTexelBufferUpdateAfterBind = true;
+         features->descriptorBindingStorageTexelBufferUpdateAfterBind = true;
+         features->descriptorBindingUpdateUnusedWhilePending          = true;
+         features->descriptorBindingPartiallyBound                    = true;
+         features->descriptorBindingVariableDescriptorCount           = true;
+         features->runtimeDescriptorArray                             = true;
 
          features->samplerFilterMinmax                 = true;
          features->scalarBlockLayout                   = false;
@@ -510,25 +510,25 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
          VkPhysicalDeviceDescriptorIndexingFeaturesEXT *features =
             (VkPhysicalDeviceDescriptorIndexingFeaturesEXT *) ext;
          features->shaderInputAttachmentArrayDynamicIndexing = false;
-         features->shaderUniformTexelBufferArrayDynamicIndexing = false;
-         features->shaderStorageTexelBufferArrayDynamicIndexing = false;
-         features->shaderUniformBufferArrayNonUniformIndexing = false;
-         features->shaderSampledImageArrayNonUniformIndexing = false;
-         features->shaderStorageBufferArrayNonUniformIndexing = false;
-         features->shaderStorageImageArrayNonUniformIndexing = false;
+         features->shaderUniformTexelBufferArrayDynamicIndexing = true;
+         features->shaderStorageTexelBufferArrayDynamicIndexing = true;
+         features->shaderUniformBufferArrayNonUniformIndexing = true;
+         features->shaderSampledImageArrayNonUniformIndexing = true;
+         features->shaderStorageBufferArrayNonUniformIndexing = true;
+         features->shaderStorageImageArrayNonUniformIndexing = true;
          features->shaderInputAttachmentArrayNonUniformIndexing = false;
-         features->shaderUniformTexelBufferArrayNonUniformIndexing = false;
-         features->shaderStorageTexelBufferArrayNonUniformIndexing = false;
+         features->shaderUniformTexelBufferArrayNonUniformIndexing = true;
+         features->shaderStorageTexelBufferArrayNonUniformIndexing = true;
          features->descriptorBindingUniformBufferUpdateAfterBind = false;
-         features->descriptorBindingSampledImageUpdateAfterBind = false;
-         features->descriptorBindingStorageImageUpdateAfterBind = false;
-         features->descriptorBindingStorageBufferUpdateAfterBind = false;
-         features->descriptorBindingUniformTexelBufferUpdateAfterBind = false;
-         features->descriptorBindingStorageTexelBufferUpdateAfterBind = false;
-         features->descriptorBindingUpdateUnusedWhilePending = false;
-         features->descriptorBindingPartiallyBound = false;
-         features->descriptorBindingVariableDescriptorCount = false;
-         features->runtimeDescriptorArray = false;
+         features->descriptorBindingSampledImageUpdateAfterBind = true;
+         features->descriptorBindingStorageImageUpdateAfterBind = true;
+         features->descriptorBindingStorageBufferUpdateAfterBind = true;
+         features->descriptorBindingUniformTexelBufferUpdateAfterBind = true;
+         features->descriptorBindingStorageTexelBufferUpdateAfterBind = true;
+         features->descriptorBindingUpdateUnusedWhilePending = true;
+         features->descriptorBindingPartiallyBound = true;
+         features->descriptorBindingVariableDescriptorCount = true;
+         features->runtimeDescriptorArray = true;
          break;
       }
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
@@ -600,7 +600,6 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
          feature->performanceCounterMultipleQueryPools = false;
          break;
       }
-
       default:
          break;
       }
@@ -860,6 +859,36 @@ tu_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
          properties->allowCommandBufferQueryCopies = false;
          break;
       }
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: {
+         VkPhysicalDeviceDescriptorIndexingPropertiesEXT *props =
+            (VkPhysicalDeviceDescriptorIndexingPropertiesEXT *)ext;
+         props->shaderUniformBufferArrayNonUniformIndexingNative = true;
+         props->shaderSampledImageArrayNonUniformIndexingNative = true;
+         props->shaderStorageBufferArrayNonUniformIndexingNative = true;
+         props->shaderStorageImageArrayNonUniformIndexingNative = true;
+         props->shaderInputAttachmentArrayNonUniformIndexingNative = false;
+         props->robustBufferAccessUpdateAfterBind = false;
+         props->quadDivergentImplicitLod = false;
+
+         props->maxUpdateAfterBindDescriptorsInAllPools = max_descriptor_set_size;
+         props->maxPerStageDescriptorUpdateAfterBindSamplers = max_descriptor_set_size;
+         props->maxPerStageDescriptorUpdateAfterBindUniformBuffers = max_descriptor_set_size;
+         props->maxPerStageDescriptorUpdateAfterBindStorageBuffers = max_descriptor_set_size;
+         props->maxPerStageDescriptorUpdateAfterBindSampledImages = max_descriptor_set_size;
+         props->maxPerStageDescriptorUpdateAfterBindStorageImages = max_descriptor_set_size;
+         props->maxPerStageDescriptorUpdateAfterBindInputAttachments = max_descriptor_set_size;
+         props->maxPerStageUpdateAfterBindResources = max_descriptor_set_size;
+         props->maxDescriptorSetUpdateAfterBindSamplers = max_descriptor_set_size;
+         props->maxDescriptorSetUpdateAfterBindUniformBuffers = max_descriptor_set_size;
+         props->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DYNAMIC_BUFFERS / 2;
+         props->maxDescriptorSetUpdateAfterBindStorageBuffers = max_descriptor_set_size;
+         props->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DYNAMIC_BUFFERS / 2;
+         props->maxDescriptorSetUpdateAfterBindSampledImages = max_descriptor_set_size;
+         props->maxDescriptorSetUpdateAfterBindStorageImages = max_descriptor_set_size;
+         props->maxDescriptorSetUpdateAfterBindInputAttachments = max_descriptor_set_size;
+         break;
+      }
+
       default:
          break;
       }
index 5bda404..c49fe80 100644 (file)
@@ -105,6 +105,7 @@ EXTENSIONS = [
     Extension('VK_EXT_memory_budget',                     1, True),
     Extension('VK_KHR_device_group',                      4, True),
     Extension('VK_KHR_device_group_creation',             1, True),
+    Extension('VK_EXT_descriptor_indexing',               2, True),
 ]
 
 MAX_API_VERSION = VkVersion(MAX_API_VERSION)
index 0feb07f..172c0c9 100644 (file)
@@ -69,6 +69,10 @@ tu_spirv_to_nir(struct tu_device *dev,
          .shader_viewport_index_layer = true,
          .geometry_streams = true,
          .device_group = true,
+         .descriptor_indexing = true,
+         .descriptor_array_dynamic_indexing = true,
+         .descriptor_array_non_uniform_indexing = true,
+         .runtime_descriptor_array = true,
       },
    };
    const nir_shader_compiler_options *nir_options =