[Mesa-dev] [PATCH 10/12] Get rid of _mesa_vert_result_to_frag_attrib().

Paul Berry stereotype441 at gmail.com
Wed Mar 13 12:58:13 PDT 2013


On 12 March 2013 19:29, Eric Anholt <eric at anholt.net> wrote:

> Paul Berry <stereotype441 at gmail.com> writes:
>
> > Now that there is no difference between the enums that represent
> > vertex outputs and fragment inputs, there's no need for a conversion
> > function.  But we still need to be able to detect when a given vertex
> > output has no corresponding fragment input.  So it is replaced by a
> > new function, _mesa_varying_slot_in_fs(), which tells whether the
> > given varying slot exists as an FS input or not.
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs.cpp        | 12 ++++-----
> >  src/mesa/drivers/dri/i965/brw_vs_constval.c | 13 ++++------
> >  src/mesa/main/mtypes.h                      | 38
> +++++++++++++----------------
> >  3 files changed, 27 insertions(+), 36 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > index 86f8cbb..ea4a56c 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > @@ -1265,7 +1265,7 @@ fs_visitor::calculate_urb_setup()
> >              continue;
> >
> >        if (c->key.vp_outputs_written & BITFIELD64_BIT(i)) {
> > -         int fp_index =
> _mesa_vert_result_to_frag_attrib((gl_varying_slot) i);
> > +            bool exists_in_fs =
> _mesa_varying_slot_in_fs((gl_varying_slot) i);
>
> I'd rather see this call moved into the single usage in the if statement
> below, like has been done elsewhere (now that the function name
> explicitly talks about what's being tested in the "if" anyway)
>

Fair enough--I'll fix that.


>
> >           /* The back color slot is skipped when the front color is
> >            * also written to.  In addition, some slots can be
> > @@ -1273,8 +1273,8 @@ fs_visitor::calculate_urb_setup()
> >            * fragment shader.  So the register number must always be
> >            * incremented, mapped or not.
> >            */
> > -         if (fp_index >= 0)
> > -            urb_setup[fp_index] = urb_next;
> > +         if (exists_in_fs)
> > +            urb_setup[i] = urb_next;
> >              urb_next++;
>
>
> >  /**
> > - * Convert from a gl_varying_slot value for a vertex output to the
> > - * corresponding gl_frag_attrib.
> > - *
> > - * Varying output values which have no corresponding gl_frag_attrib
> > - * (VARYING_SLOT_PSIZ, VARYING_SLOT_BFC0, VARYING_SLOT_BFC1, and
> > - * VARYING_SLOT_EDGE) are converted to a value of -1.
> > + * Determine if the given gl_varying_slot appears in the fragment
> shader.
> >   */
> > -static inline int
> > -_mesa_vert_result_to_frag_attrib(gl_varying_slot vert_result)
> > +static inline GLboolean
> > +_mesa_varying_slot_in_fs(gl_varying_slot slot)
> >  {
> > -   if (vert_result <= VARYING_SLOT_TEX7)
> > -      return vert_result;
> > -   else if (vert_result < VARYING_SLOT_CLIP_DIST0)
> > -      return -1;
> > -   else if (vert_result <= VARYING_SLOT_CLIP_DIST1)
> > -      return vert_result;
> > -   else if (vert_result < VARYING_SLOT_VAR0)
> > -      return -1;
> > -   else
> > -      return vert_result;
> > +   switch (slot) {
> > +   case VARYING_SLOT_PSIZ:
> > +   case VARYING_SLOT_BFC0:
> > +   case VARYING_SLOT_BFC1:
> > +   case VARYING_SLOT_EDGE:
> > +   case VARYING_SLOT_CLIP_VERTEX:
> > +   case VARYING_SLOT_LAYER:
> > +      return GL_FALSE;
> > +   default:
> > +      return GL_TRUE;
> > +   }
> >  }
>
> I bet the compiler does a big switch statement instead of doing what we
> could do better with bitfields.  Not a blocker, just a potential
> improvement.
>

Hmm, now I'm curious.

Amazingly enough, gcc with -O2 is actually smart enough to use a bitfield:

_Z24_mesa_varying_slot_in_fs15gl_varying_slot:
.LFB0:
    .cfi_startproc
    cmpl    $20, %edi
    ja    .L4
    movl    $1, %edx
    movl    %edi, %ecx
    xorl    %eax, %eax
    salq    %cl, %rdx
    testl    $1175552, %edx
    je    .L4
    rep
    ret
    .p2align 4,,10
    .p2align 3
.L4:
    movl    $1, %eax
    ret
    .cfi_endproc

I'm impressed.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130313/c4ff2342/attachment.html>


More information about the mesa-dev mailing list