[Mesa-dev] [PATCH 05/21] glsl: Pass _mesa_glsl_parse_state into matching_signature and such.

Paul Berry stereotype441 at gmail.com
Sun Sep 8 08:48:43 PDT 2013


On 4 September 2013 15:22, Kenneth Graunke <kenneth at whitecape.org> wrote:

> During compilation, we'll use this to determine built-in availability.
> All the prototypes will be available, but we can filter out the ones
> that aren't actually available.
>

I'm having trouble understanding this sentence because it sounds like
you're using the word "available" to mean two different things.  Do you
perhaps mean something like "when looking up the name of a built-in
function, we'll iterate through a list of all the prototypes that exist in
all GLSL versions and extensions, but we'll filter out the ones that aren't
actually available in the current GLSL version with the currently enabled
extensions"?


>
> At link time, we don't actually need this filtering capability, since
> we've already imported the prototypes and flagged them as "is_builtin."
>

This sentence tripped me up a bit since the last patch removed the
"is_builtin" flag in favor of a function.  Do you mean to say that we've
already imported the prototypes and given them a non-null builtin_info (so
is_builtin() will return true)?


> The linker won't import additional prototypes, so it won't pull in any
> unavailable built-ins.  Conversely, the is_builtin flag will prevent a
> shader from defining its own prototype and fooling the linker to import
> a built-in's body.


Similarly, in this case do you mean "conversely, prototypes defined by the
shader will have builtin_info = null, so they will return false for
is_builtin() and that will prevent the linker from trying to import a
built-in's body for those functions"?


>  All that to say: we can just pass in NULL.  It'll be
> fine.
>

> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/ast_function.cpp                      |  5 +++--
>  src/glsl/ast_to_hir.cpp                        |  2 +-
>  src/glsl/ir.h                                  |  9 ++++++---
>  src/glsl/ir_function.cpp                       | 11 +++++++----
>  src/glsl/ir_reader.cpp                         |  5 +++--
>  src/glsl/link_functions.cpp                    |  5 +++--
>  src/glsl/linker.cpp                            |  4 ++--
>  src/glsl/lower_packed_varyings.cpp             |  2 +-
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp   |  2 +-
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |  2 +-
>  src/mesa/program/ir_to_mesa.cpp                |  2 +-
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp     |  2 +-
>  12 files changed, 30 insertions(+), 21 deletions(-)
>
> diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
> index 7df2b69..7580bec 100644
> --- a/src/glsl/ast_function.cpp
> +++ b/src/glsl/ast_function.cpp
> @@ -388,7 +388,8 @@ match_function_by_name(const char *name,
>     if (f != NULL) {
>        /* Look for a match in the local shader.  If exact, we're done. */
>        bool is_exact = false;
> -      sig = local_sig = f->matching_signature(actual_parameters,
> &is_exact);
> +      sig = local_sig = f->matching_signature(state, actual_parameters,
> +                                              &is_exact);
>        if (is_exact)
>          goto done;
>
> @@ -411,7 +412,7 @@ match_function_by_name(const char *name,
>
>        bool is_exact = false;
>        ir_function_signature *builtin_sig =
> -        builtin->matching_signature(actual_parameters, &is_exact);
> +        builtin->matching_signature(state, actual_parameters, &is_exact);
>
>        if (builtin_sig == NULL)
>          continue;
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 52059e4..2316cf8 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3576,7 +3576,7 @@ ast_function::hir(exec_list *instructions,
>      */
>     f = state->symbols->get_function(name);
>     if (f != NULL && (state->es_shader || f->has_user_signature())) {
> -      sig = f->exact_matching_signature(&hir_parameters);
> +      sig = f->exact_matching_signature(state, &hir_parameters);
>        if (sig != NULL) {
>          const char *badvar = sig->qualifiers_match(&hir_parameters);
>          if (badvar != NULL) {
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index bd1c12c..c673aac 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -765,20 +765,23 @@ public:
>      * Find a signature that matches a set of actual parameters, taking
> implicit
>      * conversions into account.  Also flags whether the match was exact.
>      */
> -   ir_function_signature *matching_signature(const exec_list
> *actual_param,
> +   ir_function_signature *matching_signature(_mesa_glsl_parse_state
> *state,
> +                                             const exec_list
> *actual_param,
>                                              bool *match_is_exact);
>
>     /**
>      * Find a signature that matches a set of actual parameters, taking
> implicit
>      * conversions into account.
>      */
> -   ir_function_signature *matching_signature(const exec_list
> *actual_param);
> +   ir_function_signature *matching_signature(_mesa_glsl_parse_state
> *state,
> +                                             const exec_list
> *actual_param);
>
>     /**
>      * Find a signature that exactly matches a set of actual parameters
> without
>      * any implicit type conversions.
>      */
> -   ir_function_signature *exact_matching_signature(const exec_list
> *actual_ps);
> +   ir_function_signature *exact_matching_signature(_mesa_glsl_parse_state
> *state,
> +                                                   const exec_list
> *actual_ps);
>
>     /**
>      * Name of the function.
> diff --git a/src/glsl/ir_function.cpp b/src/glsl/ir_function.cpp
> index fe4209c..2dd98bc 100644
> --- a/src/glsl/ir_function.cpp
> +++ b/src/glsl/ir_function.cpp
> @@ -116,14 +116,16 @@ parameter_lists_match(const exec_list *list_a, const
> exec_list *list_b)
>
>
>  ir_function_signature *
> -ir_function::matching_signature(const exec_list *actual_parameters)
> +ir_function::matching_signature(_mesa_glsl_parse_state *state,
> +                                const exec_list *actual_parameters)
>  {
>     bool is_exact;
> -   return matching_signature(actual_parameters, &is_exact);
> +   return matching_signature(state, actual_parameters, &is_exact);
>  }
>
>  ir_function_signature *
> -ir_function::matching_signature(const exec_list *actual_parameters,
> +ir_function::matching_signature(_mesa_glsl_parse_state *state,
> +                                const exec_list *actual_parameters,
>                                 bool *is_exact)
>  {
>     ir_function_signature *match = NULL;
> @@ -203,7 +205,8 @@ parameter_lists_match_exact(const exec_list *list_a,
> const exec_list *list_b)
>  }
>
>  ir_function_signature *
> -ir_function::exact_matching_signature(const exec_list *actual_parameters)
> +ir_function::exact_matching_signature(_mesa_glsl_parse_state *state,
> +                                      const exec_list *actual_parameters)
>  {
>     foreach_iter(exec_list_iterator, iter, signatures) {
>        ir_function_signature *const sig =
> diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp
> index 8261d9f..ec35b68 100644
> --- a/src/glsl/ir_reader.cpp
> +++ b/src/glsl/ir_reader.cpp
> @@ -254,7 +254,8 @@ ir_reader::read_function_sig(ir_function *f,
> s_expression *expr, bool skip_body)
>        hir_parameters.push_tail(var);
>     }
>
> -   ir_function_signature *sig =
> f->exact_matching_signature(&hir_parameters);
> +   ir_function_signature *sig =
> +      f->exact_matching_signature(state, &hir_parameters);
>     if (sig == NULL && skip_body) {
>        /* If scanning for prototypes, generate a new signature. */
>        /* ir_reader doesn't know what languages support a given built-in,
> so
> @@ -668,7 +669,7 @@ ir_reader::read_call(s_expression *expr)
>        return NULL;
>     }
>
> -   ir_function_signature *callee = f->matching_signature(&parameters);
> +   ir_function_signature *callee = f->matching_signature(state,
> &parameters);
>     if (callee == NULL) {
>        ir_read_error(expr, "couldn't find matching signature for function "
>                      "%s", name->value());
> diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp
> index 3d94e49..ac9d372 100644
> --- a/src/glsl/link_functions.cpp
> +++ b/src/glsl/link_functions.cpp
> @@ -113,7 +113,7 @@ public:
>        }
>
>        ir_function_signature *linked_sig =
> -        f->exact_matching_signature(&callee->parameters);
> +        f->exact_matching_signature(NULL, &callee->parameters);
>        if ((linked_sig == NULL)
>           || ((linked_sig != NULL)
>               && (linked_sig->is_builtin() != ir->use_builtin))) {
> @@ -256,7 +256,8 @@ find_matching_signature(const char *name, const
> exec_list *actual_parameters,
>        if (f == NULL)
>          continue;
>
> -      ir_function_signature *sig =
> f->matching_signature(actual_parameters);
> +      ir_function_signature *sig =
> +         f->matching_signature(NULL, actual_parameters);
>
>        if ((sig == NULL) || !sig->is_defined)
>          continue;
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 350778a..65afc2e 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -982,7 +982,7 @@ get_main_function_signature(gl_shader *sh)
>         * We don't have to check for multiple definitions of main (in
> multiple
>         * shaders) because that would have already been caught above.
>         */
> -      ir_function_signature *sig =
> f->matching_signature(&void_parameters);
> +      ir_function_signature *sig = f->matching_signature(NULL,
> &void_parameters);
>        if ((sig != NULL) && sig->is_defined) {
>          return sig;
>        }
> @@ -1167,7 +1167,7 @@ link_intrastage_shaders(void *mem_ctx,
>                   continue;
>
>                ir_function_signature *other_sig =
> -                 other->exact_matching_signature(& sig->parameters);
> +                 other->exact_matching_signature(NULL, &sig->parameters);
>
>                if ((other_sig != NULL) && other_sig->is_defined
>                    && !other_sig->is_builtin()) {
> diff --git a/src/glsl/lower_packed_varyings.cpp
> b/src/glsl/lower_packed_varyings.cpp
> index 31a50bb..4f61722 100644
> --- a/src/glsl/lower_packed_varyings.cpp
> +++ b/src/glsl/lower_packed_varyings.cpp
> @@ -658,7 +658,7 @@ lower_packed_varyings(void *mem_ctx, unsigned
> location_base,
>     ir_function *main_func = shader->symbols->get_function("main");
>     exec_list void_parameters;
>     ir_function_signature *main_func_sig
> -      = main_func->matching_signature(&void_parameters);
> +      = main_func->matching_signature(NULL, &void_parameters);
>     exec_list new_instructions;
>     lower_packed_varyings_visitor visitor(mem_ctx, location_base,
>                                           locations_used, mode,
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 1e01d39..543fe5e 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -2072,7 +2072,7 @@ fs_visitor::visit(ir_function *ir)
>        const ir_function_signature *sig;
>        exec_list empty;
>
> -      sig = ir->matching_signature(&empty);
> +      sig = ir->matching_signature(NULL, &empty);
>
>        assert(sig);
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index 6771630..4feef5f 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -1200,7 +1200,7 @@ vec4_visitor::visit(ir_function *ir)
>        const ir_function_signature *sig;
>        exec_list empty;
>
> -      sig = ir->matching_signature(&empty);
> +      sig = ir->matching_signature(NULL, &empty);
>
>        assert(sig);
>
> diff --git a/src/mesa/program/ir_to_mesa.cpp
> b/src/mesa/program/ir_to_mesa.cpp
> index 340a449..fe9cac0 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -837,7 +837,7 @@ ir_to_mesa_visitor::visit(ir_function *ir)
>        const ir_function_signature *sig;
>        exec_list empty;
>
> -      sig = ir->matching_signature(&empty);
> +      sig = ir->matching_signature(NULL, &empty);
>
>        assert(sig);
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 37779d4..d4c4260 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -1209,7 +1209,7 @@ glsl_to_tgsi_visitor::visit(ir_function *ir)
>        const ir_function_signature *sig;
>        exec_list empty;
>
> -      sig = ir->matching_signature(&empty);
> +      sig = ir->matching_signature(NULL, &empty);
>
>        assert(sig);
>
> --
> 1.8.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130908/50849f53/attachment-0001.html>


More information about the mesa-dev mailing list