glsl: pass symbols to find_matching_signature() rather than shader
authorTimothy Arceri <timothy.arceri@collabora.com>
Mon, 27 Jun 2016 06:50:00 +0000 (16:50 +1000)
committerTimothy Arceri <timothy.arceri@collabora.com>
Thu, 30 Jun 2016 06:51:25 +0000 (16:51 +1000)
This will allow us to later split gl_shader into two structs.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/compiler/glsl/link_functions.cpp

index 4e10287..de194c3 100644 (file)
@@ -31,8 +31,7 @@
 
 static ir_function_signature *
 find_matching_signature(const char *name, const exec_list *actual_parameters,
-                       gl_shader **shader_list, unsigned num_shaders,
-                       bool use_builtin);
+                        glsl_symbol_table *symbols, bool use_builtin);
 
 namespace {
 
@@ -78,8 +77,8 @@ public:
        * final linked shader.  If it does, use it as the target of the call.
        */
       ir_function_signature *sig =
-        find_matching_signature(name, &callee->parameters, &linked, 1,
-                                ir->use_builtin);
+         find_matching_signature(name, &callee->parameters, linked->symbols,
+                                 ir->use_builtin);
       if (sig != NULL) {
         ir->callee = sig;
         return visit_continue;
@@ -88,8 +87,14 @@ public:
       /* Try to find the signature in one of the other shaders that is being
        * linked.  If it's not found there, return an error.
        */
-      sig = find_matching_signature(name, &ir->actual_parameters, shader_list,
-                                   num_shaders, ir->use_builtin);
+      for (unsigned i = 0; i < num_shaders; i++) {
+         sig = find_matching_signature(name, &ir->actual_parameters,
+                                       shader_list[i]->symbols,
+                                       ir->use_builtin);
+         if (sig)
+            break;
+      }
+
       if (sig == NULL) {
         /* FINISHME: Log the full signature of unresolved function.
          */
@@ -307,30 +312,22 @@ private:
  */
 ir_function_signature *
 find_matching_signature(const char *name, const exec_list *actual_parameters,
-                       gl_shader **shader_list, unsigned num_shaders,
-                       bool use_builtin)
+                        glsl_symbol_table *symbols, bool use_builtin)
 {
-   for (unsigned i = 0; i < num_shaders; i++) {
-      ir_function *const f = shader_list[i]->symbols->get_function(name);
-
-      if (f == NULL)
-        continue;
+   ir_function *const f = symbols->get_function(name);
 
+   if (f) {
       ir_function_signature *sig =
          f->matching_signature(NULL, actual_parameters, use_builtin);
 
-      if ((sig == NULL) ||
-          (!sig->is_defined && !sig->is_intrinsic))
-        continue;
-
-      /* If this function expects to bind to a built-in function and the
-       * signature that we found isn't a built-in, keep looking.  Also keep
-       * looking if we expect a non-built-in but found a built-in.
-       */
-      if (use_builtin != sig->is_builtin())
-           continue;
-
-      return sig;
+      if (sig && (sig->is_defined || sig->is_intrinsic)) {
+         /* If this function expects to bind to a built-in function and the
+          * signature that we found isn't a built-in, keep looking.  Also keep
+          * looking if we expect a non-built-in but found a built-in.
+          */
+         if (use_builtin == sig->is_builtin())
+            return sig;
+      }
    }
 
    return NULL;