[Mesa-dev] [PATCH v5 29/70] glsl: a shader storage buffer must be smaller than the maximum size allowed

Kristian Høgsberg krh at bitplanet.net
Fri Sep 18 11:59:41 PDT 2015


On Thu, Sep 10, 2015 at 03:35:45PM +0200, Iago Toral Quiroga wrote:
> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> 
> Otherwise, generate a link time error as per the
> ARB_shader_storage_buffer_object spec.
> 
> v2:
> - Fix error message (Jordan)
> 
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
>  src/glsl/glsl_types.cpp          |  9 +++++++--
>  src/glsl/link_uniform_blocks.cpp | 19 +++++++++++++++++++
>  src/glsl/linker.cpp              |  2 +-
>  src/glsl/linker.h                |  1 +
>  4 files changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index d97991a..f8227df 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -1325,7 +1325,7 @@ glsl_type::std140_size(bool row_major) const
>      *     rounded up to the next multiple of the base alignment of the
>      *     structure.
>      */
> -   if (this->is_record()) {
> +   if (this->is_record() || this->is_interface()) {
>        unsigned size = 0;
>        unsigned max_align = 0;
>  
> @@ -1341,7 +1341,12 @@ glsl_type::std140_size(bool row_major) const
>  
>  	 const struct glsl_type *field_type = this->fields.structure[i].type;
>  	 unsigned align = field_type->std140_base_alignment(field_row_major);
> -	 size = glsl_align(size, align);
> +
> +         /* Ignore unsized arrays when calculating size */
> +         if (field_type->is_unsized_array())
> +            continue;
> +
> +         size = glsl_align(size, align);
>  	 size += field_type->std140_size(field_row_major);
>  
>           max_align = MAX2(align, max_align);

These two chunks look like they should be their own patch ("Add
unsized array support to glsl_type::std140_size" or such).

> diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp
> index 8f65f4a..7ceffee 100644
> --- a/src/glsl/link_uniform_blocks.cpp
> +++ b/src/glsl/link_uniform_blocks.cpp
> @@ -187,6 +187,7 @@ struct block {
>  
>  unsigned
>  link_uniform_blocks(void *mem_ctx,
> +                    struct gl_context *ctx,
>                      struct gl_shader_program *prog,
>                      struct gl_shader **shader_list,
>                      unsigned num_shaders,
> @@ -308,6 +309,15 @@ link_uniform_blocks(void *mem_ctx,
>  
>              blocks[i].UniformBufferSize = parcel.buffer_size;
>  
> +            /* Check SSBO size is lower than maximum supported size for SSBO */
> +            if (b->is_shader_storage &&
> +                parcel.buffer_size > ctx->Const.MaxShaderStorageBlockSize) {
> +               linker_error(prog, "shader storage block `%s' has size %d, "
> +                            "which is larger than than the maximum allowed (%d)",
> +                            block_type->name,
> +                            parcel.buffer_size,
> +                            ctx->Const.MaxShaderStorageBlockSize);
> +            }
>              blocks[i].NumUniforms =
>                 (unsigned)(ptrdiff_t)(&variables[parcel.index] - blocks[i].Uniforms);
>  
> @@ -328,6 +338,15 @@ link_uniform_blocks(void *mem_ctx,
>  
>           blocks[i].UniformBufferSize = parcel.buffer_size;
>  
> +         /* Check SSBO size is lower than maximum supported size for SSBO */
> +         if (b->is_shader_storage &&
> +             parcel.buffer_size > ctx->Const.MaxShaderStorageBlockSize) {
> +            linker_error(prog, "shader storage block `%s' has size %d, "
> +                         "which is larger than than the maximum allowed (%d)",
> +                         block_type->name,
> +                         parcel.buffer_size,
> +                         ctx->Const.MaxShaderStorageBlockSize);
> +         }
>           blocks[i].NumUniforms =
>              (unsigned)(ptrdiff_t)(&variables[parcel.index] - blocks[i].Uniforms);
>  
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index e078f86..cf9f1f6 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -2023,7 +2023,7 @@ link_intrastage_shaders(void *mem_ctx,
>  
>     /* Link up uniform blocks defined within this stage. */
>     const unsigned num_uniform_blocks =
> -      link_uniform_blocks(mem_ctx, prog, shader_list, num_shaders,
> +      link_uniform_blocks(mem_ctx, ctx, prog, shader_list, num_shaders,
>                            &uniform_blocks);
>     if (!prog->LinkStatus)
>        return NULL;
> diff --git a/src/glsl/linker.h b/src/glsl/linker.h
> index fb8f81e..953b49f 100644
> --- a/src/glsl/linker.h
> +++ b/src/glsl/linker.h
> @@ -56,6 +56,7 @@ link_uniform_blocks_are_compatible(const gl_uniform_block *a,
>  
>  extern unsigned
>  link_uniform_blocks(void *mem_ctx,
> +                    struct gl_context *ctx,
>                      struct gl_shader_program *prog,
>                      struct gl_shader **shader_list,
>                      unsigned num_shaders,
> -- 
> 1.9.1
> 


More information about the mesa-dev mailing list