Reviewed-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com>
On 05/11/15 12:33, Tapani Pälli wrote: > From: Iago Toral Quiroga <ito...@igalia.com> > > Notice that the spec requires that a default precision has been set for every > type used by a shader that can use a precision qualifier and does not have a > predefined precision, however, at the moment, Mesa only checks this for floats > in the fragment shader. This is probably because the GLSL ES 1.0 specs > mentions > this case specifically, but GLSL ES 3.0 clarifies that the same applies to > other types: > > "The fragment language has no default precision qualifier for floating point > types. Hence for float, floating point vector and matrix variable > declarations, either the declaration must include a precision qualifier or > the default float precision must have been previously declared. Similarly, > there is no default precision qualifier for the following sampler types in > either the vertex or fragment language: > > sampler3D; > samplerCubeShadow; > sampler2DShadow; > sampler2DArray; > sampler2DArrayShadow; > isampler2D; > isampler3D; > isamplerCube; > isampler2DArray; > usampler2D; > usampler3D; > usamplerCube; > usampler2DArray;" > > we will fix this in a later patch. > --- > src/glsl/ast_to_hir.cpp | 29 ++++++++++------------------- > 1 file changed, 10 insertions(+), 19 deletions(-) > > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp > index 0306530..d20be0b 100644 > --- a/src/glsl/ast_to_hir.cpp > +++ b/src/glsl/ast_to_hir.cpp > @@ -2184,11 +2184,15 @@ ast_fully_specified_type::glsl_type(const char **name, > if (type == NULL) > return NULL; > > + /* The fragment language does not define a default precision value > + * for float types, so check that one is defined if the type declaration > + * isn't providing one explictly. > + */ > if (type->base_type == GLSL_TYPE_FLOAT > && state->es_shader > && state->stage == MESA_SHADER_FRAGMENT > && this->qualifier.precision == ast_precision_none > - && state->symbols->get_variable("#default precision") == NULL) { > + && state->symbols->get_default_precision_qualifier("float") == > ast_precision_none) { > YYLTYPE loc = this->get_location(); > _mesa_glsl_error(&loc, state, > "no precision specified this scope for type `%s'", > @@ -5749,20 +5753,10 @@ ast_type_specifier::hir(exec_list *instructions, > return NULL; > } > > - if (type->base_type == GLSL_TYPE_FLOAT > - && state->es_shader > - && state->stage == MESA_SHADER_FRAGMENT) { > + if (state->es_shader) { > /* Section 4.5.3 (Default Precision Qualifiers) of the GLSL ES 1.00 > * spec says: > * > - * "The fragment language has no default precision qualifier for > - * floating point types." > - * > - * As a result, we have to track whether or not default precision > has > - * been specified for float in GLSL ES fragment shaders. > - * > - * Earlier in that same section, the spec says: > - * > * "Non-precision qualified declarations will use the precision > * qualifier specified in the most recent precision statement > * that is still in scope. The precision statement has the same > @@ -5775,16 +5769,13 @@ ast_type_specifier::hir(exec_list *instructions, > * overriding earlier statements within that scope." > * > * Default precision specifications follow the same scope rules as > - * variables. So, we can track the state of the default float > - * precision in the symbol table, and the rules will just work. > This > + * variables. So, we can track the state of the default precision > + * qualifiers in the symbol table, and the rules will just work. > This > * is a slight abuse of the symbol table, but it has the semantics > * that we want. > */ > - ir_variable *const junk = > - new(state) ir_variable(type, "#default precision", > - ir_var_auto); > - > - state->symbols->add_variable(junk); > + state->symbols->add_default_precision_qualifier(this->type_name, > + > this->default_precision); > } > > /* FINISHME: Translate precision statements into IR. */ > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev