glsl: move mark_array_elements_referenced() with ubo code

Since we no longer share this with the old glsl ir linker just move
it to where it is called from.

Acked-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36366>
This commit is contained in:
Timothy Arceri 2025-07-24 13:44:19 +10:00 committed by Marge Bot
parent 62ff99d9c3
commit 8579c21798
3 changed files with 89 additions and 94 deletions

View file

@ -45,6 +45,93 @@ struct uniform_array_info {
BITSET_WORD *indices;
};
/**
* Recursive part of the public mark_array_elements_referenced function.
*
* 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.
*/
static void
_mark_array_elements_referenced(const struct array_deref_range *dr,
unsigned count, unsigned scale,
unsigned linearized_index,
BITSET_WORD *bits)
{
/* Walk through the list of array dereferences in least- to
* most-significant order. Along the way, accumulate the current
* linearized offset and the scale factor for each array-of-.
*/
for (unsigned i = 0; i < count; i++) {
if (dr[i].index < dr[i].size) {
linearized_index += dr[i].index * scale;
scale *= dr[i].size;
} else {
/* For each element in the current array, update the count and
* offset, then recurse to process the remaining arrays.
*
* There is some inefficency here if the last eBITSET_WORD *bitslement in the
* array_deref_range list specifies the entire array. In that case,
* the loop will make recursive calls with count == 0. In the call,
* all that will happen is the bit will be set.
*/
for (unsigned j = 0; j < dr[i].size; j++) {
_mark_array_elements_referenced(&dr[i + 1],
count - (i + 1),
scale * dr[i].size,
linearized_index + (j * scale),
bits);
}
return;
}
}
BITSET_SET(bits, linearized_index);
}
/**
* 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.
*/
static void
mark_array_elements_referenced(const struct array_deref_range *dr,
unsigned count, unsigned array_depth,
BITSET_WORD *bits)
{
if (count != array_depth)
return;
_mark_array_elements_referenced(dr, count, 1, 0, bits);
}
static unsigned
uniform_storage_size(const struct glsl_type *type)
{
@ -495,8 +582,8 @@ add_var_use_deref(nir_deref_instr *deref, struct hash_table *live,
array_depth++;
}
link_util_mark_array_elements_referenced(*derefs, num_derefs, array_depth,
ainfo->indices);
mark_array_elements_referenced(*derefs, num_derefs, array_depth,
ainfo->indices);
util_dynarray_append(ainfo->deref_list, nir_deref_instr *, deref);
}

View file

@ -408,93 +408,6 @@ link_util_calculate_subroutine_compat(struct gl_shader_program *prog)
}
}
/**
* Recursive part of the public mark_array_elements_referenced function.
*
* 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 struct array_deref_range *dr,
unsigned count, unsigned scale,
unsigned linearized_index,
BITSET_WORD *bits)
{
/* Walk through the list of array dereferences in least- to
* most-significant order. Along the way, accumulate the current
* linearized offset and the scale factor for each array-of-.
*/
for (unsigned i = 0; i < count; i++) {
if (dr[i].index < dr[i].size) {
linearized_index += dr[i].index * scale;
scale *= dr[i].size;
} else {
/* For each element in the current array, update the count and
* offset, then recurse to process the remaining arrays.
*
* There is some inefficency here if the last eBITSET_WORD *bitslement in the
* array_deref_range list specifies the entire array. In that case,
* the loop will make recursive calls with count == 0. In the call,
* all that will happen is the bit will be set.
*/
for (unsigned j = 0; j < dr[i].size; j++) {
_mark_array_elements_referenced(&dr[i + 1],
count - (i + 1),
scale * dr[i].size,
linearized_index + (j * scale),
bits);
}
return;
}
}
BITSET_SET(bits, linearized_index);
}
/**
* 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
link_util_mark_array_elements_referenced(const struct array_deref_range *dr,
unsigned count, unsigned array_depth,
BITSET_WORD *bits)
{
if (count != array_depth)
return;
_mark_array_elements_referenced(dr, count, 1, 0, bits);
}
const char *
interpolation_string(unsigned interpolation)
{

View file

@ -128,11 +128,6 @@ link_util_check_uniform_resources(const struct gl_constants *consts,
void
link_util_calculate_subroutine_compat(struct gl_shader_program *prog);
void
link_util_mark_array_elements_referenced(const struct array_deref_range *dr,
unsigned count, unsigned array_depth,
BITSET_WORD *bits);
void
resource_name_updated(struct gl_resource_name *name);