diff options
author | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-11-08 22:00:10 -0800 |
---|---|---|
committer | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-11-11 10:58:40 -0800 |
commit | fce76ae7690e5a36f3744466d0e8df90e69bc80f (patch) | |
tree | 736e58b9306a5e629a1a1fe15bdddee161873df0 | |
parent | a8d941091f72923561a6c58b46ccb264b6a0e205 (diff) |
glsl: Check earlier for MaxShaderStorageBlocks and MaxUniformBlocks
Currently the linker do all the work then check for the limits, which
means num_ssbos and num_ubos 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.
One drawback of this approach is that for some cases we might not see
the collected errors from various stages, but bail as soon as a stage
breaks the limits.
Fixes: 84a1a2578da ("compiler: pack shader_info from 160 bytes to 96 bytes")
Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r-- | src/compiler/glsl/linker.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index eb615ebd30a..d39c63ae743 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -2502,6 +2502,22 @@ link_intrastage_shaders(void *mem_ctx, link_uniform_blocks(mem_ctx, ctx, prog, linked, &ubo_blocks, &num_ubo_blocks, &ssbo_blocks, &num_ssbo_blocks); + const unsigned max_uniform_blocks = + ctx->Const.Program[linked->Stage].MaxUniformBlocks; + if (num_ubo_blocks > max_uniform_blocks) { + linker_error(prog, "Too many %s uniform blocks (%d/%d)\n", + _mesa_shader_stage_to_string(linked->Stage), + num_ubo_blocks, max_uniform_blocks); + } + + const unsigned max_shader_storage_blocks = + ctx->Const.Program[linked->Stage].MaxShaderStorageBlocks; + if (num_ssbo_blocks > max_shader_storage_blocks) { + linker_error(prog, "Too many %s shader storage blocks (%d/%d)\n", + _mesa_shader_stage_to_string(linked->Stage), + num_ssbo_blocks, max_shader_storage_blocks); + } + if (!prog->data->LinkStatus) { _mesa_delete_linked_shader(ctx, linked); return NULL; @@ -3356,22 +3372,6 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog) total_shader_storage_blocks += sh->Program->info.num_ssbos; total_uniform_blocks += sh->Program->info.num_ubos; - - const unsigned max_uniform_blocks = - ctx->Const.Program[i].MaxUniformBlocks; - if (max_uniform_blocks < sh->Program->info.num_ubos) { - linker_error(prog, "Too many %s uniform blocks (%d/%d)\n", - _mesa_shader_stage_to_string(i), - sh->Program->info.num_ubos, max_uniform_blocks); - } - - const unsigned max_shader_storage_blocks = - ctx->Const.Program[i].MaxShaderStorageBlocks; - if (max_shader_storage_blocks < sh->Program->info.num_ssbos) { - linker_error(prog, "Too many %s shader storage blocks (%d/%d)\n", - _mesa_shader_stage_to_string(i), - sh->Program->info.num_ssbos, max_shader_storage_blocks); - } } if (total_uniform_blocks > ctx->Const.MaxCombinedUniformBlocks) { |