[Mesa-dev] [PATCH 4/4] glsl: Delete linker stuff relating to built-in functions.

Kenneth Graunke kenneth at whitecape.org
Wed Sep 21 19:20:53 UTC 2016


Now that we generate built-in functions inline, there's no need to link
against the built-in shader, and no built-in prototypes to consider.

This lets us delete a bunch of code.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/compiler/glsl/link_functions.cpp | 32 +++++++++++----------------
 src/compiler/glsl/linker.cpp         | 42 +++---------------------------------
 2 files changed, 16 insertions(+), 58 deletions(-)

diff --git a/src/compiler/glsl/link_functions.cpp b/src/compiler/glsl/link_functions.cpp
index b4aae5e..e4f77be 100644
--- a/src/compiler/glsl/link_functions.cpp
+++ b/src/compiler/glsl/link_functions.cpp
@@ -32,7 +32,7 @@
 
 static ir_function_signature *
 find_matching_signature(const char *name, const exec_list *actual_parameters,
-                        glsl_symbol_table *symbols, bool use_builtin);
+                        glsl_symbol_table *symbols);
 
 namespace {
 
@@ -74,12 +74,15 @@ public:
       assert(callee != NULL);
       const char *const name = callee->function_name();
 
+      /* We don't actually need to find intrinsics; they're not real */
+      if (callee->is_intrinsic)
+         return visit_continue;
+
       /* Determine if the requested function signature already exists in the
        * 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->symbols,
-                                 ir->use_builtin);
+         find_matching_signature(name, &callee->parameters, linked->symbols);
       if (sig != NULL) {
 	 ir->callee = sig;
 	 return visit_continue;
@@ -90,8 +93,7 @@ public:
        */
       for (unsigned i = 0; i < num_shaders; i++) {
          sig = find_matching_signature(name, &ir->actual_parameters,
-                                       shader_list[i]->symbols,
-                                       ir->use_builtin);
+                                       shader_list[i]->symbols);
          if (sig)
             break;
       }
@@ -122,9 +124,7 @@ public:
 
       ir_function_signature *linked_sig =
 	 f->exact_matching_signature(NULL, &callee->parameters);
-      if ((linked_sig == NULL)
-	  || ((linked_sig != NULL)
-	      && (linked_sig->is_builtin() != ir->use_builtin))) {
+      if (linked_sig == NULL) {
 	 linked_sig = new(linked) ir_function_signature(callee->return_type);
 	 f->add_signature(linked_sig);
       }
@@ -314,22 +314,16 @@ private:
  */
 ir_function_signature *
 find_matching_signature(const char *name, const exec_list *actual_parameters,
-                        glsl_symbol_table *symbols, bool use_builtin)
+                        glsl_symbol_table *symbols)
 {
    ir_function *const f = symbols->get_function(name);
 
    if (f) {
       ir_function_signature *sig =
-         f->matching_signature(NULL, actual_parameters, use_builtin);
-
-      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;
-      }
+         f->matching_signature(NULL, actual_parameters, false);
+
+      if (sig && (sig->is_defined || sig->is_intrinsic))
+         return sig;
    }
 
    return NULL;
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 606d006..929a653 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -2098,14 +2098,13 @@ link_intrastage_shaders(void *mem_ctx,
 	       continue;
 
 	    foreach_in_list(ir_function_signature, sig, &f->signatures) {
-	       if (!sig->is_defined || sig->is_builtin())
+	       if (!sig->is_defined)
 		  continue;
 
 	       ir_function_signature *other_sig =
 		  other->exact_matching_signature(NULL, &sig->parameters);
 
-	       if ((other_sig != NULL) && other_sig->is_defined
-		   && !other_sig->is_builtin()) {
+	       if (other_sig != NULL && other_sig->is_defined) {
 		  linker_error(prog, "function `%s' is multiply defined\n",
 			       f->name);
 		  return NULL;
@@ -2171,42 +2170,7 @@ link_intrastage_shaders(void *mem_ctx,
 					      insertion_point, true, linked);
    }
 
-   /* Check if any shader needs built-in functions. */
-   bool need_builtins = false;
-   for (unsigned i = 0; i < num_shaders; i++) {
-      if (shader_list[i]->info.uses_builtin_functions) {
-         need_builtins = true;
-         break;
-      }
-   }
-
-   bool ok;
-   if (need_builtins) {
-      /* Make a temporary array one larger than shader_list, which will hold
-       * the built-in function shader as well.
-       */
-      gl_shader **linking_shaders = (gl_shader **)
-         calloc(num_shaders + 1, sizeof(gl_shader *));
-
-      ok = linking_shaders != NULL;
-
-      if (ok) {
-         memcpy(linking_shaders, shader_list, num_shaders * sizeof(gl_shader *));
-         _mesa_glsl_initialize_builtin_functions();
-         linking_shaders[num_shaders] = _mesa_glsl_get_builtin_function_shader();
-
-         ok = link_function_calls(prog, linked, linking_shaders, num_shaders + 1);
-
-         free(linking_shaders);
-      } else {
-         _mesa_error_no_memory(__func__);
-      }
-   } else {
-      ok = link_function_calls(prog, linked, shader_list, num_shaders);
-   }
-
-
-   if (!ok) {
+   if (!link_function_calls(prog, linked, shader_list, num_shaders)) {
       _mesa_delete_linked_shader(ctx, linked);
       return NULL;
    }
-- 
2.10.0



More information about the mesa-dev mailing list