intel/isl: Divide QPitch by 2 for 3-D stencil textures on SKL+

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:
Jason Ekstrand 2016-09-08 10:26:15 -07:00
parent 00e79cec99
commit c0b9776cd6
1 changed files with 14 additions and 1 deletions

View 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
*