From 754c6d0f54f2acf19057416f9c39dcd0f26c3c70 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Tue, 14 Oct 2025 12:00:13 +1100 Subject: [PATCH] glsl/util: update util_range_remap to use range_remap struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Part-of: --- src/compiler/glsl/gl_nir_link_uniforms.c | 2 +- src/compiler/glsl/linker_util.cpp | 2 +- src/compiler/glsl/serialize.cpp | 6 +++--- src/mesa/main/shader_types.h | 2 +- src/mesa/main/uniform_query.cpp | 2 +- src/util/u_range_remap.c | 23 ++++++++++++----------- src/util/u_range_remap.h | 15 ++++++++++----- 7 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c index 8f8df461805..2c125729dc5 100644 --- a/src/compiler/glsl/gl_nir_link_uniforms.c +++ b/src/compiler/glsl/gl_nir_link_uniforms.c @@ -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, diff --git a/src/compiler/glsl/linker_util.cpp b/src/compiler/glsl/linker_util.cpp index 15e40134923..797fd7ff216 100644 --- a/src/compiler/glsl/linker_util.cpp +++ b/src/compiler/glsl/linker_util.cpp @@ -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 */ diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index cc2f38386cb..bc91e08a0d0 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -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); } } diff --git a/src/mesa/main/shader_types.h b/src/mesa/main/shader_types.h index 42aba9d1c7a..f60917fa235 100644 --- a/src/mesa/main/shader_types.h +++ b/src/mesa/main/shader_types.h @@ -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 diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index 54957c0d762..ac8aab5cb2e 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -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); diff --git a/src/util/u_range_remap.c b/src/util/u_range_remap.c index d56367497a0..bd7082a6564 100644 --- a/src/util/u_range_remap.c +++ b/src/util/u_range_remap.c @@ -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(); } diff --git a/src/util/u_range_remap.h b/src/util/u_range_remap.h index bb78bd6c077..6c2294ec0b5 100644 --- a/src/util/u_range_remap.h +++ b/src/util/u_range_remap.h @@ -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 }