[Mesa-dev] [PATCH V2 8/9] glsl: Implement overload resolution for ARB_gpu_shader5

Chris Forbes chrisf at ijw.co.nz
Tue Jun 3 15:49:07 PDT 2014


OK, I'll move the various spec references into the code, cite GLSL
4.00 rather than the extension where possible, and throw in some more
comments to clarify the stranger bits.

Thanks for the review :)

-- Chris


On Wed, Jun 4, 2014 at 10:30 AM, Jordan Justen <jljusten at gmail.com> wrote:
> 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