On 09/21/2016 10:20 PM, Kenneth Graunke wrote: > Now that we generate built-in functions inline, there's no need to link > against the built-in shader, and no built-in prototypes to consider. > > This lets us delete a bunch of code.
Boy howdy. This simplifies things quite a bit. Pending patch 2, this patch is Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > --- > src/compiler/glsl/link_functions.cpp | 32 +++++++++++---------------- > 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 b4aae5e..e4f77be 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 606d006..929a653 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; > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev