[Mesa-dev] [PATCH v2 11/82] glsl: enable binding layout qualifier usage for shader storage buffer objects
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Tue Jun 9 23:00:29 PDT 2015
On 09/06/15 20:19, Jordan Justen wrote:
> On 2015-06-03 00:01:01, Iago Toral Quiroga wrote:
>> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>>
>> See GLSL 4.30 spec, section 4.4.5 "Uniform and Shader Storage Block
>> Layout Qualifiers".
>>
>> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>> ---
>> src/glsl/ast_to_hir.cpp | 29 ++++++++++++++++++++++++-----
>> src/glsl/glsl_parser.yy | 3 ++-
>> 2 files changed, 26 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
>> index 63ab56a..73d3c78 100644
>> --- a/src/glsl/ast_to_hir.cpp
>> +++ b/src/glsl/ast_to_hir.cpp
>> @@ -2044,9 +2044,10 @@ validate_binding_qualifier(struct _mesa_glsl_parse_state *state,
>> ir_variable *var,
>> const ast_type_qualifier *qual)
>> {
>> - if (var->data.mode != ir_var_uniform) {
>> + if (var->data.mode != ir_var_uniform && var->data.mode != ir_var_shader_storage) {
>> _mesa_glsl_error(loc, state,
>> - "the \"binding\" qualifier only applies to uniforms");
>> + "the \"binding\" qualifier only applies to uniforms and"
>> + "shader storage buffer objects.");
>
> Missing space between 'and' and 'shader'. I think we usually don't
> include a period (.) at the end of these messages.
>
> 10 & 11 Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
>
OK, I will fix it.
Thanks!
Sam
>> return false;
>> }
>>
>> @@ -2070,13 +2071,31 @@ validate_binding_qualifier(struct _mesa_glsl_parse_state *state,
>> *
>> * The implementation-dependent maximum is GL_MAX_UNIFORM_BUFFER_BINDINGS.
>> */
>> - if (max_index >= ctx->Const.MaxUniformBufferBindings) {
>> + if (var->data.mode == ir_var_uniform &&
>> + max_index >= ctx->Const.MaxUniformBufferBindings) {
>> _mesa_glsl_error(loc, state, "layout(binding = %d) for %d UBOs exceeds "
>> "the maximum number of UBO binding points (%d)",
>> qual->binding, elements,
>> ctx->Const.MaxUniformBufferBindings);
>> return false;
>> }
>> + /* SSBOs. From page 67 of the GLSL 4.30 specification:
>> + * "If the binding point for any uniform or shader storage block instance
>> + * is less than zero, or greater than or equal to the
>> + * implementation-dependent maximum number of uniform buffer bindings, a
>> + * compile-time error will occur. When the binding identifier is used
>> + * with a uniform or shader storage block instanced as an array of size
>> + * N, all elements of the array from binding through binding + N – 1 must
>> + * be within this range."
>> + */
>> + if (var->data.mode == ir_var_shader_storage &&
>> + max_index >= ctx->Const.MaxShaderStorageBufferBindings) {
>> + _mesa_glsl_error(loc, state, "layout(binding = %d) for %d SSBOs exceeds "
>> + "the maximum number of SSBO binding points (%d)",
>> + qual->binding, elements,
>> + ctx->Const.MaxShaderStorageBufferBindings);
>> + return false;
>> + }
>> } else if (var->type->is_sampler() ||
>> (var->type->is_array() && var->type->fields.array->is_sampler())) {
>> /* Samplers. From page 63 of the GLSL 4.20 specification:
>> @@ -5852,8 +5871,8 @@ ast_interface_block::hir(exec_list *instructions,
>> if (state->symbols->get_variable(var->name) != NULL)
>> _mesa_glsl_error(&loc, state, "`%s' redeclared", var->name);
>>
>> - /* Propagate the "binding" keyword into this UBO's fields;
>> - * the UBO declaration itself doesn't get an ir_variable unless it
>> + /* Propagate the "binding" keyword into this UBO/SSBO's fields.
>> + * The UBO declaration itself doesn't get an ir_variable unless it
>> * has an instance name. This is ugly.
>> */
>> var->data.explicit_binding = this->layout.flags.q.explicit_binding;
>> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
>> index 8564cb9..37c4401 100644
>> --- a/src/glsl/glsl_parser.yy
>> +++ b/src/glsl/glsl_parser.yy
>> @@ -1425,7 +1425,8 @@ layout_qualifier_id:
>> }
>>
>> if ((state->ARB_shading_language_420pack_enable ||
>> - state->has_atomic_counters()) &&
>> + state->has_atomic_counters() ||
>> + state->ARB_shader_storage_buffer_object_enable) &&
>> match_layout_qualifier("binding", $1, state) == 0) {
>> $$.flags.q.explicit_binding = 1;
>> $$.binding = $3;
>> --
>> 1.9.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list