glsl: push vertex count determination down one level
[mesa.git] / src / glsl / link_functions.cpp
index 56f3f207ee8b2254a46865ec9e4b9d9cffd6e148..537f4dc77ac7532c50bf48b0ebd34cfb2ec02a3b 100644 (file)
@@ -145,8 +145,7 @@ public:
       struct hash_table *ht = hash_table_ctor(0, hash_table_pointer_hash,
                                              hash_table_pointer_compare);
       exec_list formal_parameters;
-      foreach_list_const(node, &sig->parameters) {
-        const ir_instruction *const original = (ir_instruction *) node;
+      foreach_in_list(const ir_instruction, original, &sig->parameters) {
         assert(const_cast<ir_instruction *>(original)->as_variable());
 
         ir_instruction *copy = original->clone(linked, ht);
@@ -155,10 +154,10 @@ public:
 
       linked_sig->replace_parameters(&formal_parameters);
 
-      if (sig->is_defined) {
-         foreach_list_const(node, &sig->body) {
-            const ir_instruction *const original = (ir_instruction *) node;
+      linked_sig->is_intrinsic = sig->is_intrinsic;
 
+      if (sig->is_defined) {
+         foreach_in_list(const ir_instruction, original, &sig->body) {
             ir_instruction *copy = original->clone(linked, ht);
             linked_sig->body.push_tail(copy);
          }
@@ -246,11 +245,19 @@ public:
                /* Similarly, we need implicit sizes of arrays within interface
                 * blocks to be sized by the maximal access in *any* shader.
                 */
+               unsigned *const linked_max_ifc_array_access =
+                  var->get_max_ifc_array_access();
+               unsigned *const ir_max_ifc_array_access =
+                  ir->var->get_max_ifc_array_access();
+
+               assert(linked_max_ifc_array_access != NULL);
+               assert(ir_max_ifc_array_access != NULL);
+
                for (unsigned i = 0; i < var->get_interface_type()->length;
                     i++) {
-                  var->max_ifc_array_access[i] =
-                     MAX2(var->max_ifc_array_access[i],
-                          ir->var->max_ifc_array_access[i]);
+                  linked_max_ifc_array_access[i] =
+                     MAX2(linked_max_ifc_array_access[i],
+                          ir_max_ifc_array_access[i]);
                }
             }
         }
@@ -310,7 +317,7 @@ find_matching_signature(const char *name, const exec_list *actual_parameters,
         continue;
 
       ir_function_signature *sig =
-         f->matching_signature(NULL, actual_parameters);
+         f->matching_signature(NULL, actual_parameters, use_builtin);
 
       if ((sig == NULL) ||
           (!sig->is_defined && !sig->is_intrinsic))