[Mesa-dev] [RFC] intel/isl: Rewrite gen7_choose_image_alignment_el

Chad Versace chadversary at chromium.org
Fri May 12 02:27:26 UTC 2017


On Wed 10 May 2017, Kenneth Graunke wrote:
> On Wednesday, May 10, 2017 10:19:46 AM PDT Emil Velikov wrote:
> > On 10 May 2017 at 16:38, Jason Ekstrand <jason at jlekstrand.net> wrote:
> > > On Wed, May 10, 2017 at 8:26 AM, Emil Velikov <emil.l.velikov at gmail.com>
> > > wrote:
> > >>
> > >> Hi Jason,
> > >>
> > >> Humble unrelated question.
> > >>
> > >> On 9 May 2017 at 18:00, Jason Ekstrand <jason at jlekstrand.net> wrote:
> > >>
> > >> > +   if (isl_surf_usage_is_depth(info->usage)) {
> > >> > +      if (info->format == ISL_FORMAT_R16_UNORM) {
> > >> > +         return isl_extent3d(8, 4, 1);
> > >> > +      } else {
> > >> > +         return isl_extent3d(4, 4, 1);
> > >> > +      }
> > >> > +   } else if (isl_surf_usage_is_stencil(info->usage)) {
> > >> > +      return isl_extent3d(8, 8, 1);
> > >> > +   } else if (isl_format_is_compressed(info->format)) {
> > >> > +      /* Compressed formats all have alignment equal to block size. */
> > >> > +      return isl_extent3d(1, 1, 1);
> > >> > +   }
> > >>
> > >> I've seen a handful of constructs like the above.. Is there any reason
> > >> to keep the extra else/curly brackets?
> > >> Something like the following reads a bit easier yet admittedly I'm not
> > >> the person to set the coding style in isl.
> > >
> > >
> > > Does it?
> > >
> > Indeed it does, I would not have bothered otherwise ;-)
> > It's a subjective topic and my contributions here are, ahem, limited,
> > so feel do ignore me.

It most definitely does :)

> I see Jason's point here - the depth/stencil/compressed blocks are
> kind of like cases in a switch.  It's one of the three, and we're
> choosing between them.  I think the code reads fine as is here.
> 
> That said, I almost always prefer Emil's style, FWIW.
> 
>    if (blah)
>       return foo;
> 
>    return bar;
> 
> makes it obvious that something will be returned, as there's an
> clear unconditional return at the top-level.  I especially like this
> style when "foo" is for a special case, and "bar" is the general case.
> 
>    if (blah)
>       return foo;
>    else
>       return bar;
> 
> is a little less clear IMO - you have to recognize that the control flow
> in the inner block will happen, because one of the two blocks will
> always be hit.

I agree with Ken here.

In a chain of early returns...

    if (x0)
        return r0;

    if (x1)
        return r1;

    return r2;

...the code flow is obvious at first glance by all readers, not just the
author. The clarity, I believe, is due to two factors:

    - It resembles the natural human behavior of making choices. For example,
      when you're in grocery aisle trying to choose Ben & Jerry's, the
      thoughts usually proceed as below. Observe how similar it *feels*
      to read code in the early-return style to how it feels to choose
      the perfect pint of ice cream.

            - [Eyes dart to Strawberry Garcia]
            - Do I want strawberry today? ...
            - Nope.

            - [Eyes dart to The Tonight Dough]
            - Do I think Jimmy Fallon is funny?
            - Nope.

            - [Eyes dart to Boom Chocolatta Cookie Core]
            - Do I really want *that* much chocolate in my ice cream?
            - Nope.

            - [Eyes dart to Vanilla]
            - Have I been deceiving myself all these years? Am I, in
              truth, the predictable, boring chump that I have strove so
              hard to avoid becoming? Am I truly the type of person who,
              when confronted with a dizzying array of fanatastical ice
              cream wonders, plays it safe with vanilla, afraid of what
              may lie behind a decision too hasty, too uninformed, too
              bold?
            - Sigh. Yup.

                - [Grab the vanilla]
                - [Return home]

            // You've returned home! The following supermarket scenarios
            // are obviously no longer possible.

            - [Eyes dart to Peanut Butter World]
            ...

            - [Eyes dart to Pumpkin Cheesecake]
            ...

            - [Give up]
            - [Return home empty handed]


    - There is no oppurtunity for a "non-returning" branch to hide among
      the returning branches, like below. Readers (or, at least me)
      intuit this and feel more confidence that they understand the
      code.

        if (blah_blah_blah) {
            return r0;
        } else if (blah_foo_foo_blah) {
            do_stuff;
        } else if (oh_what_did_you_say) {
            return big_thing;
        }

        do_more_stuff();
        return ok_now;


> But it's largely a matter of taste, so...*shrug*.

Not always. The Go code guidelines strongly recommend the "early
return" style for error handling. The guide provides a good explanation.
<https://github.com/golang/go/wiki/CodeReviewComments#indent-error-flow>

> If I were writing this, I would probably handle the R16 case as:
> 
>    if (info->format == ISL_FORMAT_R16_UNORM) {
>       return isl_extent3d(8, 4, 1);
> 
>    return isl_extent3d(4, 4, 1);
> 
> but leave the rest as is.  Totally up to you though, Jason.

Anyway, I've stated my preference. Either way, this patch is a large
improvement over my original isl code.

Reviewed-by: Chad Versace <chadversary at chromium.org>


More information about the mesa-dev mailing list