mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 06:48:06 +02:00
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:
parent
62ff99d9c3
commit
8579c21798
3 changed files with 89 additions and 94 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue