[Mesa-dev] [PATCH 08/10] glsl: A shader cannot redefine or overload built-in functions in GLSL ES 3.00

Samuel Iglesias Gonsálvez siglesias at igalia.com
Thu Dec 4 03:27:57 PST 2014


On Wednesday, December 03, 2014 10:09:59 AM Chris Forbes wrote:
> It would be nice if this could be added to the existing logic for the
> interaction between builtins and app-provided overloads -- or do we
> need to fail earlier than that?
> 

This is the place where we store the information about a new function in its 
signature, checking that it doesn't redefine another shader-provided function
and other related checks. It maybe makes more sense to move this change up in 
the function.

So we detect here, before storing such information, if a shader is redefining 
or overloading a built-in function in GLSL ES 3.0.

Or am I missing something? Which place do you think is better to put this?

Sam

> - Chris
> 
> On Tue, Dec 2, 2014 at 2:04 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> > From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> > 
> > Create a new search function to look for matching built-in functions by
> > name and use it for built-in function redefinition or overload in GLSL ES
> > 3.00.
> > 
> > GLSL ES 3.0 spec, chapter 6.1 "Function Definitions", page 71
> > 
> > "A shader cannot redefine or overload built-in functions."
> > 
> > In case of GLSL ES 1.0 spec, chapter 6.1 "Function Definitions", page 54
> > 
> > "Function names can be overloaded. This allows the same function name to
> > be
> > used for multiple functions, as long as the argument list types differ. If
> > functions’ names and argument types match, then their return type and
> > parameter qualifiers must also match. Function signature matching is based
> > on parameter type only, no qualifiers are used. Overloading is used
> > heavily in the built-in functions. When overloaded functions (or indeed
> > any functions) are resolved, an exact match for the function's signature
> > is sought. This includes exact match of array size as well. No promotion
> > or demotion of the return type or input argument types is done. All
> > expected combination of inputs and outputs must be defined as separate
> > functions."
> > 
> > So this check is specific to GLSL ES 3.00.
> > 
> > This patch fixes the following dEQP tests:
> > 
> > dEQP-GLES3.functional.shaders.functions.invalid.overload_builtin_function_
> > vertex
> > dEQP-GLES3.functional.shaders.functions.invalid.overload_builtin_function
> > _fragment
> > dEQP-GLES3.functional.shaders.functions.invalid.redefine_builtin_function
> > _vertex
> > dEQP-GLES3.functional.shaders.functions.invalid.redefine_builtin_function
> > _fragment
> > 
> > No piglit regressions.
> > 
> > Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> > ---
> > 
> >  src/glsl/ast_to_hir.cpp        | 22 ++++++++++++++++++++++
> >  src/glsl/builtin_functions.cpp | 11 +++++++++++
> >  src/glsl/ir.h                  |  4 ++++
> >  3 files changed, 37 insertions(+)
> > 
> > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> > index fe1e129..b7074bc 100644
> > --- a/src/glsl/ast_to_hir.cpp
> > +++ b/src/glsl/ast_to_hir.cpp
> > @@ -4167,6 +4167,28 @@ ast_function::hir(exec_list *instructions,
> > 
> >                 return NULL;
> >              
> >              }
> >           
> >           }
> > 
> > +      } else {
> > +         /* From GLSL ES 3.0 spec, chapter 6.1 "Function Definitions",
> > page 71: +          *
> > +          * "A shader cannot redefine or overload built-in functions."
> > +          *
> > +          * While in GLSL ES 1.0 spec, chapter 6.1 "Function
> > Definitions", page +          * 54, this is allowed:
> > +          *
> > +          * "Function names can be overloaded. [...] Overloading is used
> > heavily +          * in the built-in functions."
> > +          *
> > +          */
> > +         if (state->es_shader && state->language_version >= 300) {
> > +            /* Local shader has no exact candidates; check the built-ins.
> > */ +            _mesa_glsl_initialize_builtin_functions();
> > +            if (_mesa_glsl_find_builtin_function_by_name(state, name)) {
> > +               YYLTYPE loc = this->get_location();
> > +               _mesa_glsl_error(& loc, state,
> > +                                "A shader cannot redefine or overload
> > built-in " +                                "function `%s' in GLSL ES
> > 3.00", name); +            }
> > +         }
> > 
> >        }
> >     
> >     }
> > 
> > diff --git a/src/glsl/builtin_functions.cpp
> > b/src/glsl/builtin_functions.cpp index bb7fbcd..f5052d3 100644
> > --- a/src/glsl/builtin_functions.cpp
> > +++ b/src/glsl/builtin_functions.cpp
> > @@ -4618,6 +4618,17 @@
> > _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,> 
> >     return s;
> >  
> >  }
> > 
> > +ir_function *
> > +_mesa_glsl_find_builtin_function_by_name(_mesa_glsl_parse_state *state,
> > +                                         const char *name)
> > +{
> > +   ir_function * f;
> > +   mtx_lock(&builtins_lock);
> > +   f = builtins.shader->symbols->get_function(name);
> > +   mtx_unlock(&builtins_lock);
> > +   return f;
> > +}
> > +
> > 
> >  gl_shader *
> >  _mesa_glsl_get_builtin_function_shader()
> >  {
> > 
> > diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> > index a0f48b2..f2d8269 100644
> > --- a/src/glsl/ir.h
> > +++ b/src/glsl/ir.h
> > @@ -2417,6 +2417,10 @@ extern ir_function_signature *
> > 
> >  _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
> >  
> >                                   const char *name, exec_list
> >                                   *actual_parameters);
> > 
> > +extern ir_function *
> > +_mesa_glsl_find_builtin_function_by_name(_mesa_glsl_parse_state *state,
> > +                                         const char *name);
> > +
> > 
> >  extern gl_shader *
> >  _mesa_glsl_get_builtin_function_shader(void);
> > 
> > --
> > 2.1.3
> > 
> > _______________________________________________
> > 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141204/95b11934/attachment.sig>


More information about the mesa-dev mailing list