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 <kenn...@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(¶meters); + ir_function_signature *callee = f->matching_signature(state, ¶meters); 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev