[Mesa-dev] [PATCH 3/3] glsl: Perform implicit type conversions on function call out parameters.

Paul Berry stereotype441 at gmail.com
Mon Aug 15 11:51:55 PDT 2011


Have you had a chance to think about any of these issues, Ian?  I'd
like to commit this patch series to Mesa.

On 5 August 2011 17:16, Paul Berry <stereotype441 at gmail.com> wrote:
> On 2 August 2011 18:27, Ian Romanick <idr at freedesktop.org> wrote:
>>> +       *
>>> +       * Also, perform implicit conversion of arguments.  Note: to
>>> +       * implicitly convert out parameters, we need to place them in a
>>> +       * temporary variable, and do the conversion after the call
>>> +       * takes place.  Since we haven't emitted the call yet, we'll
>>> +       * place the post-call conversions in a temporary exec_list, and
>>> +       * emit them later.
>>
>> It looks like this comment (and the others below) are wrapped to much
>> less than 80 columns.
>
> They are wrapped to 70 columns, which is the default value used by
> Emacs and appeals to me personally.  But I care way less about
> formatting details like this than I care about not losing time to
> debating them, and I think the best way to avoid that is to pick a
> standard and document it.  What's your preferred line-wrapping width,
> and would you be willing to enshrine it in docs/devinfo.html (where it
> might, I fear, be subject to a round of bike-shedding by those with
> strong feelings about such things)?  If so, I'd be glad to update my
> Emacs configuration to follow it.
>
>>
>>>         */
>>>        exec_list_iterator actual_iter = actual_parameters->iterator();
>>>        exec_list_iterator formal_iter = sig->parameters.iterator();
>>> @@ -185,8 +194,50 @@ match_function_by_name(exec_list *instructions, const char *name,
>>>        }
>>>
>>>        if (formal->type->is_numeric() || formal->type->is_boolean()) {
>>> -         ir_rvalue *converted = convert_component(actual, formal->type);
>>> -         actual->replace_with(converted);
>>> +            switch (formal->mode) {
>>> +            case ir_var_in:
>>> +               {
>>
>> The { should be on the same line as the case, and emacs got the
>> indentation wonkey because it's not.
>
> For the record, this was actually completely on purpose.  I prefer for
> an opening brace after a case label to be on its own line, and to
> cause an extra level of indent, to emphasize the fact that the brace
> exists solely for the purpose of variable scoping, and is not part of
> the syntax of the switch statement (this is in contrast with the {
> that comes after an if statement, for example, which is part of the
> syntax of "if" and not solely for scoping).  Incidentally, the
> behavior of "indent -br -i3 -npcs --no-tabs" (which is recommended by
> devinfo.html) seems to agree with my formatting--it doesn't alter this
> case block as I submitted it, though it does force the opening braces
> of if-statements to be on the same line as the "if".  And if I force
> the { to the same line as the case, the "indent" command continues to
> generate the indentation that appears "wonky" to you.
>
> I'm guessing from looking at code elsewhere in Mesa that what you
> would have preferred would have been this, correct?
>
> switch (formal->mode) {
> case ir_var_in: {
>   ir_rvalue *converted
>      = convert_component(actual, formal->type);
>   actual->replace_with(converted);
>   break;
> }
> case ir_var_out:
>   ...
> }
>
> Normally I wouldn't bike-shed something like this, but what bothers me
> about the above is that it puts the closing brace of the case at the
> same indentation as the closing brace of the switch statement.  That
> makes it hard to tell at a glance which closing brace terminates the
> switch statement and which closing brace terminates the case, and that
> is IMHO the whole point of indentation.
>
> However, having said all that, I realize that I'm still fairly new to
> the mesa project and I may just have to suck it up and conform to the
> mesa rules.  I just wanted to give you a chance to change your mind :)
>
>>
>>> +                  ir_rvalue *converted
>>> +                     = convert_component(actual, formal->type);
>>> +                  actual->replace_with(converted);
>>> +               }
>>> +               break;
>>> +            case ir_var_out:
>>> +               if (actual->type != formal->type)
>>> +               {
>>
>> The { should be on the same line as the if.
>
> _This_ was a complete oversight on my part.  I'll fix it.
>
>>
>>> +                  /* Create a temporary variable to hold the out
>>> +                   * parameter.  Don't pass a hashtable to clone()
>>> +                   * because we don't want this temporary variable to
>>> +                   * be in scope.
>>> +                   */
>>> +                  ir_variable *tmp = formal->clone(ctx, NULL);
>>> +                  tmp->mode = ir_var_auto;
>>
>> ir_var_auto is only used for user-defined variables, and
>> ir_var_temporary is used for compiler-generated variables.  We'd also
>> usually do something like:
>>
>>    ir_variable *tmp =
>>        new(mem_ctx) ir_variable(formal->type,
>>                                 "out_parameter_conversion",
>>                                 ir_var_temporary);
>>
>> Giving it a name like that makes the origin of the variable clear in
>> shader dumps.  This has proven to be an invaluable debugging tool.
>
> That seems very reasonable.  I'll make that change.
>


More information about the mesa-dev mailing list