summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/ir_array_refcount.h
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2016-12-15 14:01:28 -0800
committerIan Romanick <[email protected]>2016-12-19 15:55:43 -0800
commite92935089bd9a987027d1f0791e7298bb3a57113 (patch)
tree6f84d8ee56054d78b8e7a25d4582d060bc8a5e56 /src/compiler/glsl/ir_array_refcount.h
parent8d499f60c88b70a39f53d0fbe96a6ada6fd36b8b (diff)
glsl: Mark a set of array elements as accessed using a list of array_deref_range
Signed-off-by: Ian Romanick <[email protected]> Cc: [email protected] Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/compiler/glsl/ir_array_refcount.h')
-rw-r--r--src/compiler/glsl/ir_array_refcount.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/compiler/glsl/ir_array_refcount.h b/src/compiler/glsl/ir_array_refcount.h
index 1e7f34349f8..2988046aaed 100644
--- a/src/compiler/glsl/ir_array_refcount.h
+++ b/src/compiler/glsl/ir_array_refcount.h
@@ -60,6 +60,34 @@ public:
/** Has the variable been referenced? */
bool is_referenced;
+ /**
+ * Mark a set of array elements as accessed.
+ *
+ * If every \c array_deref_range is for a single index, only a single
+ * element will be marked. If any \c array_deref_range is for an entire
+ * array-of-, then multiple elements will be marked.
+ *
+ * Items in the \c array_deref_range list appear in least- to
+ * most-significant order. This is the \b opposite order the indices
+ * appear in the GLSL shader text. An array access like
+ *
+ * x = y[1][i][3];
+ *
+ * would appear as
+ *
+ * { { 3, n }, { m, m }, { 1, p } }
+ *
+ * where n, m, and p are the sizes of the arrays-of-arrays.
+ *
+ * The set of marked array elements can later be queried by
+ * \c ::is_linearized_index_referenced.
+ *
+ * \param dr List of array_deref_range elements to be processed.
+ * \param count Number of array_deref_range elements to be processed.
+ */
+ void mark_array_elements_referenced(const array_deref_range *dr,
+ unsigned count);
+
/** Has a linearized array index been referenced? */
bool is_linearized_index_referenced(unsigned linearized_index) const
{
@@ -80,6 +108,27 @@ private:
*/
unsigned num_bits;
+ /** Count of nested arrays in the type. */
+ unsigned array_depth;
+
+ /**
+ * Recursive part of the public mark_array_elements_referenced method.
+ *
+ * The recursion occurs when an entire array-of- is accessed. See the
+ * implementation for more details.
+ *
+ * \param dr List of array_deref_range elements to be
+ * processed.
+ * \param count Number of array_deref_range elements to be
+ * processed.
+ * \param scale Current offset scale.
+ * \param linearized_index Current accumulated linearized array index.
+ */
+ void mark_array_elements_referenced(const array_deref_range *dr,
+ unsigned count,
+ unsigned scale,
+ unsigned linearized_index);
+
friend class array_refcount_test;
};