[Mesa-dev] [PATCH V2 8/9] glsl: Implement overload resolution for ARB_gpu_shader5
Jordan Justen
jljusten at gmail.com
Tue Jun 3 15:30:06 PDT 2014
On Sun, May 4, 2014 at 1:24 AM, Chris Forbes <chrisf at ijw.co.nz> wrote:
> The ARB_gpu_shader5 spec says:
>
> "A function definition A is considered a better
> match than function definition B if:
>
> * for at least one function argument, the conversion for that argument
> in A is better than the corresponding conversion in B; and
>
> * there is no function argument for which the conversion in B is better
> than the corresponding conversion in A.
>
> If a single function definition is considered a better match than every
> other matching function definition, it will be used. Otherwise, a
> semantic error occurs and the shader will fail to compile."
How about adding a GLSL 4.00 spec reference by the code instead of in
the commit message?
Series Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
>
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
> src/glsl/ir_function.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
>
> diff --git a/src/glsl/ir_function.cpp b/src/glsl/ir_function.cpp
> index 6d2de47..7bd3399 100644
> --- a/src/glsl/ir_function.cpp
> +++ b/src/glsl/ir_function.cpp
> @@ -184,6 +184,51 @@ is_better_parameter_match(parameter_match_t a_match,
> }
>
>
> +static bool
> +is_best_inexact_overload(const exec_list *actual_parameters,
> + ir_function_signature **matches,
> + int num_matches,
> + ir_function_signature *sig)
> +{
> + for (ir_function_signature **other = matches;
> + other < matches + num_matches; other++) {
> + if (*other == sig)
> + continue;
> +
> + const exec_node *node_a = sig->parameters.head;
> + const exec_node *node_b = (*other)->parameters.head;
> + const exec_node *node_p = actual_parameters->head;
> +
> + bool better_for_some_parameter = false;
> +
> + for (/* empty */
> + ; !node_a->is_tail_sentinel()
> + ; node_a = node_a->next,
> + node_b = node_b->next,
> + node_p = node_p->next) {
> + parameter_match_t a_match = get_parameter_match_type(
> + (const ir_variable *)node_a,
> + (const ir_rvalue *)node_p);
> + parameter_match_t b_match = get_parameter_match_type(
> + (const ir_variable *)node_b,
> + (const ir_rvalue *)node_p);
> +
> + if (is_better_parameter_match(a_match, b_match))
> + better_for_some_parameter = true;
> +
> + if (is_better_parameter_match(b_match, a_match))
> + return false; /* B is better for this parameter */
> + }
> +
> + if (!better_for_some_parameter)
> + return false; /* A must be better than B for some parameter */
> +
> + }
> +
> + return true;
> +}
> +
> +
> static ir_function_signature *
> choose_best_inexact_overload(_mesa_glsl_parse_state *state,
> const exec_list *actual_parameters,
> @@ -196,6 +241,17 @@ choose_best_inexact_overload(_mesa_glsl_parse_state *state,
> if (num_matches == 1)
> return *matches;
>
> + /* Without GLSL 4.0 / ARB_gpu_shader5, there is no overload resolution
> + * among multiple inexact matches. Note that state may be NULL here if
> + * called from the linker; in that case we assume everything supported in
> + * any GLSL version is available. */
> + if (!state || state->is_version(400, 0) || state->ARB_gpu_shader5_enable) {
> + for (ir_function_signature **sig = matches; sig < matches + num_matches; sig++) {
> + if (is_best_inexact_overload(actual_parameters, matches, num_matches, *sig))
> + return *sig;
> + }
> + }
> +
> return NULL; /* no best candidate */
> }
>
> --
> 1.9.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list