glsl: Check earlier for MaxTextureImageUnits and MaxImageUniforms

Currently the linker do all the work then check for the limits, which
means num_textures and num_images in shader_info may have to store more
than the limit.  This breaks down now since shader_info was packed and
doesn't expect to store larger invalid values.

To fix this, pull the check before we set the counts in shader_info.
Add necessary plumbing to make sure we bail once those errors are
found.

Fixes: 84a1a2578d ("compiler: pack shader_info from 160 bytes to 96 bytes")
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Caio Marcelo de Oliveira Filho
2019-11-08 22:21:10 -08:00
parent fce76ae769
commit d4a3b09c4b
2 changed files with 24 additions and 12 deletions
+21
View File
@@ -1505,6 +1505,22 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
uniform_size.process(var);
}
if (uniform_size.num_shader_samplers >
ctx->Const.Program[i].MaxTextureImageUnits) {
linker_error(prog, "Too many %s shader texture samplers\n",
_mesa_shader_stage_to_string(i));
continue;
}
if (uniform_size.num_shader_images >
ctx->Const.Program[i].MaxImageUniforms) {
linker_error(prog, "Too many %s shader image uniforms (%u > %u)\n",
_mesa_shader_stage_to_string(i),
sh->Program->info.num_images,
ctx->Const.Program[i].MaxImageUniforms);
continue;
}
sh->Program->info.num_textures = uniform_size.num_shader_samplers;
sh->Program->info.num_images = uniform_size.num_shader_images;
sh->num_uniform_components = uniform_size.num_shader_uniform_components;
@@ -1516,6 +1532,11 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
}
}
if (prog->data->LinkStatus == LINKING_FAILURE) {
delete hiddenUniforms;
return;
}
prog->data->NumUniformStorage = uniform_size.num_active_uniforms;
prog->data->NumHiddenUniforms = uniform_size.num_hidden_uniforms;
+3 -12
View File
@@ -3336,12 +3336,6 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
if (sh == NULL)
continue;
if (sh->Program->info.num_textures >
ctx->Const.Program[i].MaxTextureImageUnits) {
linker_error(prog, "Too many %s shader texture samplers\n",
_mesa_shader_stage_to_string(i));
}
if (sh->num_uniform_components >
ctx->Const.Program[i].MaxUniformComponents) {
if (ctx->Const.GLSLSkipStrictMaxUniformLimitCheck) {
@@ -3473,12 +3467,6 @@ check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog)
struct gl_linked_shader *sh = prog->_LinkedShaders[i];
if (sh) {
if (sh->Program->info.num_images > ctx->Const.Program[i].MaxImageUniforms)
linker_error(prog, "Too many %s shader image uniforms (%u > %u)\n",
_mesa_shader_stage_to_string(i),
sh->Program->info.num_images,
ctx->Const.Program[i].MaxImageUniforms);
total_image_units += sh->Program->info.num_images;
total_shader_storage_blocks += sh->Program->info.num_ssbos;
@@ -4765,6 +4753,9 @@ link_and_validate_uniforms(struct gl_context *ctx,
update_array_sizes(prog);
link_assign_uniform_locations(prog, ctx);
if (prog->data->LinkStatus == LINKING_FAILURE)
return;
link_assign_atomic_counter_resources(ctx, prog);
link_calculate_subroutine_compat(prog);
check_resources(ctx, prog);