diff options
-rw-r--r-- | src/compiler/glsl/link_functions.cpp | 32 | ||||
-rw-r--r-- | 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 b4aae5e015d..e4f77be717f 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 02a8d0c86e4..18062848e7a 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; } |