[Mesa-dev] [PATCH] i965/fs: Set pixel/sample mask for compute shaders atomic ops

Jordan Justen jordan.l.justen at intel.com
Thu Feb 19 23:25:56 PST 2015


On 2015-02-19 21:40:37, Ben Widawsky wrote:
> On Thu, Feb 19, 2015 at 03:42:05PM -0800, Jordan Justen wrote:
> > For fragment programs, we pull this mask from the payload header. The same
> > mask doesn't exist for compute shaders, so we set all bits to enabled.
> > 
> > Note: this mask is ANDed with the execution mask, so some channels may not end
> > up issuing the atomic operation.
> > 
> > Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> > Cc: Ben Widawsky <ben at bwidawsk.net>
> > Cc: Francisco Jerez <currojerez at riseup.net>
> 
> Just add to the commit message that this is needed specifically because compute
> is invoked as SIMD16 (and perhaps reference the other commits?) and it's:
> Reviewed-by: Ben Widawsky <ben at bwidawsk.net>

Good idea. I'll add those.

> Sorry it advance...
> we may as well just go for 0xffffffff in case we ever support SIMD32.

I had been setting all 32-bits previously. I mentioned to you that I
thought this was needed for SIMD32. I wanted to double check it before
sending the patch out. I think I found the field for IVB in the PRM:

IVB Vol 4 Part 1 3.9.9.9 Message Header
Pixel/Sample Mask

...and it looks like it is only 16-bits. Maybe Francisco can confirm
that I got it right.

I couldn't find this same information in the HSW PRMs.

I'm not sure what that means for SIMD32.

-Jordan

> > ---
> >  While it's fresh in our minds. :)
> > 
> >  This seems to work for gen7 & gen8 CS. For CS simd16, we need the
> >  0xffff change, but it seems to work fine for simd8 as well.
> > 
> >  I also tested gen8 (simd8vs), and there were no piglit regressions.
> > 
> >  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> > index 24cc118..960a0aa 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> > @@ -2998,9 +2998,9 @@ fs_visitor::emit_untyped_atomic(unsigned atomic_op, unsigned surf_index,
> >         * mask sent in the header to compute the actual set of channels that execute
> >         * the atomic operation.
> >         */
> > -      assert(stage == MESA_SHADER_VERTEX);
> > +      assert(stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_COMPUTE);
> >        emit(MOV(component(sources[0], 7),
> > -               brw_imm_ud(0xff)))->force_writemask_all = true;
> > +               brw_imm_ud(0xffff)))->force_writemask_all = true;
> >     }
> >     length++;
> >  
> > @@ -3061,9 +3061,9 @@ fs_visitor::emit_untyped_surface_read(unsigned surf_index, fs_reg dst,
> >         * mask sent in the header to compute the actual set of channels that execute
> >         * the atomic operation.
> >         */
> > -      assert(stage == MESA_SHADER_VERTEX);
> > +      assert(stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_COMPUTE);
> >        emit(MOV(component(sources[0], 7),
> > -               brw_imm_ud(0xff)))->force_writemask_all = true;
> > +               brw_imm_ud(0xffff)))->force_writemask_all = true;
> >     }
> >  
> >     /* Set the surface read offset. */
> > -- 
> > 2.1.4
> > 


More information about the mesa-dev mailing list