From d4a3b09c4bfd955dab92dbb27ab8bc273d18e649 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Fri, 8 Nov 2019 22:21:10 -0800 Subject: [PATCH] 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: 84a1a2578da ("compiler: pack shader_info from 160 bytes to 96 bytes") Reviewed-by: Timothy Arceri --- src/compiler/glsl/link_uniforms.cpp | 21 +++++++++++++++++++++ src/compiler/glsl/linker.cpp | 15 +++------------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index d588f3fc190..ceeb7f24435 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -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; diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index d39c63ae743..977d91f5118 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -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); -- 2.30.2