[Mesa-dev] [PATCH] i965: Disable guardband clipping on SNB unless workaround is present.
Daniel Vetter
daniel at ffwll.ch
Sun Oct 7 14:40:00 PDT 2012
On Fri, Oct 05, 2012 at 05:08:04PM -0700, Kenneth Graunke wrote:
> According to internal bug reports, guardband clipping sometimes
> incorrectly discards triangles unless bit 5 of 3D_CHICKEN3 ("SF Disable
> fastclip optimization when culled") is set.
>
> Experimentally, this appears to be true. With guardband clipping
> enabled, Dante randomly loses triangles unless bit 5 is set.
>
> The BSpec indicates that the default value of the register is supposed
> to be 0x20 (just bit 5), but on my Lenovo X220 it appears to be 0.
>
> Daniel attempted to implement the workaround via a kernel patch named
> drm/i915: implement w/a for incorrect guarband clipping
> but unfortunately, the write isn't taking effect for some reason.
>
> Fixes clipping issues in Dante.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=53946
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55523
> Cc: Oliver McFadden <oliver.mcfadden at linux.intel.com>
> Cc: nkalkhof at web.de
> Cc: Eric Anholt <eric at anholt.net>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Does this really work as advertised?
The reg_read_ioctl is brand-new, only merged into 3.7. And it has a
whitelist of registers that userspace is allowed to read, and CHICKEN_3 is
not on it.
-Daniel
> ---
> src/mesa/drivers/dri/i965/brw_context.c | 11 +++++++++++
> src/mesa/drivers/dri/i965/brw_context.h | 1 +
> src/mesa/drivers/dri/i965/gen6_clip_state.c | 2 +-
> src/mesa/drivers/dri/intel/intel_reg.h | 3 +++
> 4 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index e94df26..d73aafd 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -43,6 +43,7 @@
>
> #include "intel_fbo.h"
> #include "intel_mipmap_tree.h"
> +#include "intel_reg.h"
> #include "intel_regions.h"
> #include "intel_span.h"
> #include "intel_tex.h"
> @@ -355,6 +356,16 @@ brwCreateContext(int api,
> brw->needs_unlit_centroid_workaround = true;
> }
>
> + if (intel->gen == 6) {
> + /* On Sandybridge, guardband clipping causes random triangles to be
> + * discarded unless bit 5 of 3D_CHICKEN3 is set.
> + */
> + uint64_t chicken;
> + brw->has_working_guardband =
> + drm_intel_reg_read(intel->bufmgr, _3D_CHICKEN3, &chicken) == 0 &&
> + (chicken & _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL);
> + }
> +
> brw->prim_restart.in_progress = false;
> brw->prim_restart.enable_cut_index = false;
> intel->hw_ctx = drm_intel_gem_context_create(intel->bufmgr);
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 3dac633..2e74949 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -750,6 +750,7 @@ struct brw_context
> bool has_surface_tile_offset;
> bool has_compr4;
> bool has_negative_rhw_bug;
> + bool has_working_guardband;
> bool has_aa_line_parameters;
> bool has_pln;
> bool precompile;
> diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c b/src/mesa/drivers/dri/i965/gen6_clip_state.c
> index c34d87e..294d7a9 100644
> --- a/src/mesa/drivers/dri/i965/gen6_clip_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c
> @@ -74,7 +74,7 @@ upload_clip_state(struct brw_context *brw)
> GEN6_CLIP_MODE_NORMAL |
> nonperspective_barycentric_enable_flag |
> GEN6_CLIP_XY_TEST |
> - GEN6_CLIP_GB_TEST |
> + (brw->has_working_guardband ? GEN6_CLIP_GB_TEST : 0) |
> userclip << GEN6_USER_CLIP_CLIP_DISTANCES_SHIFT |
> depth_clamp |
> provoking);
> diff --git a/src/mesa/drivers/dri/intel/intel_reg.h b/src/mesa/drivers/dri/intel/intel_reg.h
> index 53b1cb9..737e811 100644
> --- a/src/mesa/drivers/dri/intel/intel_reg.h
> +++ b/src/mesa/drivers/dri/intel/intel_reg.h
> @@ -264,6 +264,9 @@
> #define FENCE_XMAJOR 1
> #define FENCE_YMAJOR 2
>
> +#define _3D_CHICKEN3 0x2090
> +#define _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL (1 << 5)
> +
> #define SO_NUM_PRIM_STORAGE_NEEDED 0x2280
> #define SO_PRIM_STORAGE_NEEDED0_IVB 0x5240
> #define SO_PRIM_STORAGE_NEEDED1_IVB 0x5248
> --
> 1.7.11.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the mesa-dev
mailing list