Mesa (master): glsl: Check earlier for MaxTextureImageUnits and MaxImageUniforms
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Nov 11 19:35:56 UTC 2019
Module: Mesa
Branch: master
Commit: d4a3b09c4bfd955dab92dbb27ab8bc273d18e649
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d4a3b09c4bfd955dab92dbb27ab8bc273d18e649
Author: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Date: Fri Nov 8 22:21:10 2019 -0800
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 <tarceri at itsqueeze.com>
---
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);
More information about the mesa-commit
mailing list