diff mbox

drm/i915: Enable provoking vertex fix on Gen9+ systems.

Message ID 20180614215328.2182-1-kenneth@whitecape.org (mailing list archive)
State New, archived
Headers show

Commit Message

Kenneth Graunke June 14, 2018, 9:53 p.m. UTC
The SF and clipper units mishandle the provoking vertex in some cases,
which can cause misrendering with shaders that use flat shaded inputs.

There are chicken bits in 3D_CHICKEN3 (for SF) and FF_SLICE_CHICKEN
(for the clipper) that work around the issue.  These registers are
unfortunately not part of the logical context (even the power context).

This patch sets both bits, and bumps the number of allowed workaround
registers to avoid running out of space (thanks to Chris Wilson for
helping debug that issue).

I am not aware of any workaround names or numbers assigned for these
issues, they're simply recommended in the documentation for each of
the registers.

Bugzilla: https://bugs.freedesktop.org/103047
---
 drivers/gpu/drm/i915/i915_drv.h          | 2 +-
 drivers/gpu/drm/i915/i915_reg.h          | 5 +++++
 drivers/gpu/drm/i915/intel_workarounds.c | 6 ++++++
 3 files changed, 12 insertions(+), 1 deletion(-)

Comments

Chris Wilson June 15, 2018, 7:16 a.m. UTC | #1
Quoting Patchwork (2018-06-14 23:53:30)
> == Series Details ==
> 
> Series: drm/i915: Enable provoking vertex fix on Gen9+ systems.
> URL   : https://patchwork.freedesktop.org/series/44781/
> State : failure
> 
> == Summary ==
> 
> = CI Bug Log - changes from CI_DRM_4322 -> Patchwork_9312 =
> 
> == Summary - FAILURE ==
> 
>   Serious unknown changes coming with Patchwork_9312 absolutely need to be
>   verified manually.
>   
>   If you think the reported changes have nothing to do with the changes
>   introduced in Patchwork_9312, please notify your bug team to allow them
>   to document this new failure mode, which will reduce false positives in CI.
> 
>   External URL: https://patchwork.freedesktop.org/api/1.0/series/44781/revisions/1/mbox/
> 
> == Possible new issues ==
> 
>   Here are the unknown changes that may have been introduced in Patchwork_9312:
> 
>   === IGT changes ===
> 
>     ==== Possible regressions ====
> 
>     igt@gem_workarounds@basic-read:
>       fi-skl-6260u:       PASS -> FAIL
>       fi-cfl-s3:          PASS -> FAIL
>       fi-skl-6700k2:      PASS -> FAIL
>       fi-skl-6770hq:      PASS -> FAIL
>       fi-kbl-7560u:       PASS -> FAIL
>       fi-skl-6600u:       PASS -> FAIL
>       fi-bxt-dsi:         PASS -> FAIL
>       fi-kbl-guc:         PASS -> FAIL
>       fi-kbl-7500u:       PASS -> FAIL
>       fi-skl-6700hq:      PASS -> FAIL
>       fi-bxt-j4205:       PASS -> FAIL
>       fi-skl-gvtdvm:      PASS -> FAIL
>       fi-cfl-guc:         PASS -> FAIL
>       {fi-whl-u}:         PASS -> FAIL
>       fi-cfl-8700k:       PASS -> FAIL
>       fi-glk-j4005:       PASS -> FAIL
>       fi-skl-guc:         PASS -> FAIL
>       fi-kbl-7567u:       PASS -> FAIL
>       fi-kbl-r:           PASS -> FAIL

(gem_workarounds:3828) DEBUG: Address	val		mask		read		result
(gem_workarounds:3828) DEBUG: 0x07014	0x20002000	0x00002000	0x00002000	OK
(gem_workarounds:3828) DEBUG: 0x0E194	0x01000100	0x00000100	0x00000114	OK
(gem_workarounds:3828) DEBUG: 0x0E4F0	0x81008100	0x00008100	0xFFFF8120	OK
(gem_workarounds:3828) DEBUG: 0x0E184	0x00200020	0x00000020	0x00000022	OK
(gem_workarounds:3828) DEBUG: 0x0E194	0x00140014	0x00000014	0x00000114	OK
(gem_workarounds:3828) DEBUG: 0x07004	0x00420042	0x00000042	0x000029C2	OK
(gem_workarounds:3828) DEBUG: 0x0E188	0x00080000	0x00000008	0x00008030	OK
(gem_workarounds:3828) DEBUG: 0x07300	0x80208020	0x00008020	0x00008830	OK
(gem_workarounds:3828) DEBUG: 0x07300	0x00100010	0x00000010	0x00008830	OK
(gem_workarounds:3828) DEBUG: 0x0E184	0x00020002	0x00000002	0x00000022	OK
(gem_workarounds:3828) DEBUG: 0x0E180	0x20002000	0x00002000	0x00002000	OK
(gem_workarounds:3828) DEBUG: 0x02580	0x00010000	0x00000001	0x00000004	OK
(gem_workarounds:3828) DEBUG: 0x02580	0x00060004	0x00000006	0x00000004	OK
(gem_workarounds:3828) WARNING: 0x02088	0x00020002	0x00000002	0x00000000	FAIL
(gem_workarounds:3828) WARNING: 0x02090	0x10001000	0x00001000	0x00000000	FAIL

The 2 writes didn't stick. Not context saved? Or something even more
peculiar?

(Look at all those repeated register writes, no wonder we ran out of
space.)
-Chris
Chris Wilson June 15, 2018, 7:51 a.m. UTC | #2
Quoting Chris Wilson (2018-06-15 08:16:01)
> Quoting Patchwork (2018-06-14 23:53:30)
> > == Series Details ==
> > 
> > Series: drm/i915: Enable provoking vertex fix on Gen9+ systems.
> > URL   : https://patchwork.freedesktop.org/series/44781/
> > State : failure
> > 
> > == Summary ==
> > 
> > = CI Bug Log - changes from CI_DRM_4322 -> Patchwork_9312 =
> > 
> > == Summary - FAILURE ==
> > 
> >   Serious unknown changes coming with Patchwork_9312 absolutely need to be
> >   verified manually.
> >   
> >   If you think the reported changes have nothing to do with the changes
> >   introduced in Patchwork_9312, please notify your bug team to allow them
> >   to document this new failure mode, which will reduce false positives in CI.
> > 
> >   External URL: https://patchwork.freedesktop.org/api/1.0/series/44781/revisions/1/mbox/
> > 
> > == Possible new issues ==
> > 
> >   Here are the unknown changes that may have been introduced in Patchwork_9312:
> > 
> >   === IGT changes ===
> > 
> >     ==== Possible regressions ====
> > 
> >     igt@gem_workarounds@basic-read:
> >       fi-skl-6260u:       PASS -> FAIL
> >       fi-cfl-s3:          PASS -> FAIL
> >       fi-skl-6700k2:      PASS -> FAIL
> >       fi-skl-6770hq:      PASS -> FAIL
> >       fi-kbl-7560u:       PASS -> FAIL
> >       fi-skl-6600u:       PASS -> FAIL
> >       fi-bxt-dsi:         PASS -> FAIL
> >       fi-kbl-guc:         PASS -> FAIL
> >       fi-kbl-7500u:       PASS -> FAIL
> >       fi-skl-6700hq:      PASS -> FAIL
> >       fi-bxt-j4205:       PASS -> FAIL
> >       fi-skl-gvtdvm:      PASS -> FAIL
> >       fi-cfl-guc:         PASS -> FAIL
> >       {fi-whl-u}:         PASS -> FAIL
> >       fi-cfl-8700k:       PASS -> FAIL
> >       fi-glk-j4005:       PASS -> FAIL
> >       fi-skl-guc:         PASS -> FAIL
> >       fi-kbl-7567u:       PASS -> FAIL
> >       fi-kbl-r:           PASS -> FAIL
> 
> (gem_workarounds:3828) DEBUG: Address   val             mask            read            result
> (gem_workarounds:3828) DEBUG: 0x07014   0x20002000      0x00002000      0x00002000      OK
> (gem_workarounds:3828) DEBUG: 0x0E194   0x01000100      0x00000100      0x00000114      OK
> (gem_workarounds:3828) DEBUG: 0x0E4F0   0x81008100      0x00008100      0xFFFF8120      OK
> (gem_workarounds:3828) DEBUG: 0x0E184   0x00200020      0x00000020      0x00000022      OK
> (gem_workarounds:3828) DEBUG: 0x0E194   0x00140014      0x00000014      0x00000114      OK
> (gem_workarounds:3828) DEBUG: 0x07004   0x00420042      0x00000042      0x000029C2      OK
> (gem_workarounds:3828) DEBUG: 0x0E188   0x00080000      0x00000008      0x00008030      OK
> (gem_workarounds:3828) DEBUG: 0x07300   0x80208020      0x00008020      0x00008830      OK
> (gem_workarounds:3828) DEBUG: 0x07300   0x00100010      0x00000010      0x00008830      OK
> (gem_workarounds:3828) DEBUG: 0x0E184   0x00020002      0x00000002      0x00000022      OK
> (gem_workarounds:3828) DEBUG: 0x0E180   0x20002000      0x00002000      0x00002000      OK
> (gem_workarounds:3828) DEBUG: 0x02580   0x00010000      0x00000001      0x00000004      OK
> (gem_workarounds:3828) DEBUG: 0x02580   0x00060004      0x00000006      0x00000004      OK
> (gem_workarounds:3828) WARNING: 0x02088 0x00020002      0x00000002      0x00000000      FAIL
> (gem_workarounds:3828) WARNING: 0x02090 0x10001000      0x00001000      0x00000000      FAIL
> 
> The 2 writes didn't stick. Not context saved? Or something even more
> peculiar?

More sinister. The LRI never expected so many registers!
-Chris
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 19defe73b156..8828780a1773 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1309,7 +1309,7 @@  struct i915_wa_reg {
 	u32 mask;
 };
 
-#define I915_MAX_WA_REGS 16
+#define I915_MAX_WA_REGS 17
 
 struct i915_workarounds {
 	struct i915_wa_reg reg[I915_MAX_WA_REGS];
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 140f6a27d696..35d8c2be85be 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2432,12 +2432,17 @@  enum i915_power_well_id {
 #define _3D_CHICKEN	_MMIO(0x2084)
 #define  _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB	(1 << 10)
 #define _3D_CHICKEN2	_MMIO(0x208c)
+
+#define FF_SLICE_CHICKEN	_MMIO(0x2088)
+#define  FF_SLICE_CHICKEN_CL_PROVOKING_VERTEX_FIX	(1 << 1)
+
 /* Disables pipelining of read flushes past the SF-WIZ interface.
  * Required on all Ironlake steppings according to the B-Spec, but the
  * particular danger of not doing so is not specified.
  */
 # define _3D_CHICKEN2_WM_READ_PIPELINED			(1 << 14)
 #define _3D_CHICKEN3	_MMIO(0x2090)
+#define  _3D_CHICKEN_SF_PROVOKING_VERTEX_FIX		(1 << 12)
 #define  _3D_CHICKEN_SF_DISABLE_OBJEND_CULL		(1 << 10)
 #define  _3D_CHICKEN3_AA_LINE_QUALITY_FIX_ENABLE	(1 << 5)
 #define  _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL		(1 << 5)
diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c
index 24b929ce3341..2dea23bfd5ea 100644
--- a/drivers/gpu/drm/i915/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/intel_workarounds.c
@@ -274,6 +274,12 @@  static int gen9_ctx_workarounds_init(struct drm_i915_private *dev_priv)
 	if (IS_GEN9_LP(dev_priv))
 		WA_SET_BIT_MASKED(GEN9_WM_CHICKEN3, GEN9_FACTOR_IN_CLR_VAL_HIZ);
 
+	/* BSpec: 11391 */
+	WA_SET_BIT_MASKED(FF_SLICE_CHICKEN,
+			  FF_SLICE_CHICKEN_CL_PROVOKING_VERTEX_FIX);
+	/* BSpec: 11299 */
+	WA_SET_BIT_MASKED(_3D_CHICKEN3, _3D_CHICKEN_SF_PROVOKING_VERTEX_FIX);
+
 	return 0;
 }