Hi Frank; Kalyan sent me a similar fix mentioning that it is related to this test case: https://www.khronos.org/registry/webgl/sdk/tests/conformance/limits/gl-min-textures.html
If your patch is related, please mention in the commit message. It helps to track possible regression in the future. With changes proposed by Anuj: Reviewed-by: Tapani Pälli <tapani.pa...@intel.com> On 08/23/2014 12:23 AM, Frank Henigman wrote: > If a precision qualifer is allowed on type T, it should be allowed > on an array of T. Refactor the check to ensure this is the case. > --- > I wanted to expand the comment to say why is_record() is in there, > but I don't understand why it is. I thought structs couldn't have > precision qualifiers. > > src/glsl/ast_to_hir.cpp | 75 > +++++++++++++++++++++++++++---------------------- > 1 file changed, 41 insertions(+), 34 deletions(-) > > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp > index 30b02d0..998404a 100644 > --- a/src/glsl/ast_to_hir.cpp > +++ b/src/glsl/ast_to_hir.cpp > @@ -3202,6 +3202,41 @@ validate_identifier(const char *identifier, YYLTYPE > loc, > } > } > > +static bool > +precision_qualifier_allowed(const glsl_type *type) > +{ > + /* Precision qualifiers apply to floating point, integer and sampler > + * types. > + * > + * Section 4.5.2 (Precision Qualifiers) of the GLSL 1.30 spec says: > + * "Any floating point or any integer declaration can have the type > + * preceded by one of these precision qualifiers [...] Literal > + * constants do not have precision qualifiers. Neither do Boolean > + * variables. > + * > + * Section 4.5 (Precision and Precision Qualifiers) of the GLSL 1.30 > + * spec also says: > + * > + * "Precision qualifiers are added for code portability with OpenGL > + * ES, not for functionality. They have the same syntax as in OpenGL > + * ES." > + * > + * Section 8 (Built-In Functions) of the GLSL ES 1.00 spec says: > + * > + * "uniform lowp sampler2D sampler; > + * highp vec2 coord; > + * ... > + * lowp vec4 col = texture2D (sampler, coord); > + * // texture2D returns lowp" > + * > + * From this, we infer that GLSL 1.30 (and later) should allow precision > + * qualifiers on sampler types just like float and integer types. > + */ > + return type->is_float() > + || type->is_integer() > + || type->is_record() > + || type->is_sampler(); > +} > > ir_rvalue * > ast_declarator_list::hir(exec_list *instructions, > @@ -3689,41 +3724,13 @@ ast_declarator_list::hir(exec_list *instructions, > } > > > - /* Precision qualifiers apply to floating point, integer and sampler > - * types. > - * > - * Section 4.5.2 (Precision Qualifiers) of the GLSL 1.30 spec says: > - * "Any floating point or any integer declaration can have the type > - * preceded by one of these precision qualifiers [...] Literal > - * constants do not have precision qualifiers. Neither do Boolean > - * variables. > - * > - * Section 4.5 (Precision and Precision Qualifiers) of the GLSL 1.30 > - * spec also says: > - * > - * "Precision qualifiers are added for code portability with OpenGL > - * ES, not for functionality. They have the same syntax as in > OpenGL > - * ES." > - * > - * Section 8 (Built-In Functions) of the GLSL ES 1.00 spec says: > - * > - * "uniform lowp sampler2D sampler; > - * highp vec2 coord; > - * ... > - * lowp vec4 col = texture2D (sampler, coord); > - * // texture2D returns > lowp" > - * > - * From this, we infer that GLSL 1.30 (and later) should allow > precision > - * qualifiers on sampler types just like float and integer types. > + /* If a precision qualifier is allowed on a type, it is allowed on > + * an array of that type. > */ > - if (this->type->qualifier.precision != ast_precision_none > - && !var->type->is_float() > - && !var->type->is_integer() > - && !var->type->is_record() > - && !var->type->is_sampler() > - && !(var->type->is_array() > - && (var->type->fields.array->is_float() > - || var->type->fields.array->is_integer()))) { > + if (!(this->type->qualifier.precision == ast_precision_none > + || precision_qualifier_allowed(var->type) > + || (var->type->is_array() > + && precision_qualifier_allowed(var->type->fields.array)))) { > > _mesa_glsl_error(&loc, state, > "precision qualifiers apply only to floating point" // Tapani _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev