[Intel-gfx] [PATCH] drm/i915: Fixed VS thread distribution between slices

Ben Widawsky ben at bwidawsk.net
Tue Apr 10 23:08:22 CEST 2012


On Tue, Apr 10, 2012 at 11:38:32AM -0700, Kenneth Graunke wrote:
> On 04/09/2012 09:10 PM, Ben Widawsky wrote:
> >From: "bernard.r.kilarski"<your-user-name at intel.com>
> >
> >Full disclosure: my IVB hangs on nexuiz both before, and after this patch, and
> >I haven't done any debug
> >
> >This patch was given to me by Bernard, by way of Daniel. The patch came
> >with very little description, and I haven't really spent too much time
> >in the spec to make much sense out of it.
> >
> >The improvement (IVB only) with my nexuiz configuration is almost
> >unbelievable. It has a more humble improvement on OpenArena. I'll throw
> >other tests at it, and try to debug the hangs a bit, but given the
> >nexuiz results, I was compelled to post this sooner, rather than later.
> >
> >I see about a 2% improvement on OA
> >and about a 40$% improvement on nexuiz
> >
> >CC: Daniel Vetter<daniel.vetter at ffwll.ch>
> >Signed-off-by: Ben Widawsky<benjamin.widawsky at intel.com>
> >---
> >  drivers/gpu/drm/i915/i915_reg.h      |    3 +++
> >  drivers/gpu/drm/i915/intel_display.c |    3 +++
> >  2 files changed, 6 insertions(+)
> >
> >diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> >index cb55444..755bdff 100644
> >--- a/drivers/gpu/drm/i915/i915_reg.h
> >+++ b/drivers/gpu/drm/i915/i915_reg.h
> >@@ -682,6 +682,9 @@
> >
> >  #define GEN6_BSD_RNCID			0x12198
> >
> >+#define GEN7_FF_THREAD_MODE		0x20a0
> >+#define GEN7_FF_THREAD_SIMPLE_SCHED	0x28a00010
> >+
> >  /*
> >   * Framebuffer compression (915+ only)
> >   */
> >diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> >index 6ec81b4..bbd5f46 100644
> >--- a/drivers/gpu/drm/i915/intel_display.c
> >+++ b/drivers/gpu/drm/i915/intel_display.c
> >@@ -8893,6 +8893,9 @@ static void ivybridge_init_clock_gating(struct drm_device *dev)
> >  			   DISPPLANE_TRICKLE_FEED_DISABLE);
> >  		intel_flush_display_plane(dev_priv, pipe);
> >  	}
> >+
> >+	/* Fix vertex load balancing */
> >+	I915_WRITE(GEN7_FF_THREAD_MODE,GEN7_FF_THREAD_SIMPLE_SCHED);
> >  }
> >
> >  static void valleyview_init_clock_gating(struct drm_device *dev)
> 
> I definitely approve of this patch.  It appears to make the hardware
> use a simple scheduler, as opposed to a complex one which is
> default.
> 
> The default scheduler has this lovely comment: "Note: this will
> cause possible corruption if input handles are reused due to
> instancing or topologies that reuse vertices (i.e. strips and
> fans)".
> 
> That is frightening.  We use instancing, tristrips, and trifans all
> the time.  While I haven't observed a problem, I don't want this to
> come back and bite us later.  The other scheduling options in VS
> Thread Dispatch Mode are useless.  Simple scheduling appears to be
> the only option that's safe.  And apparently it performs well too :)
> 
> So, as is, I think this qualifies for a:
> 
> Cc: stable at kernel.org
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> 
> However!  I would like to be more paranoid and program it to 0x28a00000.
> In other words, the IVB default minus bit 4 and bit 12:
> 
>     0x28a01010 & ~(1 << 4 | 1 << 12)
> 
> Bit 12 is the VS Thread Dispatch Override, which Bernard's patch
> cleared.  Bit 4 is the equivalent bit for DS (Domain Shaders).  It
> also has the scary comment about instancing and strips/fans not
> working.
> 
> Likewise, bit 16 also should be off (but is already off by default).
> 
> Since domain shaders are an OpenGL 4.0 feature, this shouldn't
> matter in the short term...but I doubt any of us will remember to
> come back here and change these bits when we eventually need them.


After moving to -queued per Daniel's recommendation, something goes
seriously wrong with the patch, and I think it will require some debug.

With -queued I have no issues anymore, and with the patch *something*
hangs every time. No netconsole atm.




More information about the Intel-gfx mailing list