[Mesa-dev] [PATCH 2/2] glsl: order indices for images inside a struct array

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu May 11 13:34:27 UTC 2017


ARB_bindless_texture allows images to be declared inside
structures. This is similar to samplers.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/compiler/glsl/link_uniforms.cpp | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp
index 51edb759f2..36a36f178f 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -442,6 +442,7 @@ public:
       current_var = var;
       field_counter = 0;
       this->record_next_sampler = new string_to_uint_map;
+      this->record_next_image = new string_to_uint_map;
 
       buffer_block_index = -1;
       if (var->is_in_buffer_block()) {
@@ -502,6 +503,7 @@ public:
          process(var);
       }
       delete this->record_next_sampler;
+      delete this->record_next_image;
    }
 
    int buffer_block_index;
@@ -595,27 +597,25 @@ private:
    }
 
    void handle_images(const glsl_type *base_type,
-                      struct gl_uniform_storage *uniform)
+                      struct gl_uniform_storage *uniform, const char *name)
    {
       if (base_type->is_image()) {
-         uniform->opaque[shader_type].index = this->next_image;
          uniform->opaque[shader_type].active = true;
 
+         count_indices(base_type, uniform, name, this->next_image,
+                       this->record_next_image);
+
          /* Set image access qualifiers */
          const GLenum access =
             (current_var->data.memory_read_only ? GL_READ_ONLY :
              current_var->data.memory_write_only ? GL_WRITE_ONLY :
                 GL_READ_WRITE);
 
-         const unsigned first = this->next_image;
-
-         /* Increment the image index by 1 for non-arrays and by the
-          * number of array elements for arrays.
-          */
-         this->next_image += MAX2(1, uniform->array_elements);
-
-         for (unsigned i = first; i < MIN2(next_image, MAX_IMAGE_UNIFORMS); i++)
+         for (unsigned i = uniform->opaque[shader_type].index;
+              i < MIN2(this->next_image, MAX_IMAGE_UNIFORMS);
+              i++) {
             prog->_LinkedShaders[shader_type]->Program->sh.ImageAccess[i] = access;
+         }
       }
    }
 
@@ -707,7 +707,7 @@ private:
 
       /* This assigns uniform indices to sampler and image uniforms. */
       handle_samplers(base_type, &this->uniforms[id], name);
-      handle_images(base_type, &this->uniforms[id]);
+      handle_images(base_type, &this->uniforms[id], name);
       handle_subroutines(base_type, &this->uniforms[id]);
 
       /* For array of arrays or struct arrays the base location may have
@@ -855,6 +855,11 @@ private:
     */
    struct string_to_uint_map *record_next_sampler;
 
+   /* Map for temporarily storing next imager index when handling images in
+    * struct arrays.
+    */
+   struct string_to_uint_map *record_next_image;
+
 public:
    union gl_constant_value *values;
 
-- 
2.12.2



More information about the mesa-dev mailing list