[Mesa-dev] [PATCH 01/15] i965: Prepare blit engine for isl based miptrees

Topi Pohjolainen topi.pohjolainen at gmail.com
Tue Jun 13 19:10:52 UTC 2017


Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
 src/mesa/drivers/dri/i965/intel_blit.c | 62 ++++++++++++++++++++++++++--------
 1 file changed, 48 insertions(+), 14 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_blit.c b/src/mesa/drivers/dri/i965/intel_blit.c
index e79e02a075..456c5e56bc 100644
--- a/src/mesa/drivers/dri/i965/intel_blit.c
+++ b/src/mesa/drivers/dri/i965/intel_blit.c
@@ -131,6 +131,10 @@ set_blitter_tiling(struct brw_context *brw,
 static int
 blt_pitch(struct intel_mipmap_tree *mt)
 {
+   if (mt->surf.size > 0)
+      return (mt->surf.tiling != ISL_TILING_LINEAR) ?
+             mt->surf.row_pitch / 4 : mt->surf.row_pitch;
+
    int pitch = mt->pitch;
    if (mt->tiling)
       pitch /= 4;
@@ -171,8 +175,21 @@ get_blit_intratile_offset_el(const struct brw_context *brw,
                              uint32_t *x_offset_el,
                              uint32_t *y_offset_el)
 {
-   enum isl_tiling tiling = intel_miptree_get_isl_tiling(mt);
-   isl_tiling_get_intratile_offset_el(tiling, mt->cpp * 8, mt->pitch,
+   unsigned cpp;
+   unsigned pitch;
+   enum isl_tiling tiling;
+
+   if (mt->surf.size > 0) {
+      cpp = isl_format_get_layout(mt->surf.format)->bpb / 8;
+      pitch = mt->surf.row_pitch;
+      tiling = mt->surf.tiling;
+   } else {
+      cpp = mt->cpp;
+      pitch = mt->pitch;
+      tiling = intel_miptree_get_isl_tiling(mt);
+   }
+
+   isl_tiling_get_intratile_offset_el(tiling, cpp * 8, pitch,
                                       total_x_offset_el, total_y_offset_el,
                                       base_address_offset,
                                       x_offset_el, y_offset_el);
@@ -187,11 +204,11 @@ get_blit_intratile_offset_el(const struct brw_context *brw,
        * The offsets we get from ISL in the tiled case are already aligned.
        * In the linear case, we need to do some of our own aligning.
        */
-      assert(mt->pitch % 64 == 0);
+      assert(pitch % 64 == 0);
       uint32_t delta = *base_address_offset & 63;
-      assert(delta % mt->cpp == 0);
+      assert(delta % cpp == 0);
       *base_address_offset -= delta;
-      *x_offset_el += delta / mt->cpp;
+      *x_offset_el += delta / cpp;
    } else {
       assert(*base_address_offset % 4096 == 0);
    }
@@ -206,6 +223,17 @@ emit_miptree_blit(struct brw_context *brw,
                   uint32_t width, uint32_t height,
                   bool reverse, GLenum logicop)
 {
+   const unsigned src_cpp = src_mt->surf.size > 0 ?
+      isl_format_get_layout(src_mt->surf.format)->bpb / 8 : src_mt->cpp;
+   const unsigned src_pitch =
+      src_mt->surf.size > 0 ? src_mt->surf.row_pitch : src_mt->pitch;
+   const unsigned dst_pitch =
+      dst_mt->surf.size > 0 ? dst_mt->surf.row_pitch : dst_mt->pitch;
+   const unsigned src_tiling = src_mt->surf.size > 0 ?
+      isl_tiling_to_bufmgr_tiling(src_mt->surf.tiling) : src_mt->tiling;
+   const unsigned dst_tiling = dst_mt->surf.size > 0 ?
+      isl_tiling_to_bufmgr_tiling(dst_mt->surf.tiling) : dst_mt->tiling;
+
    /* According to the Ivy Bridge PRM, Vol1 Part4, section 1.2.1.2 (Graphics
     * Data Size Limitations):
     *
@@ -250,13 +278,13 @@ emit_miptree_blit(struct brw_context *brw,
                                       &dst_offset, &dst_tile_x, &dst_tile_y);
 
          if (!intelEmitCopyBlit(brw,
-                                src_mt->cpp,
-                                reverse ? -src_mt->pitch : src_mt->pitch,
+                                src_cpp,
+                                reverse ? -src_pitch : src_pitch,
                                 src_mt->bo, src_mt->offset + src_offset,
-                                src_mt->tiling,
-                                dst_mt->pitch,
+                                src_tiling,
+                                dst_pitch,
                                 dst_mt->bo, dst_mt->offset + dst_offset,
-                                dst_mt->tiling,
+                                dst_tiling,
                                 src_tile_x, src_tile_y,
                                 dst_tile_x, dst_tile_y,
                                 chunk_w, chunk_h,
@@ -327,11 +355,17 @@ intel_miptree_blit(struct brw_context *brw,
    intel_miptree_access_raw(brw, src_mt, src_level, src_slice, false);
    intel_miptree_access_raw(brw, dst_mt, dst_level, dst_slice, true);
 
-   if (src_flip)
-      src_y = minify(src_mt->physical_height0, src_level - src_mt->first_level) - src_y - height;
+   if (src_flip) {
+      const unsigned h0 = src_mt->surf.size > 0 ?
+         src_mt->surf.phys_level0_sa.height : src_mt->physical_height0;
+      src_y = minify(h0, src_level - src_mt->first_level) - src_y - height;
+   }
 
-   if (dst_flip)
-      dst_y = minify(dst_mt->physical_height0, dst_level - dst_mt->first_level) - dst_y - height;
+   if (dst_flip) {
+      const unsigned h0 = dst_mt->surf.size > 0 ?
+         dst_mt->surf.phys_level0_sa.height : dst_mt->physical_height0;
+      dst_y = minify(h0, dst_level - dst_mt->first_level) - dst_y - height;
+   }
 
    uint32_t src_image_x, src_image_y, dst_image_x, dst_image_y;
    intel_miptree_get_image_offset(src_mt, src_level, src_slice,
-- 
2.11.0



More information about the mesa-dev mailing list