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 <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@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 <airl...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev