diff options
author | Ian Romanick <[email protected]> | 2016-12-15 14:01:28 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-12-19 15:55:43 -0800 |
commit | e92935089bd9a987027d1f0791e7298bb3a57113 (patch) | |
tree | 6f84d8ee56054d78b8e7a25d4582d060bc8a5e56 /src/compiler/glsl/ir_array_refcount.h | |
parent | 8d499f60c88b70a39f53d0fbe96a6ada6fd36b8b (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.h | 49 |
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; }; |