[Mesa-dev] [PATCH] glsl: allow precision qualifier on sampler arrays
Tapani Pälli
tapani.palli at intel.com
Mon Sep 8 23:14:23 PDT 2014
On 09/09/2014 09:10 AM, Tapani Pälli wrote:
> 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.palli at intel.com>
Oh sorry for the noise, I see it went in already, which is good :)
>
> 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list