diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/glsl/ir_optimization.h | 5 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 3 | ||||
-rw-r--r-- | src/compiler/glsl/lower_shared_reference.cpp | 21 |
3 files changed, 23 insertions, 6 deletions
diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index 38fb54990ea..eb3ec3b0c7d 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -143,8 +143,9 @@ bool lower_clip_cull_distance(struct gl_shader_program *prog, gl_linked_shader *shader); void lower_output_reads(unsigned stage, exec_list *instructions); bool lower_packing_builtins(exec_list *instructions, int op_mask); -void lower_shared_reference(struct gl_linked_shader *shader, - unsigned *shared_size); +void lower_shared_reference(struct gl_context *ctx, + struct gl_shader_program *prog, + struct gl_linked_shader *shader); void lower_ubo_reference(struct gl_linked_shader *shader, bool clamp_block_indices, bool use_std430_as_default); void lower_packed_varyings(void *mem_ctx, diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index f352c5385ca..03eb05bf637 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -4657,8 +4657,7 @@ link_varyings_and_uniforms(unsigned first, unsigned last, ctx->Const.UseSTD430AsDefaultPacking); if (i == MESA_SHADER_COMPUTE) - lower_shared_reference(prog->_LinkedShaders[i], - &prog->Comp.SharedSize); + lower_shared_reference(ctx, prog, prog->_LinkedShaders[i]); lower_vector_derefs(prog->_LinkedShaders[i]); do_vec_index_to_swizzle(prog->_LinkedShaders[i]->ir); diff --git a/src/compiler/glsl/lower_shared_reference.cpp b/src/compiler/glsl/lower_shared_reference.cpp index b9098913af8..a1b3f7df47e 100644 --- a/src/compiler/glsl/lower_shared_reference.cpp +++ b/src/compiler/glsl/lower_shared_reference.cpp @@ -33,6 +33,7 @@ #include "lower_buffer_access.h" #include "ir_builder.h" +#include "linker.h" #include "main/macros.h" #include "util/list.h" #include "glsl_parser_extras.h" @@ -478,7 +479,9 @@ lower_shared_reference_visitor::visit_enter(ir_call *ir) } /* unnamed namespace */ void -lower_shared_reference(struct gl_linked_shader *shader, unsigned *shared_size) +lower_shared_reference(struct gl_context *ctx, + struct gl_shader_program *prog, + struct gl_linked_shader *shader) { if (shader->Stage != MESA_SHADER_COMPUTE) return; @@ -495,5 +498,19 @@ lower_shared_reference(struct gl_linked_shader *shader, unsigned *shared_size) visit_list_elements(&v, shader->ir); } while (v.progress); - *shared_size = v.shared_size; + prog->Comp.SharedSize = v.shared_size; + + /* Section 19.1 (Compute Shader Variables) of the OpenGL 4.5 (Core Profile) + * specification says: + * + * "There is a limit to the total size of all variables declared as + * shared in a single program object. This limit, expressed in units of + * basic machine units, may be queried as the value of + * MAX_COMPUTE_SHARED_MEMORY_SIZE." + */ + if (prog->Comp.SharedSize > ctx->Const.MaxComputeSharedMemorySize) { + linker_error(prog, "Too much shared memory used (%u/%u)\n", + prog->Comp.SharedSize, + ctx->Const.MaxComputeSharedMemorySize); + } } |