diff options
author | Samuel Iglesias Gonsalvez <[email protected]> | 2015-04-21 12:12:05 +0200 |
---|---|---|
committer | Samuel Iglesias Gonsalvez <[email protected]> | 2015-09-25 08:39:22 +0200 |
commit | a7b4ab45d08d8469daefb9f2af34ad6860b9fc3b (patch) | |
tree | 358328f546da9be419cf05a6a4b70185153d7dcd /src/glsl | |
parent | e854a9800120ac0b1930da27f39207a35a637779 (diff) |
glsl: a shader storage buffer must be smaller than the maximum size allowed
Otherwise, generate a link time error as per the
ARB_shader_storage_buffer_object spec.
v2:
- Fix error message (Jordan)
v3:
- Move std140_size() changes to its own patch (Kristian)
Signed-off-by: Samuel Iglesias Gonsalvez <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>
Reviewed-by: Kristian Høgsberg <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/link_uniform_blocks.cpp | 19 | ||||
-rw-r--r-- | src/glsl/linker.cpp | 2 | ||||
-rw-r--r-- | src/glsl/linker.h | 1 |
3 files changed, 21 insertions, 1 deletions
diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp index 8f65f4a3ab7..7ceffee799e 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 47d8b5ad1bf..c0520be4f15 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -1996,7 +1996,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 7c2bd59aeb7..c80be1c7e22 100644 --- a/src/glsl/linker.h +++ b/src/glsl/linker.h @@ -53,6 +53,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, |