From: Ian Romanick Date: Wed, 31 Mar 2010 23:30:56 +0000 (-0700) Subject: Add glsl_type::generate_constructor_prototype X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4ef183e51de2b625b51cdd6c925760429801595e;p=mesa.git Add glsl_type::generate_constructor_prototype Generates a symbol table entry and the IR approximation of a prototype for a type's constructor. Currently only arrays are supported. --- diff --git a/glsl_types.cpp b/glsl_types.cpp index 7b8b3e90142..a38750e9bb1 100644 --- a/glsl_types.cpp +++ b/glsl_types.cpp @@ -115,6 +115,37 @@ const glsl_type *glsl_type::get_base_type() const } +ir_function * +glsl_type::generate_constructor_prototype(glsl_symbol_table *symtab) const +{ + /* FINISHME: Add support for non-array types. */ + assert(base_type == GLSL_TYPE_ARRAY); + + /* Generate the function name and add it to the symbol table. + */ + ir_function *const f = new ir_function(name); + + bool added = symtab->add_function(name, f); + assert(added); + + ir_function_signature *const sig = new ir_function_signature(this); + f->signatures.push_tail(sig); + + for (unsigned i = 0; i < length; i++) { + char *const param_name = (char *) malloc(10); + + snprintf(param_name, 10, "p%08X", i); + + ir_variable *var = new ir_variable(fields.array, param_name); + + var->mode = ir_var_in; + sig->parameters.push_tail(var); + } + + return f; +} + + /** * Generate the function intro for a constructor * diff --git a/glsl_types.h b/glsl_types.h index 32035f5a443..6c9444cbe16 100644 --- a/glsl_types.h +++ b/glsl_types.h @@ -175,6 +175,9 @@ struct glsl_type { static const glsl_type *get_array_instance(const glsl_type *base, unsigned elements); + class ir_function *generate_constructor_prototype(class glsl_symbol_table *) + const; + /** * Query the total number of scalars that make up a scalar, vector or matrix */