Add glsl_type::generate_constructor_prototype
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 31 Mar 2010 23:30:56 +0000 (16:30 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 31 Mar 2010 23:30:56 +0000 (16:30 -0700)
Generates a symbol table entry and the IR approximation of a prototype for a
type's constructor.  Currently only arrays are supported.

glsl_types.cpp
glsl_types.h

index 7b8b3e9014245142186bed5c513e0edd6063fab3..a38750e9bb1dd992876bb949af813e5c4df9887f 100644 (file)
@@ -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
  *
index 32035f5a4432c2930cc2b83e59341c1fec73375c..6c9444cbe169c45b05ddfbad23708a441fd5fda2 100644 (file)
@@ -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
     */