[Mesa-dev] [PATCH v4 (part2) 24/59] glsl: a shader storage buffer must be smaller than the maximum size allowed
Jordan Justen
jordan.l.justen at intel.com
Tue Sep 8 10:50:21 PDT 2015
On 2015-08-05 01:30:21, 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.
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
> src/glsl/glsl_types.cpp | 9 +++++++--
> src/glsl/link_uniform_blocks.cpp | 17 +++++++++++++++++
> src/glsl/linker.cpp | 2 +-
> src/glsl/linker.h | 1 +
> 4 files changed, 26 insertions(+), 3 deletions(-)
>
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index 5758029..1b8e2e4 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -1312,7 +1312,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;
>
> @@ -1328,7 +1328,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);
> diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp
> index c891d03..2cda78d 100644
> --- a/src/glsl/link_uniform_blocks.cpp
> +++ b/src/glsl/link_uniform_blocks.cpp
> @@ -178,6 +178,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,
> @@ -299,6 +300,14 @@ 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 > %d",
> + block_type->name,
> + parcel.buffer_size,
> + ctx->Const.MaxShaderStorageBlockSize);
This error message (and below) seems confusing. What about "shader
storage block `%s' has size %d, which is larger than than the maximum
allowed (%d)"?
Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
> + }
> blocks[i].NumUniforms =
> (unsigned)(ptrdiff_t)(&variables[parcel.index] - blocks[i].Uniforms);
>
> @@ -319,6 +328,14 @@ 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 > %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 9aff3ce..7ba685b 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 ce3dc32..ada5a1f 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