intel/isl: Divide QPitch by 2 for 3-D stencil textures on SKL+
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 8 Sep 2016 17:26:15 +0000 (10:26 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 13 Sep 2016 19:40:12 +0000 (12:40 -0700)
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Chad Versace <chadversary@chromium.org>
src/intel/isl/isl_surface_state.c

index cd7a0845c7874e484bf4fd7cf214a26f69b46322..f22bf361fb63fb42db4bb6557b3476ac3d31e3f1 100644 (file)
@@ -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
           *