glsl: error check max user assignable uniform locations

This adds the error check to the NIR uniform linker.

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4623>
This commit is contained in:
Timothy Arceri 2020-03-06 10:27:44 +11:00 committed by Marge Bot
parent c7355c4fb9
commit 5dbebf4982
1 changed files with 18 additions and 0 deletions

View File

@ -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];