summaryrefslogtreecommitdiffstats
path: root/src/glsl/link_functions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/glsl/link_functions.cpp')
-rw-r--r--src/glsl/link_functions.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp
index ae8818be871..d40f771e342 100644
--- a/src/glsl/link_functions.cpp
+++ b/src/glsl/link_functions.cpp
@@ -31,7 +31,8 @@
static ir_function_signature *
find_matching_signature(const char *name, const exec_list *actual_parameters,
- gl_shader **shader_list, unsigned num_shaders);
+ gl_shader **shader_list, unsigned num_shaders,
+ bool use_builtin);
class call_link_visitor : public ir_hierarchical_visitor {
public:
@@ -75,7 +76,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);
+ find_matching_signature(name, &callee->parameters, &linked, 1,
+ ir->use_builtin);
if (sig != NULL) {
ir->set_callee(sig);
return visit_continue;
@@ -85,12 +87,12 @@ public:
* linked. If it's not found there, return an error.
*/
sig = find_matching_signature(name, &ir->actual_parameters, shader_list,
- num_shaders);
+ num_shaders, ir->use_builtin);
if (sig == NULL) {
/* FINISHME: Log the full signature of unresolved function.
*/
- linker_error_printf(this->prog, "unresolved reference to function "
- "`%s'\n", name);
+ linker_error(this->prog, "unresolved reference to function `%s'\n",
+ name);
this->success = false;
return visit_stop;
}
@@ -110,7 +112,9 @@ public:
ir_function_signature *linked_sig =
f->exact_matching_signature(&callee->parameters);
- if (linked_sig == NULL) {
+ if ((linked_sig == NULL)
+ || ((linked_sig != NULL)
+ && (linked_sig->is_builtin != ir->use_builtin))) {
linked_sig = new(linked) ir_function_signature(callee->return_type);
f->add_signature(linked_sig);
}
@@ -241,7 +245,8 @@ private:
*/
ir_function_signature *
find_matching_signature(const char *name, const exec_list *actual_parameters,
- gl_shader **shader_list, unsigned num_shaders)
+ gl_shader **shader_list, unsigned num_shaders,
+ bool use_builtin)
{
for (unsigned i = 0; i < num_shaders; i++) {
ir_function *const f = shader_list[i]->symbols->get_function(name);
@@ -254,6 +259,13 @@ find_matching_signature(const char *name, const exec_list *actual_parameters,
if ((sig == NULL) || !sig->is_defined)
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;
}