<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, May 3, 2017 at 2:22 AM, Topi Pohjolainen <span dir="ltr"><<a href="mailto:topi.pohjolainen@gmail.com" target="_blank">topi.pohjolainen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Topi Pohjolainen <<a href="mailto:topi.pohjolainen@intel.com">topi.pohjolainen@intel.com</a>><br>
---<br>
 src/intel/blorp/blorp_blit.c      |  2 +-<br>
 src/intel/isl/isl.c               | 29 +++++++++++++++++++++---<br>
 src/intel/isl/isl.h               | 14 ++++++++++--<br>
 src/intel/isl/isl_gen6.c          | 46 ++++++++++++++++++++++++++++++<wbr>+++++++++<br>
 src/intel/isl/isl_storage_<wbr>image.c |  3 ++-<br>
 5 files changed, 87 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c<br>
index 8e3fc31..ca42600 100644<br>
--- a/src/intel/blorp/blorp_blit.c<br>
+++ b/src/intel/blorp/blorp_blit.c<br>
@@ -1398,7 +1398,7 @@ surf_convert_to_single_slice(<wbr>const struct isl_device *isl_dev,<br>
       layer = info->view.base_array_layer;<br>
<br>
    uint32_t x_offset_sa, y_offset_sa;<br>
-   isl_surf_get_image_offset_sa(&<wbr>info->surf, info->view.base_level,<br>
+   isl_surf_get_image_offset_sa(<wbr>isl_dev, &info->surf, info->view.base_level,<br>
                                 layer, z, &x_offset_sa, &y_offset_sa);<br>
<br>
    uint32_t byte_offset;<br>
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c<br>
index f89f351..e06bb94 100644<br>
--- a/src/intel/isl/isl.c<br>
+++ b/src/intel/isl/isl.c<br>
@@ -1295,6 +1295,20 @@ isl_apply_surface_padding(<wbr>const struct isl_device *dev,<br>
    }<br>
 }<br>
<br>
+/* On Gen6 hardware doesn't support mipmapping for stencil (W-tiled) and<br>
+ * for HIZ. As workaround one places all slices back-to-back. Slices for<br>
+ * level zero are back-to-back, followed by slices to level one, etc. This<br>
+ * allows layered rendering once driver offsets the image to the first<br>
+ * slice of particular level.<br>
+ */<br>
+static bool<br>
+isl_surf_needs_back_to_back_<wbr>layout(const struct isl_device *dev,<br>
+                                   enum isl_tiling tiling)<br>
+{<br>
+   return ISL_DEV_GEN(dev) == 6 &&<br>
+          (tiling == ISL_TILING_W || tiling == ISL_TILING_HIZ);<br></blockquote><div><br></div><div>If we're going to have a new back-to-back layout, let's just make a new ISL_DIM_LAYOUT_GEN6_BACK_TO_ BACK layout.  One of the things ISL tries very hard to do is to make sure that the isl_surf contains 100% of the information required to understand the surface layout.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+}<br>
+<br>
 bool<br>
 isl_surf_init_s(const struct isl_device *dev,<br>
                 struct isl_surf *surf,<br>
@@ -1906,7 +1920,8 @@ get_image_offset_sa_gen9_1d(<wbr>const struct isl_surf *surf,<br>
  * @invariant logical_z_offset_px < logical depth of surface at level<br>
  */<br>
 void<br>
-isl_surf_get_image_offset_sa(<wbr>const struct isl_surf *surf,<br>
+isl_surf_get_image_offset_sa(<wbr>const struct isl_device *dev,<br>
+                             const struct isl_surf *surf,<br>
                              uint32_t level,<br>
                              uint32_t logical_array_layer,<br>
                              uint32_t logical_z_offset_px,<br>
@@ -1918,6 +1933,13 @@ isl_surf_get_image_offset_sa(<wbr>const struct isl_surf *surf,<br>
    assert(logical_z_offset_px<br>
           < isl_minify(surf->logical_<wbr>level0_px.depth, level));<br>
<br>
+   if (isl_surf_needs_back_to_back_<wbr>layout(dev, surf->tiling)) {<br>
+      get_image_offset_sa_gen6_back_<wbr>to_back(surf, level, logical_array_layer,<br>
+                                            logical_z_offset_px,<br>
+                                            x_offset_sa, y_offset_sa);<br>
+      return;<br>
+   }<br>
+<br>
    switch (surf->dim_layout) {<br>
    case ISL_DIM_LAYOUT_GEN9_1D:<br>
       get_image_offset_sa_gen9_1d(<wbr>surf, level, logical_array_layer,<br>
@@ -1939,7 +1961,8 @@ isl_surf_get_image_offset_sa(<wbr>const struct isl_surf *surf,<br>
 }<br>
<br>
 void<br>
-isl_surf_get_image_offset_el(<wbr>const struct isl_surf *surf,<br>
+isl_surf_get_image_offset_el(<wbr>const struct isl_device *dev,<br>
+                             const struct isl_surf *surf,<br>
                              uint32_t level,<br>
                              uint32_t logical_array_layer,<br>
                              uint32_t logical_z_offset_px,<br>
@@ -1954,7 +1977,7 @@ isl_surf_get_image_offset_el(<wbr>const struct isl_surf *surf,<br>
           < isl_minify(surf->logical_<wbr>level0_px.depth, level));<br>
<br>
    uint32_t x_offset_sa, y_offset_sa;<br>
-   isl_surf_get_image_offset_sa(<wbr>surf, level,<br>
+   isl_surf_get_image_offset_sa(<wbr>dev, surf, level,<br>
                                 logical_array_layer,<br>
                                 logical_z_offset_px,<br>
                                 &x_offset_sa,<br>
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h<br>
index 7778551..3685ddf 100644<br>
--- a/src/intel/isl/isl.h<br>
+++ b/src/intel/isl/isl.h<br>
@@ -1484,6 +1484,14 @@ isl_surf_get_array_pitch(const struct isl_surf *surf)<br>
    return isl_surf_get_array_pitch_sa_<wbr>rows(surf) * surf->row_pitch;<br>
 }<br>
<br>
+void<br>
+get_image_offset_sa_gen6_<wbr>back_to_back(const struct isl_surf *surf,<br>
+                                      uint32_t level,<br>
+                                      uint32_t logical_array_layer,<br>
+                                      uint32_t logical_z_offset_px,<br>
+                                      uint32_t *x_offset_sa,<br>
+                                      uint32_t *y_offset_sa);<br>
+<br>
 /**<br>
  * Calculate the offset, in units of surface samples, to a subimage in the<br>
  * surface.<br>
@@ -1493,7 +1501,8 @@ isl_surf_get_array_pitch(const struct isl_surf *surf)<br>
  * @invariant logical_z_offset_px < logical depth of surface at level<br>
  */<br>
 void<br>
-isl_surf_get_image_offset_sa(<wbr>const struct isl_surf *surf,<br>
+isl_surf_get_image_offset_sa(<wbr>const struct isl_device *dev,<br>
+                             const struct isl_surf *surf,<br>
                              uint32_t level,<br>
                              uint32_t logical_array_layer,<br>
                              uint32_t logical_z_offset_px,<br>
@@ -1509,7 +1518,8 @@ isl_surf_get_image_offset_sa(<wbr>const struct isl_surf *surf,<br>
  * @invariant logical_z_offset_px < logical depth of surface at level<br>
  */<br>
 void<br>
-isl_surf_get_image_offset_el(<wbr>const struct isl_surf *surf,<br>
+isl_surf_get_image_offset_el(<wbr>const struct isl_device *dev,<br>
+                             const struct isl_surf *surf,<br>
                              uint32_t level,<br>
                              uint32_t logical_array_layer,<br>
                              uint32_t logical_z_offset_px,<br>
diff --git a/src/intel/isl/isl_gen6.c b/src/intel/isl/isl_gen6.c<br>
index b746903..8bd5dbc 100644<br>
--- a/src/intel/isl/isl_gen6.c<br>
+++ b/src/intel/isl/isl_gen6.c<br>
@@ -145,3 +145,49 @@ isl_gen6_choose_image_<wbr>alignment_el(const struct isl_device *dev,<br>
<br>
    *image_align_el = isl_extent3d(4, 2, 1);<br>
 }<br>
+<br>
+void<br>
+get_image_offset_sa_gen6_<wbr>back_to_back(const struct isl_surf *surf,<br>
+                                      uint32_t level,<br>
+                                      uint32_t logical_array_layer,<br>
+                                      uint32_t logical_z_offset_px,<br>
+                                      uint32_t *x_offset_sa,<br>
+                                      uint32_t *y_offset_sa)<br>
+{<br>
+   assert(level < surf->levels);<br>
+<br>
+   const struct isl_extent3d image_align_sa =<br>
+      isl_surf_get_image_alignment_<wbr>sa(surf);<br>
+<br>
+   assert(surf->tiling == ISL_TILING_W ||<br>
+          surf->tiling == ISL_TILING_HIZ);<br>
+   const uint32_t tile_align_h = surf->tiling == ISL_TILING_W ? 64 : 32;<br>
+<br>
+   uint32_t y = 0;<br>
+   for (unsigned i = 0; i < level; ++i) {<br>
+      const unsigned d = surf->dim_layout == ISL_DIM_LAYOUT_GEN4_3D ?<br>
+                         isl_minify(surf->phys_level0_<wbr>sa.depth, i) :<br>
+                         surf->phys_level0_sa.array_<wbr>len;<br>
+      const unsigned h = isl_minify(surf->phys_level0_<wbr>sa.height, i);<br>
+      y += d * isl_align_npot(h, image_align_sa.h);<br>
+<br>
+      /* Align on tile boundary so that driver can offset without intra-tile<br>
+       * offsets.<br>
+       */<br>
+      y = isl_align(y, tile_align_h);<br>
+   }<br>
+<br>
+   const unsigned level_h = isl_minify(surf->phys_level0_<wbr>sa.height, level);<br>
+   const unsigned aligned_level_h = isl_align_npot(level_h, image_align_sa.h);<br>
+<br>
+   if (surf->dim_layout == ISL_DIM_LAYOUT_GEN4_3D) {<br>
+      assert(logical_z_offset_px < surf->logical_level0_px.depth)<wbr>;<br>
+      y += logical_z_offset_px * aligned_level_h;<br>
+   } else {<br>
+      assert(logical_array_layer < surf->logical_level0_px.array_<wbr>len);<br>
+      y += logical_array_layer * aligned_level_h;<br>
+   }<br>
+<br>
+   *x_offset_sa = 0;<br>
+   *y_offset_sa = y;<br>
+}<br>
diff --git a/src/intel/isl/isl_storage_<wbr>image.c b/src/intel/isl/isl_storage_<wbr>image.c<br>
index 4c56e78..9aeeede 100644<br>
--- a/src/intel/isl/isl_storage_<wbr>image.c<br>
+++ b/src/intel/isl/isl_storage_<wbr>image.c<br>
@@ -226,7 +226,8 @@ isl_surf_fill_image_param(<wbr>const struct isl_device *dev,<br>
                        view->base_array_layer;<br>
    }<br>
<br>
-   isl_surf_get_image_offset_el(<wbr>surf, view->base_level, view->base_array_layer,<br>
+   isl_surf_get_image_offset_el(<wbr>dev, surf,<br>
+                                view->base_level, view->base_array_layer,<br>
                                 0, &param->offset[0],  &param->offset[1]);<br>
<br>
    const int cpp = isl_format_get_layout(surf-><wbr>format)->bpb / 8;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.9.3<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>