From c0b9776cd607d059367b407b18d5c3c2c264099b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 8 Sep 2016 10:26:15 -0700 Subject: [PATCH] intel/isl: Divide QPitch by 2 for 3-D stencil textures on SKL+ Signed-off-by: Jason Ekstrand Reviewed-by: Chad Versace --- src/intel/isl/isl_surface_state.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/intel/isl/isl_surface_state.c b/src/intel/isl/isl_surface_state.c index cd7a084..f22bf36 100644 --- a/src/intel/isl/isl_surface_state.c +++ b/src/intel/isl/isl_surface_state.c @@ -173,7 +173,20 @@ get_qpitch(const struct isl_surf *surf) unreachable("Bad isl_surf_dim"); case ISL_DIM_LAYOUT_GEN4_2D: if (GEN_GEN >= 9) { - return isl_surf_get_array_pitch_el_rows(surf); + if (surf->dim == ISL_SURF_DIM_3D && surf->tiling == ISL_TILING_W) { + /* This is rather annoying and completely undocumented. It + * appears that the hardware has a bug (or undocumented feature) + * regarding stencil buffers most likely related to the way + * W-tiling is handled as modified Y-tiling. If you bind a 3-D + * stencil buffer normally, and use texelFetch on it, the z or + * array index will get implicitly multiplied by 2 for no obvious + * reason. The fix appears to be to divide qpitch by 2 for + * W-tiled surfaces. + */ + return isl_surf_get_array_pitch_el_rows(surf) / 2; + } else { + return isl_surf_get_array_pitch_el_rows(surf); + } } else { /* From the Broadwell PRM for RENDER_SURFACE_STATE.QPitch * -- 2.7.4