anv/gen9: Fix oob lookup of surface halign, valign
authorChad Versace <chad.versace@intel.com>
Tue, 5 Jan 2016 22:32:44 +0000 (14:32 -0800)
committerChad Versace <chad.versace@intel.com>
Wed, 6 Jan 2016 17:38:57 +0000 (09:38 -0800)
For 1D surfaces and for surfaces with Yf or Ys tiling, the hardware
ignores SurfaceVerticalAlignment and SurfaceHorizontalAlignment.
Moreover, the anv_halign[] and anv_valign[] lookup tables may not even
contain the surface's actual alignment values. So don't do the lookup
for those surfaces.

src/vulkan/gen8_state.c

index a24eb1924937b75bd5c3cba0c5358ff23e8b16a5..a2919a7c96112c868a9b9ab8449cd2098ece129d 100644 (file)
@@ -97,18 +97,28 @@ static void
 get_halign_valign(const struct isl_surf *surf, uint32_t *halign, uint32_t *valign)
 {
    #if ANV_GENx10 >= 90
-      /* In Skylake, RENDER_SUFFACE_STATE.SurfaceVerticalAlignment is in units
-       * of surface elements (not pixels nor samples). For compressed formats,
-       * a "surface element" is defined as a compression block.  For example,
-       * if SurfaceVerticalAlignment is VALIGN_4 and SurfaceFormat is an ETC2
-       * format (ETC2 has a block height of 4), then the vertical alignment is
-       * 4 compression blocks or, equivalently, 16 pixels.
-       */
-      struct isl_extent3d image_align_el
-         = isl_surf_get_image_alignment_el(surf);
-
-      *halign = anv_halign[image_align_el.width];
-      *valign = anv_valign[image_align_el.height];
+      if (isl_tiling_is_std_y(surf->tiling) ||
+          surf->dim_layout == ISL_DIM_LAYOUT_GEN9_1D) {
+         /* The hardware ignores the alignment values. Anyway, the surface's
+          * true alignment is likely outside the enum range of HALIGN* and
+          * VALIGN*.
+          */
+         *halign = 0;
+         *valign = 0;
+      } else {
+         /* In Skylake, RENDER_SUFFACE_STATE.SurfaceVerticalAlignment is in units
+          * of surface elements (not pixels nor samples). For compressed formats,
+          * a "surface element" is defined as a compression block.  For example,
+          * if SurfaceVerticalAlignment is VALIGN_4 and SurfaceFormat is an ETC2
+          * format (ETC2 has a block height of 4), then the vertical alignment is
+          * 4 compression blocks or, equivalently, 16 pixels.
+          */
+         struct isl_extent3d image_align_el
+            = isl_surf_get_image_alignment_el(surf);
+
+         *halign = anv_halign[image_align_el.width];
+         *valign = anv_valign[image_align_el.height];
+      }
    #else
       /* Pre-Skylake, RENDER_SUFFACE_STATE.SurfaceVerticalAlignment is in
        * units of surface samples.  For example, if SurfaceVerticalAlignment