From 5dbebf49822ff3fb3bc3e6123bac30214c432b77 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 6 Mar 2020 10:27:44 +1100 Subject: [PATCH] glsl: error check max user assignable uniform locations MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This adds the error check to the NIR uniform linker. Reviewed-by: Alejandro Piñeiro Part-of: --- src/compiler/glsl/gl_nir_link_uniforms.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c index 69d7aa57022..de168eb1a3a 100644 --- a/src/compiler/glsl/gl_nir_link_uniforms.c +++ b/src/compiler/glsl/gl_nir_link_uniforms.c @@ -48,6 +48,8 @@ static void nir_setup_uniform_remap_tables(struct gl_context *ctx, struct gl_shader_program *prog) { + unsigned total_entries = prog->NumExplicitUniformLocations; + /* For glsl this may have been allocated by reserve_explicit_locations() so * that we can keep track of unused uniforms with explicit locations. */ @@ -122,6 +124,13 @@ nir_setup_uniform_remap_tables(struct gl_context *ctx, /* How many entries for this uniform? */ const unsigned entries = MAX2(1, uniform->array_elements); + /* Add new entries to the total amount for checking against MAX_UNIFORM- + * _LOCATIONS. This only applies to the default uniform block (-1), + * because locations of uniform block entries are not assignable. + */ + if (prog->data->UniformStorage[i].block_index == -1) + total_entries += entries; + unsigned location = link_util_find_empty_block(prog, &prog->data->UniformStorage[i]); @@ -155,6 +164,15 @@ nir_setup_uniform_remap_tables(struct gl_context *ctx, } } + /* Verify that total amount of entries for explicit and implicit locations + * is less than MAX_UNIFORM_LOCATIONS. + */ + if (total_entries > ctx->Const.MaxUserAssignableUniformLocations) { + linker_error(prog, "count of uniform locations > MAX_UNIFORM_LOCATIONS" + "(%u > %u)", total_entries, + ctx->Const.MaxUserAssignableUniformLocations); + } + /* Reserve all the explicit locations of the active subroutine uniforms. */ for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { struct gl_uniform_storage *uniform = &prog->data->UniformStorage[i]; -- 2.30.2