intel/blorp: Support blits and clears on surfaces with offsets
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 25 May 2018 19:27:17 +0000 (12:27 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 25 May 2018 21:01:44 +0000 (14:01 -0700)
For certain EGLImage cases, we represent a single slice or LOD of an
image with a byte offset to a tile and X/Y intratile offsets to the
given slice.  Most of i965 is fine with this but it breaks blorp.  This
is a terrible way to represent slices of a surface in EGL and we should
stop some day but that's a very scary and thorny path.  This gets blorp
to start working with those surfaces and fixes some dEQP EGL test bugs.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106629
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/blorp/blorp.c
src/intel/blorp/blorp.h
src/intel/blorp/blorp_blit.c
src/intel/blorp/blorp_clear.c
src/mesa/drivers/dri/i965/brw_blorp.c

index e348cafb2e5f64075d3429ff9a43f174c20aa70c..73f8c67802ee0c44f94ae14f2abb6c34638270e3 100644 (file)
@@ -137,6 +137,28 @@ brw_blorp_surface_info_init(struct blorp_context *blorp,
     */
    if (is_render_target && blorp->isl_dev->info->gen <= 6)
       info->view.array_len = MIN2(info->view.array_len, 512);
+
+   if (surf->tile_x_sa || surf->tile_y_sa) {
+      /* This is only allowed on simple 2D surfaces without MSAA */
+      assert(info->surf.dim == ISL_SURF_DIM_2D);
+      assert(info->surf.samples == 1);
+      assert(info->surf.levels == 1);
+      assert(info->surf.logical_level0_px.array_len == 1);
+      assert(info->aux_usage == ISL_AUX_USAGE_NONE);
+
+      info->tile_x_sa = surf->tile_x_sa;
+      info->tile_y_sa = surf->tile_y_sa;
+
+      /* Instead of using the X/Y Offset fields in RENDER_SURFACE_STATE, we
+       * place the image at the tile boundary and offset our sampling or
+       * rendering.  For this reason, we need to grow the image by the offset
+       * to ensure that the hardware doesn't think we've gone past the edge.
+       */
+      info->surf.logical_level0_px.w += surf->tile_x_sa;
+      info->surf.logical_level0_px.h += surf->tile_y_sa;
+      info->surf.phys_level0_sa.w += surf->tile_x_sa;
+      info->surf.phys_level0_sa.h += surf->tile_y_sa;
+   }
 }
 
 
index f22110bc8401b71915ea3f47f9425d92a8d91781..0a10ff91576acae28dcdf51a49a4943cf515d5cc 100644 (file)
@@ -114,6 +114,9 @@ struct blorp_surf
     * that it contains a swizzle of RGBA and resource min LOD of 0.
     */
    struct blorp_address clear_color_addr;
+
+   /* Only allowed for simple 2D non-MSAA surfaces */
+   uint32_t tile_x_sa, tile_y_sa;
 };
 
 void
index 26bf4426c0b8bd2076d3deed3f20c930ac69244f..c3a093c400b6b42e606afa5a3e52ce6029e1fb56 100644 (file)
@@ -2507,7 +2507,9 @@ blorp_copy(struct blorp_batch *batch,
                                dst_layer, ISL_FORMAT_UNSUPPORTED, true);
 
    struct brw_blorp_blit_prog_key wm_prog_key = {
-      .shader_type = BLORP_SHADER_TYPE_BLIT
+      .shader_type = BLORP_SHADER_TYPE_BLIT,
+      .need_src_offset = src_surf->tile_x_sa || src_surf->tile_y_sa,
+      .need_dst_offset = dst_surf->tile_x_sa || dst_surf->tile_y_sa,
    };
 
    const struct isl_format_layout *src_fmtl =
index 832e8ee26f9db6c5c9a19724d85818248b9dcf3b..4d3125aade8d00ae31d1f39eefaf3f3b5e7fb03d 100644 (file)
@@ -438,6 +438,15 @@ blorp_clear(struct blorp_batch *batch,
       params.x1 = x1;
       params.y1 = y1;
 
+      if (params.dst.tile_x_sa || params.dst.tile_y_sa) {
+         assert(params.dst.surf.samples == 1);
+         assert(num_layers == 1);
+         params.x0 += params.dst.tile_x_sa;
+         params.y0 += params.dst.tile_y_sa;
+         params.x1 += params.dst.tile_x_sa;
+         params.y1 += params.dst.tile_y_sa;
+      }
+
       /* The MinLOD and MinimumArrayElement don't work properly for cube maps.
        * Convert them to a single slice on gen4.
        */
index d7a2cb25c6777b245076c76de298020287b01d8b..8c6d77e1b7d4b417deb58af484ef803ff57d5ae3 100644 (file)
@@ -152,6 +152,8 @@ blorp_surf_for_miptree(struct brw_context *brw,
          .mocs = brw_get_bo_mocs(devinfo, mt->bo),
       },
       .aux_usage = aux_usage,
+      .tile_x_sa = mt->level[*level].level_x,
+      .tile_y_sa = mt->level[*level].level_y,
    };
 
    if (mt->format == MESA_FORMAT_S_UINT8 && is_render_target &&