glsl/util: update util_range_remap to use range_remap struct

This will allow us to use the linked list for validation of inserts
during linking then switch to using an array for fast binary searches.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37754>
This commit is contained in:
Timothy Arceri 2025-10-14 12:00:13 +11:00 committed by Marge Bot
parent 35d5e903ac
commit 754c6d0f54
7 changed files with 29 additions and 23 deletions

View file

@ -281,7 +281,7 @@ setup_uniform_remap_tables(const struct gl_constants *consts,
* that we can keep track of unused uniforms with explicit locations.
*/
assert(!prog->data->spirv ||
(prog->data->spirv && list_is_empty(prog->UniformRemapTable)));
(prog->data->spirv && list_is_empty(&prog->UniformRemapTable->r_list)));
union gl_constant_value *data =
rzalloc_array(prog->data,

View file

@ -254,7 +254,7 @@ link_util_update_empty_uniform_locations(const struct gl_constants *consts,
struct gl_shader_program *prog)
{
int prev_end = -1;
list_for_each_entry_safe(struct range_entry, e, prog->UniformRemapTable, node) {
list_for_each_entry_safe(struct range_entry, e, &prog->UniformRemapTable->r_list, node) {
unsigned next_slot = prev_end + 1;
if (e->start > next_slot) {
/* We've found the beginning of a new continous block of empty slots */

View file

@ -645,7 +645,7 @@ write_uniform_remap_tables(struct blob *metadata,
struct gl_shader_program *prog)
{
write_uniform_remap_list(metadata, prog->data->UniformStorage,
prog->UniformRemapTable);
&prog->UniformRemapTable->r_list);
for (unsigned i = 0; i < MESA_SHADER_MESH_STAGES; i++) {
struct gl_linked_shader *sh = prog->_LinkedShaders[i];
@ -661,7 +661,7 @@ write_uniform_remap_tables(struct blob *metadata,
static void
read_uniform_remap_list(struct blob_reader *metadata,
struct gl_shader_program *prog,
struct list_head *remap_list,
struct range_remap *range_remap,
gl_uniform_storage *uniform_storage)
{
unsigned num_list_entries = blob_read_uint32(metadata);
@ -682,7 +682,7 @@ read_uniform_remap_list(struct blob_reader *metadata,
unsigned start = blob_read_uint32(metadata);
unsigned end = blob_read_uint32(metadata);
util_range_insert_remap(start, end, remap_list, uniform);
util_range_insert_remap(start, end, range_remap, uniform);
}
}

View file

@ -451,7 +451,7 @@ struct gl_shader_program
* UniformStorage entries. Arrays will have multiple contiguous slots
* in the UniformRemapTable, all pointing to the same UniformStorage entry.
*/
struct list_head *UniformRemapTable;
struct range_remap *UniformRemapTable;
/**
* Sometimes there are empty slots left over in UniformRemapTable after we

View file

@ -211,7 +211,7 @@ validate_uniform_parameters(GLint location, GLsizei count,
/* Check that the given location is in bounds of uniform remap table */
if (unlikely(location >= 0 &&
(shProg->UniformRemapTable == NULL || list_is_empty(shProg->UniformRemapTable)))) {
(shProg->UniformRemapTable == NULL || list_is_empty(&shProg->UniformRemapTable->r_list)))) {
if (!shProg->data->LinkStatus)
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(program not linked)",
caller);

View file

@ -90,8 +90,9 @@ get_range_entry(unsigned n, const struct list_head *r_list)
*/
struct range_entry *
util_range_insert_remap(unsigned start, unsigned end,
struct list_head *r_list, void *ptr)
struct range_remap *r_remap, void *ptr)
{
struct list_head *r_list = &r_remap->r_list;
struct range_entry *entry = NULL;
if (list_is_empty(r_list)) {
entry = rzalloc(r_list, struct range_entry);
@ -170,25 +171,25 @@ insert_end:
/* Return the range entry that maps to n or NULL if no match found. */
struct range_entry *
util_range_remap(unsigned n, const struct list_head *r_list)
util_range_remap(unsigned n, const struct range_remap *r_remap)
{
return get_range_entry(n, r_list);
return get_range_entry(n, &r_remap->r_list);
}
struct list_head *
struct range_remap *
util_create_range_remap()
{
struct range_entry *r = rzalloc(NULL, struct range_entry);
list_inithead(&r->node);
return &r->node;
struct range_remap *r = rzalloc(NULL, struct range_remap);
list_inithead(&r->r_list);
return r;
}
/* Free previous list and create a new empty list */
struct list_head *
util_reset_range_remap(struct list_head *r_list)
struct range_remap *
util_reset_range_remap(struct range_remap *r_remap)
{
if (r_list)
ralloc_free(r_list);
if (r_remap)
ralloc_free(r_remap);
return util_create_range_remap();
}

View file

@ -27,6 +27,11 @@
extern "C" {
#endif
struct range_remap {
/* Linked list of range remap entries */
struct list_head r_list;
};
struct range_entry {
struct list_head node;
@ -36,16 +41,16 @@ struct range_entry {
struct range_entry *
util_range_insert_remap(unsigned start, unsigned end,
struct list_head *r_list, void *ptr);
struct range_remap *r_remap, void *ptr);
struct range_entry *
util_range_remap(unsigned n, const struct list_head *r_list);
util_range_remap(unsigned n, const struct range_remap *r_remap);
struct list_head *
struct range_remap *
util_create_range_remap(void);
struct list_head *
util_reset_range_remap(struct list_head *r_list);
struct range_remap *
util_reset_range_remap(struct range_remap *r_remap);
#ifdef __cplusplus
}