[Mesa-dev] [PATCH 05/21] glsl: Pass _mesa_glsl_parse_state into matching_signature and such.

Kenneth Graunke kenneth at whitecape.org
Wed Sep 4 15:22:28 PDT 2013


During compilation, we'll use this to determine built-in availability.
All the prototypes will be available, but we can filter out the ones
that aren't actually available.

At link time, we don't actually need this filtering capability, since
we've already imported the prototypes and flagged them as "is_builtin."
The linker won't import additional prototypes, so it won't pull in any
unavailable built-ins.  Conversely, the is_builtin flag will prevent a
shader from defining its own prototype and fooling the linker to import
a built-in's body.  All that to say: we can just pass in NULL.  It'll be
fine.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/glsl/ast_function.cpp                      |  5 +++--
 src/glsl/ast_to_hir.cpp                        |  2 +-
 src/glsl/ir.h                                  |  9 ++++++---
 src/glsl/ir_function.cpp                       | 11 +++++++----
 src/glsl/ir_reader.cpp                         |  5 +++--
 src/glsl/link_functions.cpp                    |  5 +++--
 src/glsl/linker.cpp                            |  4 ++--
 src/glsl/lower_packed_varyings.cpp             |  2 +-
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp   |  2 +-
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |  2 +-
 src/mesa/program/ir_to_mesa.cpp                |  2 +-
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp     |  2 +-
 12 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
index 7df2b69..7580bec 100644
--- a/src/glsl/ast_function.cpp
+++ b/src/glsl/ast_function.cpp
@@ -388,7 +388,8 @@ match_function_by_name(const char *name,
    if (f != NULL) {
       /* Look for a match in the local shader.  If exact, we're done. */
       bool is_exact = false;
-      sig = local_sig = f->matching_signature(actual_parameters, &is_exact);
+      sig = local_sig = f->matching_signature(state, actual_parameters,
+                                              &is_exact);
       if (is_exact)
 	 goto done;
 
@@ -411,7 +412,7 @@ match_function_by_name(const char *name,
 
       bool is_exact = false;
       ir_function_signature *builtin_sig =
-	 builtin->matching_signature(actual_parameters, &is_exact);
+	 builtin->matching_signature(state, actual_parameters, &is_exact);
 
       if (builtin_sig == NULL)
 	 continue;
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 52059e4..2316cf8 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -3576,7 +3576,7 @@ ast_function::hir(exec_list *instructions,
     */
    f = state->symbols->get_function(name);
    if (f != NULL && (state->es_shader || f->has_user_signature())) {
-      sig = f->exact_matching_signature(&hir_parameters);
+      sig = f->exact_matching_signature(state, &hir_parameters);
       if (sig != NULL) {
 	 const char *badvar = sig->qualifiers_match(&hir_parameters);
 	 if (badvar != NULL) {
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index bd1c12c..c673aac 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -765,20 +765,23 @@ public:
     * Find a signature that matches a set of actual parameters, taking implicit
     * conversions into account.  Also flags whether the match was exact.
     */
-   ir_function_signature *matching_signature(const exec_list *actual_param,
+   ir_function_signature *matching_signature(_mesa_glsl_parse_state *state,
+                                             const exec_list *actual_param,
 					     bool *match_is_exact);
 
    /**
     * Find a signature that matches a set of actual parameters, taking implicit
     * conversions into account.
     */
-   ir_function_signature *matching_signature(const exec_list *actual_param);
+   ir_function_signature *matching_signature(_mesa_glsl_parse_state *state,
+                                             const exec_list *actual_param);
 
    /**
     * Find a signature that exactly matches a set of actual parameters without
     * any implicit type conversions.
     */
-   ir_function_signature *exact_matching_signature(const exec_list *actual_ps);
+   ir_function_signature *exact_matching_signature(_mesa_glsl_parse_state *state,
+                                                   const exec_list *actual_ps);
 
    /**
     * Name of the function.
diff --git a/src/glsl/ir_function.cpp b/src/glsl/ir_function.cpp
index fe4209c..2dd98bc 100644
--- a/src/glsl/ir_function.cpp
+++ b/src/glsl/ir_function.cpp
@@ -116,14 +116,16 @@ parameter_lists_match(const exec_list *list_a, const exec_list *list_b)
 
 
 ir_function_signature *
-ir_function::matching_signature(const exec_list *actual_parameters)
+ir_function::matching_signature(_mesa_glsl_parse_state *state,
+                                const exec_list *actual_parameters)
 {
    bool is_exact;
-   return matching_signature(actual_parameters, &is_exact);
+   return matching_signature(state, actual_parameters, &is_exact);
 }
 
 ir_function_signature *
-ir_function::matching_signature(const exec_list *actual_parameters,
+ir_function::matching_signature(_mesa_glsl_parse_state *state,
+                                const exec_list *actual_parameters,
 			        bool *is_exact)
 {
    ir_function_signature *match = NULL;
@@ -203,7 +205,8 @@ parameter_lists_match_exact(const exec_list *list_a, const exec_list *list_b)
 }
 
 ir_function_signature *
-ir_function::exact_matching_signature(const exec_list *actual_parameters)
+ir_function::exact_matching_signature(_mesa_glsl_parse_state *state,
+                                      const exec_list *actual_parameters)
 {
    foreach_iter(exec_list_iterator, iter, signatures) {
       ir_function_signature *const sig =
diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp
index 8261d9f..ec35b68 100644
--- a/src/glsl/ir_reader.cpp
+++ b/src/glsl/ir_reader.cpp
@@ -254,7 +254,8 @@ ir_reader::read_function_sig(ir_function *f, s_expression *expr, bool skip_body)
       hir_parameters.push_tail(var);
    }
 
-   ir_function_signature *sig = f->exact_matching_signature(&hir_parameters);
+   ir_function_signature *sig =
+      f->exact_matching_signature(state, &hir_parameters);
    if (sig == NULL && skip_body) {
       /* If scanning for prototypes, generate a new signature. */
       /* ir_reader doesn't know what languages support a given built-in, so
@@ -668,7 +669,7 @@ ir_reader::read_call(s_expression *expr)
       return NULL;
    }
 
-   ir_function_signature *callee = f->matching_signature(&parameters);
+   ir_function_signature *callee = f->matching_signature(state, &parameters);
    if (callee == NULL) {
       ir_read_error(expr, "couldn't find matching signature for function "
                     "%s", name->value());
diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp
index 3d94e49..ac9d372 100644
--- a/src/glsl/link_functions.cpp
+++ b/src/glsl/link_functions.cpp
@@ -113,7 +113,7 @@ public:
       }
 
       ir_function_signature *linked_sig =
-	 f->exact_matching_signature(&callee->parameters);
+	 f->exact_matching_signature(NULL, &callee->parameters);
       if ((linked_sig == NULL)
 	  || ((linked_sig != NULL)
 	      && (linked_sig->is_builtin() != ir->use_builtin))) {
@@ -256,7 +256,8 @@ find_matching_signature(const char *name, const exec_list *actual_parameters,
       if (f == NULL)
 	 continue;
 
-      ir_function_signature *sig = f->matching_signature(actual_parameters);
+      ir_function_signature *sig =
+         f->matching_signature(NULL, actual_parameters);
 
       if ((sig == NULL) || !sig->is_defined)
 	 continue;
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 350778a..65afc2e 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -982,7 +982,7 @@ get_main_function_signature(gl_shader *sh)
        * We don't have to check for multiple definitions of main (in multiple
        * shaders) because that would have already been caught above.
        */
-      ir_function_signature *sig = f->matching_signature(&void_parameters);
+      ir_function_signature *sig = f->matching_signature(NULL, &void_parameters);
       if ((sig != NULL) && sig->is_defined) {
 	 return sig;
       }
@@ -1167,7 +1167,7 @@ link_intrastage_shaders(void *mem_ctx,
 		  continue;
 
 	       ir_function_signature *other_sig =
-		  other->exact_matching_signature(& sig->parameters);
+		  other->exact_matching_signature(NULL, &sig->parameters);
 
 	       if ((other_sig != NULL) && other_sig->is_defined
 		   && !other_sig->is_builtin()) {
diff --git a/src/glsl/lower_packed_varyings.cpp b/src/glsl/lower_packed_varyings.cpp
index 31a50bb..4f61722 100644
--- a/src/glsl/lower_packed_varyings.cpp
+++ b/src/glsl/lower_packed_varyings.cpp
@@ -658,7 +658,7 @@ lower_packed_varyings(void *mem_ctx, unsigned location_base,
    ir_function *main_func = shader->symbols->get_function("main");
    exec_list void_parameters;
    ir_function_signature *main_func_sig
-      = main_func->matching_signature(&void_parameters);
+      = main_func->matching_signature(NULL, &void_parameters);
    exec_list new_instructions;
    lower_packed_varyings_visitor visitor(mem_ctx, location_base,
                                          locations_used, mode,
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 1e01d39..543fe5e 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -2072,7 +2072,7 @@ fs_visitor::visit(ir_function *ir)
       const ir_function_signature *sig;
       exec_list empty;
 
-      sig = ir->matching_signature(&empty);
+      sig = ir->matching_signature(NULL, &empty);
 
       assert(sig);
 
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 6771630..4feef5f 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1200,7 +1200,7 @@ vec4_visitor::visit(ir_function *ir)
       const ir_function_signature *sig;
       exec_list empty;
 
-      sig = ir->matching_signature(&empty);
+      sig = ir->matching_signature(NULL, &empty);
 
       assert(sig);
 
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 340a449..fe9cac0 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -837,7 +837,7 @@ ir_to_mesa_visitor::visit(ir_function *ir)
       const ir_function_signature *sig;
       exec_list empty;
 
-      sig = ir->matching_signature(&empty);
+      sig = ir->matching_signature(NULL, &empty);
 
       assert(sig);
 
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 37779d4..d4c4260 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -1209,7 +1209,7 @@ glsl_to_tgsi_visitor::visit(ir_function *ir)
       const ir_function_signature *sig;
       exec_list empty;
 
-      sig = ir->matching_signature(&empty);
+      sig = ir->matching_signature(NULL, &empty);
 
       assert(sig);
 
-- 
1.8.3.4



More information about the mesa-dev mailing list