[Mesa-dev] [PATCH v2 3/3] i965/gen9: Add workarounds for object preemption.

Rafael Antognolli rafael.antognolli at intel.com
Wed Oct 31 18:15:28 UTC 2018


On Tue, Oct 30, 2018 at 04:32:54PM -0700, Kenneth Graunke wrote:
> On Monday, October 29, 2018 10:19:54 AM PDT Rafael Antognolli wrote:
> > Gen9 hardware requires some workarounds to disable preemption depending
> > on the type of primitive being emitted.
> > 
> > We implement this by adding a new atom that tracks BRW_NEW_PRIMITIVE.
> > Whenever it happens, we check the current type of primitive and
> > enable/disable object preemption.
> > 
> > For now, we just ignore blorp.  The only primitive it emits is
> > 3DPRIM_RECTLIST, and since it's not listed in the workarounds, we can
> > safely leave preemption enabled when it happens. Or it will be disabled
> > by a previous 3DPRIMITIVE, which should be fine too.
> > 
> > Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
> > Cc: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> >  src/mesa/drivers/dri/i965/genX_state_upload.c | 47 +++++++++++++++++++
> >  1 file changed, 47 insertions(+)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
> > index 740cb0c4d2e..3a01bab1ae1 100644
> > --- a/src/mesa/drivers/dri/i965/genX_state_upload.c
> > +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
> > @@ -5563,6 +5563,50 @@ static const struct brw_tracked_state genX(blend_constant_color) = {
> >  
> >  /* ---------------------------------------------------------------------- */
> >  
> > +#if GEN_GEN == 9
> > +
> > +/**
> 
>  * Enable or disable preemption based on the current primitive type.
>  * (This should only be necessary on Gen9 hardware, not Gen10+.)
>  *
> 
> > + * Implement workarounds for preemption:
> > + *    - WaDisableMidObjectPreemptionForGSLineStripAdj
> > + *    - WaDisableMidObjectPreemptionForTrifanOrPolygon
> > + */
> > +static void
> > +gen9_emit_preempt_wa(struct brw_context *brw)
> > +{
> 
> I think this might be a bit easier to follow as
> 
>    bool object_preemption = true;
> 
>    if (brw->primitive == _3DPRIM_LINESTRIP_ADJ && brw->gs.enabled)
>       object_preemption = false;
> 
>    if (brw->primitive == _3DPRIM_TRIFAN)
>       object_preemption = false;
> 
>    brw_enable_obj_preemption(brw, object_preemption);
> 
> (with the comments of course.)
> 
> Do we need any stalling when whacking CS_CHICKEN1...?

Hmmm... there's this:

"A fixed function pipe flush is required before modifying this field"

in the programming notes. I'm not sure what that is, but I assume it's
some type of PIPE_CONTROL?

> Looking through the workarounds list, I believe that we also need to
> disable mid-object preemption for _3DPRIM_LINELOOP (Gen9 WA #0816).
> 
> We may need to disable it if instance_count > 0 in the 3DPRIMITIVE
> (Gen9 WA #0798).

Ack.

> We may also need to disable autostripping by whacking some chicken
> registers if it's enabled (Gen9 WA #0799).  Which would be lame,

Looking again at #0799, it seems it's only applicable up to C0 on SKL,
and B0 on BXT. So maybe we should be fine here? Or just disable it on
BXT?

> because that's likely a useful optimization.  I guess we could disable
> preemption for TRILIST and LINELIST as well to be safe.

Is this because of the autostripping mentioned above, or some other
workaround? Or just your impression?

I can update it to include that, but just want to be sure that it's
still applicable, once we figure the thing about #0799.

> 
> And GPGPU preemption looks like a mile long list of workarounds,
> so let's not try it on Gen9.

Fair enough, thanks a lot for the review!

> > +   /* WaDisableMidObjectPreemptionForGSLineStripAdj
> > +    *
> > +    *    WA: Disable mid-draw preemption when draw-call is a linestrip_adj and
> > +    *    GS is enabled.
> > +    */
> > +   bool object_preemption =
> > +      !(brw->primitive == _3DPRIM_LINESTRIP_ADJ && brw->gs.enabled);
> > +
> > +   /* WaDisableMidObjectPreemptionForTrifanOrPolygon
> > +    *
> > +    *    TriFan miscompare in Execlist Preemption test. Cut index that is on a
> > +    *    previous context. End the previous, the resume another context with a
> > +    *    tri-fan or polygon, and the vertex count is corrupted. If we prempt
> > +    *    again we will cause corruption.
> > +    *
> > +    *    WA: Disable mid-draw preemption when draw-call has a tri-fan.
> > +    */
> > +   object_preemption =
> > +      object_preemption && !(brw->primitive == _3DPRIM_TRIFAN);
> > +
> > +   brw_enable_obj_preemption(brw, object_preemption);
> > +}
> > +
> > +static const struct brw_tracked_state gen9_preempt_wa = {
> > +   .dirty = {
> > +      .mesa = 0,
> > +      .brw = BRW_NEW_PRIMITIVE | BRW_NEW_GEOMETRY_PROGRAM,
> > +   },
> > +   .emit = gen9_emit_preempt_wa,
> > +};
> > +#endif
> > +
> > +/* ---------------------------------------------------------------------- */
> > +
> >  void
> >  genX(init_atoms)(struct brw_context *brw)
> >  {
> > @@ -5867,6 +5911,9 @@ genX(init_atoms)(struct brw_context *brw)
> >  
> >        &genX(cut_index),
> >        &gen8_pma_fix,
> > +#if GEN_GEN == 9
> > +      &gen9_preempt_wa,
> > +#endif
> >     };
> >  #endif
> >  
> > 
> 




More information about the mesa-dev mailing list