[Mesa-dev] [PATCH 01/21] glsl: Store a predicate for whether a built-in signature is available.

Paul Berry stereotype441 at gmail.com
Sun Sep 8 08:15:55 PDT 2013


On 4 September 2013 15:22, Kenneth Graunke <kenneth at whitecape.org> wrote:

> For the upcoming built-in function rewrite, we'll need to be able to
> answer "Is this built-in function signature available?".
>
> This is actually a somewhat complex question, since it depends on the
> language version, GLSL vs. GLSL ES, enabled extensions, and the current
> shader stage.
>
> Storing such a set of constraints in a structure would be painful, so
> instead we store a function pointer.  When creating a signature, we
> simply point to a predicate that inspects _mesa_glsl_parse_state and
> answers whether the signature is available in the current shader.
>
> Unfortunately, IR reader doesn't actually know when built-in functions
> are available, so this patch makes it lie and say that they're always
> present.  This allows us to hook up the new functionality; it just won't
> be useful until real data is populated.  In the meantime, the existing
> profile mechanism ensures built-ins are available in the right places.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/ir.cpp        |  8 +++++---
>  src/glsl/ir.h          | 14 +++++++++++++-
>  src/glsl/ir_clone.cpp  |  1 +
>  src/glsl/ir_reader.cpp | 13 +++++++++++--
>  4 files changed, 30 insertions(+), 6 deletions(-)
>
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index c6d96d8..ea018eb 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -1579,11 +1579,13 @@ ir_variable::determine_interpolation_mode(bool
> flat_shade)
>  }
>
>
> -ir_function_signature::ir_function_signature(const glsl_type *return_type)
> -   : return_type(return_type), is_defined(false), _function(NULL)
> +ir_function_signature::ir_function_signature(const glsl_type *return_type,
> +                                             builtin_available_predicate
> b)
> +   : return_type(return_type), is_defined(false), builtin_info(b),
> +     _function(NULL)
>  {
>     this->ir_type = ir_type_function_signature;
> -   this->is_builtin = false;
> +   this->is_builtin = builtin_info != NULL;
>     this->origin = NULL;
>  }
>
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index b45e6cb..d785259 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -591,6 +591,11 @@ public:
>     const glsl_type *interface_type;
>  };
>
> +/**
> + * A function that returns whether a built-in function is available in the
> + * current shading language (based on version, ES or desktop, and
> extensions).
> + */
> +typedef bool (*builtin_available_predicate)(const _mesa_glsl_parse_state
> *);
>
>  /*@{*/
>  /**
> @@ -602,7 +607,8 @@ class ir_function_signature : public ir_instruction {
>      * an ir_function.
>      */
>  public:
> -   ir_function_signature(const glsl_type *return_type);
> +   ir_function_signature(const glsl_type *return_type,
> +                         builtin_available_predicate builtin_info = NULL);
>
>     virtual ir_function_signature *clone(void *mem_ctx,
>                                         struct hash_table *ht) const;
> @@ -684,6 +690,12 @@ public:
>     struct exec_list body;
>
>  private:
> +   /**
> +    * A function pointer to a predicate that answers whether a built-in
> +    * function is available in the current shader.  NULL if not a
> built-in.
> +    */
> +   builtin_available_predicate builtin_info;
> +
>

I'd prefer to see this called something like "builtin_avail" instead of
"builtin_info" since that describes precisely what info it's storing about
the function.  Calling it "builtin_info" makes it sound like it stores a
variety of information about built-in functions.

It's a nit-pick, though, so either way, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


>     /** Function of which this signature is one overload. */
>     class ir_function *_function;
>
> diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
> index 9d4178d..967ad70 100644
> --- a/src/glsl/ir_clone.cpp
> +++ b/src/glsl/ir_clone.cpp
> @@ -328,6 +328,7 @@ ir_function_signature::clone_prototype(void *mem_ctx,
> struct hash_table *ht) con
>
>     copy->is_defined = false;
>     copy->is_builtin = this->is_builtin;
> +   copy->builtin_info = this->builtin_info;
>     copy->origin = this;
>
>     /* Clone the parameter list, but NOT the body.
> diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp
> index f263fe8..8261d9f 100644
> --- a/src/glsl/ir_reader.cpp
> +++ b/src/glsl/ir_reader.cpp
> @@ -211,6 +211,12 @@ ir_reader::read_function(s_expression *expr, bool
> skip_body)
>     return added ? f : NULL;
>  }
>
> +static bool
> +always_available(const _mesa_glsl_parse_state *)
> +{
> +   return true;
> +}
> +
>  void
>  ir_reader::read_function_sig(ir_function *f, s_expression *expr, bool
> skip_body)
>  {
> @@ -251,8 +257,11 @@ ir_reader::read_function_sig(ir_function *f,
> s_expression *expr, bool skip_body)
>     ir_function_signature *sig =
> f->exact_matching_signature(&hir_parameters);
>     if (sig == NULL && skip_body) {
>        /* If scanning for prototypes, generate a new signature. */
> -      sig = new(mem_ctx) ir_function_signature(return_type);
> -      sig->is_builtin = true;
> +      /* ir_reader doesn't know what languages support a given built-in,
> so
> +       * just say that they're always available.  For now, other
> mechanisms
> +       * guarantee the right built-ins are available.
> +       */
> +      sig = new(mem_ctx) ir_function_signature(return_type,
> always_available);
>        f->add_signature(sig);
>     } else if (sig != NULL) {
>        const char *badvar = sig->qualifiers_match(&hir_parameters);
> --
> 1.8.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130908/01c6ea67/attachment-0001.html>


More information about the mesa-dev mailing list