[Mesa-dev] [PATCH 4/4] glsl: Delete linker stuff relating to built-in functions.
Ian Romanick
idr at freedesktop.org
Thu Sep 22 10:57:00 UTC 2016
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.romanick at intel.com>
> Signed-off-by: Kenneth Graunke <kenneth at 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;
> }
>
More information about the mesa-dev
mailing list