glsl: Add structures to track accessed elements of a single array
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 14 Dec 2016 04:31:19 +0000 (20:31 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 19 Dec 2016 23:55:43 +0000 (15:55 -0800)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/ir_array_refcount.cpp
src/compiler/glsl/ir_array_refcount.h

index 36b22742fa8a55cf90d263c8bdb307e7a4d76dea..1b5c43c9927f976db9d63427c24da75a2aace002 100644 (file)
@@ -34,6 +34,7 @@
 #include "util/hash_table.h"
 
 ir_array_refcount_visitor::ir_array_refcount_visitor()
+   : derefs(0), num_derefs(0), derefs_size(0)
 {
    this->mem_ctx = ralloc_context(NULL);
    this->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
@@ -84,6 +85,26 @@ ir_array_refcount_visitor::get_variable_entry(ir_variable *var)
 }
 
 
+array_deref_range *
+ir_array_refcount_visitor::get_array_deref()
+{
+   if ((num_derefs + 1) * sizeof(array_deref_range) > derefs_size) {
+      void *ptr = reralloc_size(mem_ctx, derefs, derefs_size + 4096);
+
+      if (ptr == NULL)
+         return NULL;
+
+      derefs_size += 4096;
+      derefs = (array_deref_range *)ptr;
+   }
+
+   array_deref_range *d = &derefs[num_derefs];
+   num_derefs++;
+
+   return d;
+}
+
+
 ir_visitor_status
 ir_array_refcount_visitor::visit(ir_dereference_variable *ir)
 {
index 4296e4b9eebc8ee33a78ed0d0d20e47e1a7f96e7..1e7f34349f81b9a521af463e82123903d44642a9 100644 (file)
 #include "compiler/glsl_types.h"
 #include "util/bitset.h"
 
+/**
+ * Describes an access of an array element or an access of the whole array
+ */
+struct array_deref_range {
+   /**
+    * Index that was accessed.
+    *
+    * All valid array indices are less than the size of the array.  If index
+    * is equal to the size of the array, this means the entire array has been
+    * accessed (e.g., due to use of a non-constant index).
+    */
+   unsigned index;
+
+   /** Size of the array.  Used for offset calculations. */
+   unsigned size;
+};
+
 class ir_array_refcount_entry
 {
 public:
@@ -86,4 +103,22 @@ public:
    struct hash_table *ht;
 
    void *mem_ctx;
+
+private:
+   /** Get an array_deref_range element from private tracking. */
+   array_deref_range *get_array_deref();
+
+   /**
+    * \name array_deref_range tracking
+    */
+   /*@{*/
+   /** Currently allocated block of derefs. */
+   array_deref_range *derefs;
+
+   /** Number of derefs used in current processing. */
+   unsigned num_derefs;
+
+   /** Size of the derefs buffer in bytes. */
+   unsigned derefs_size;
+   /*@}*/
 };