[Mesa-dev] [PATCH v4 (part2) 25/59] glsl: number of active shader storage blocks must be within allowed limits

Jordan Justen jordan.l.justen at intel.com
Tue Sep 8 15:11:49 PDT 2015


Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>

On 2015-08-05 01:30:22, Iago Toral Quiroga wrote:
> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> 
> Notice that we should differentiate betweeb shader storage blocks and
> uniform blocks, since they have different limits.
> 
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
>  src/glsl/linker.cpp | 43 +++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 39 insertions(+), 4 deletions(-)
> 
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 7ba685b..5d7d77f 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -2819,6 +2819,8 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
>  
>     unsigned blocks[MESA_SHADER_STAGES] = {0};
>     unsigned total_uniform_blocks = 0;
> +   unsigned shader_blocks[MESA_SHADER_STAGES] = {0};
> +   unsigned total_shader_storage_blocks = 0;
>  
>     for (unsigned i = 0; i < prog->NumUniformBlocks; i++) {
>        if (prog->UniformBlocks[i].UniformBufferSize > ctx->Const.MaxUniformBlockSize) {
> @@ -2830,8 +2832,15 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
>  
>        for (unsigned j = 0; j < MESA_SHADER_STAGES; j++) {
>          if (prog->UniformBlockStageIndex[j][i] != -1) {
> -           blocks[j]++;
> -           total_uniform_blocks++;
> +            struct gl_shader *sh = prog->_LinkedShaders[j];
> +            int stage_index = prog->UniformBlockStageIndex[j][i];
> +            if (sh && sh->UniformBlocks[stage_index].IsShaderStorage) {
> +               shader_blocks[j]++;
> +               total_shader_storage_blocks++;
> +            } else {
> +               blocks[j]++;
> +               total_uniform_blocks++;
> +            }
>          }
>        }
>  
> @@ -2852,6 +2861,24 @@ check_resources(struct gl_context *ctx, struct gl_shader_program *prog)
>             }
>          }
>        }
> +
> +      if (total_shader_storage_blocks > ctx->Const.MaxCombinedShaderStorageBlocks) {
> +         linker_error(prog, "Too many combined shader storage blocks (%d/%d)\n",
> +                      total_shader_storage_blocks,
> +                      ctx->Const.MaxCombinedShaderStorageBlocks);
> +      } else {
> +         for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
> +            const unsigned max_shader_storage_blocks =
> +               ctx->Const.Program[i].MaxShaderStorageBlocks;
> +            if (shader_blocks[i] > max_shader_storage_blocks) {
> +               linker_error(prog, "Too many %s shader storage blocks (%d/%d)\n",
> +                            _mesa_shader_stage_to_string(i),
> +                            shader_blocks[i],
> +                            max_shader_storage_blocks);
> +               break;
> +            }
> +         }
> +      }
>     }
>  }
>  
> @@ -2906,6 +2933,7 @@ check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog)
>  {
>     unsigned total_image_units = 0;
>     unsigned fragment_outputs = 0;
> +   unsigned total_shader_storage_blocks = 0;
>  
>     if (!ctx->Extensions.ARB_shader_image_load_store)
>        return;
> @@ -2920,6 +2948,12 @@ check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog)
>  
>           total_image_units += sh->NumImages;
>  
> +         for (unsigned j = 0; j < prog->NumUniformBlocks; j++) {
> +            int stage_index = prog->UniformBlockStageIndex[i][j];
> +            if (stage_index != -1 && sh->UniformBlocks[stage_index].IsShaderStorage)
> +               total_shader_storage_blocks++;
> +         }
> +
>           if (i == MESA_SHADER_FRAGMENT) {
>              foreach_in_list(ir_instruction, node, sh->ir) {
>                 ir_variable *var = node->as_variable();
> @@ -2933,9 +2967,10 @@ check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog)
>     if (total_image_units > ctx->Const.MaxCombinedImageUniforms)
>        linker_error(prog, "Too many combined image uniforms\n");
>  
> -   if (total_image_units + fragment_outputs >
> +   if (total_image_units + fragment_outputs + total_shader_storage_blocks >
>         ctx->Const.MaxCombinedImageUnitsAndFragmentOutputs)
> -      linker_error(prog, "Too many combined image uniforms and fragment outputs\n");
> +      linker_error(prog, "Too many combined image uniforms, shader storage "
> +                         " buffers and fragment outputs\n");
>  }
>  
>  
> -- 
> 1.9.1
> 


More information about the mesa-dev mailing list