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 {
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;
*/
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;
}
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);
}
*/
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;
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;
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;
}