[Mesa-dev] [PATCH 09/19] glsl/ir: add subroutine information storage to ir_function (v1.1)

Chris Forbes chrisf at ijw.co.nz
Thu Jul 9 14:15:19 PDT 2015


Do you really need is_subroutine_def ? It seems redundant with
num_subroutine_types>0.

On Thu, Jul 9, 2015 at 7:17 PM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> We need to store two sets of info into the ir_function,
> if this is a function definition with a subroutine list
> (subroutine_def) or if it a subroutine prototype.
>
> v1.1: add some more documentation.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/glsl/ir.cpp               |  4 ++++
>  src/glsl/ir.h                 | 16 ++++++++++++++++
>  src/glsl/ir_clone.cpp         |  7 +++++++
>  src/glsl/ir_print_visitor.cpp |  2 +-
>  4 files changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index 38a5e2a..2fbc631 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -1853,6 +1853,7 @@ static void
>  steal_memory(ir_instruction *ir, void *new_ctx)
>  {
>     ir_variable *var = ir->as_variable();
> +   ir_function *fn = ir->as_function();
>     ir_constant *constant = ir->as_constant();
>     if (var != NULL && var->constant_value != NULL)
>        steal_memory(var->constant_value, ir);
> @@ -1860,6 +1861,9 @@ steal_memory(ir_instruction *ir, void *new_ctx)
>     if (var != NULL && var->constant_initializer != NULL)
>        steal_memory(var->constant_initializer, ir);
>
> +   if (fn != NULL && fn->subroutine_types)
> +      ralloc_steal(new_ctx, fn->subroutine_types);
> +
>     /* The components of aggregate constants are not visited by the normal
>      * visitor, so steal their values by hand.
>      */
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index 092c96b..b5a9e99 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -1121,6 +1121,22 @@ public:
>      * List of ir_function_signature for each overloaded function with this name.
>      */
>     struct exec_list signatures;
> +
> +   /**
> +    * is this function a subroutine type declaration
> +    * e.g. subroutine void type1(float arg1);
> +    */
> +   bool is_subroutine;
> +
> +   /**
> +    * is this function associated to a subroutine type
> +    * e.g. subroutine (type1, type2) function_name { function_body };
> +    * would have this flag set and num_subroutine_types 2,
> +    * and pointers to the type1 and type2 types.
> +    */
> +   bool is_subroutine_def;
> +   int num_subroutine_types;
> +   const struct glsl_type **subroutine_types;
>  };
>
>  inline const char *ir_function_signature::function_name() const
> diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
> index 49834ff..bf25d6c 100644
> --- a/src/glsl/ir_clone.cpp
> +++ b/src/glsl/ir_clone.cpp
> @@ -267,6 +267,13 @@ ir_function::clone(void *mem_ctx, struct hash_table *ht) const
>  {
>     ir_function *copy = new(mem_ctx) ir_function(this->name);
>
> +   copy->is_subroutine = this->is_subroutine;
> +   copy->is_subroutine_def = this->is_subroutine_def;
> +   copy->num_subroutine_types = this->num_subroutine_types;
> +   copy->subroutine_types = ralloc_array(mem_ctx, const struct glsl_type *, copy->num_subroutine_types);
> +   for (int i = 0; i < copy->num_subroutine_types; i++)
> +     copy->subroutine_types[i] = this->subroutine_types[i];
> +
>     foreach_in_list(const ir_function_signature, sig, &this->signatures) {
>        ir_function_signature *sig_copy = sig->clone(mem_ctx, ht);
>        copy->add_signature(sig_copy);
> diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp
> index 4cbcad4..f210175 100644
> --- a/src/glsl/ir_print_visitor.cpp
> +++ b/src/glsl/ir_print_visitor.cpp
> @@ -229,7 +229,7 @@ void ir_print_visitor::visit(ir_function_signature *ir)
>
>  void ir_print_visitor::visit(ir_function *ir)
>  {
> -   fprintf(f, "(function %s\n", ir->name);
> +   fprintf(f, "(%s function %s\n", ir->is_subroutine ? "subroutine" : "", ir->name);
>     indentation++;
>     foreach_in_list(ir_function_signature, sig, &ir->signatures) {
>        indent();
> --
> 2.4.3
>
> _______________________________________________
> 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