Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>
On 2015-08-05 01:30:22, Iago Toral Quiroga wrote: > From: Samuel Iglesias Gonsalvez <sigles...@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 <sigles...@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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev