[Mesa-dev] [PATCH v2 11/27] i965/blorp: Do gen6 stencil offsets up-front

Pohjolainen, Topi topi.pohjolainen at intel.com
Fri Jul 29 07:35:20 UTC 2016


On Tue, Jul 26, 2016 at 03:11:15PM -0700, Jason Ekstrand wrote:
> This keeps all of the nastyness of gen6 stencil on the i965 side of the API
> line and lets us delete that nasty hand-rolled ISL-based offset path that
> we were using for ALL_SLICES_AT_EACH_LOD.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

> ---
>  src/mesa/drivers/dri/i965/brw_blorp.c        | 108 ++++++++-------------------
>  src/mesa/drivers/dri/i965/brw_blorp.h        |   6 --
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   6 +-
>  3 files changed, 34 insertions(+), 86 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c
> index 47801f0..094299f 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> @@ -32,79 +32,6 @@
>  
>  #define FILE_DEBUG_FLAG DEBUG_BLORP
>  
> -/**
> - * A variant of isl_surf_get_image_offset_sa() specific to gen6 stencil and
> - * HiZ surfaces.
> - */
> -static void
> -get_image_offset_sa_gen6_stencil(const struct isl_surf *surf,
> -                                 uint32_t level, uint32_t logical_array_layer,
> -                                 uint32_t *x_offset_sa,
> -                                 uint32_t *y_offset_sa)
> -{
> -   assert(surf->tiling == ISL_TILING_W || surf->format == ISL_FORMAT_HIZ);
> -   assert(level < surf->levels);
> -   assert(logical_array_layer < surf->logical_level0_px.array_len);
> -
> -   const struct isl_extent3d image_align_sa =
> -      isl_surf_get_image_alignment_sa(surf);
> -
> -   const uint32_t W0 = surf->phys_level0_sa.width;
> -   const uint32_t H0 = surf->phys_level0_sa.height;
> -
> -   uint32_t x = 0, y = 0;
> -   for (uint32_t l = 0; l < level; ++l) {
> -      if (l == 1) {
> -         uint32_t W = minify(W0, l);
> -
> -         if (surf->samples > 1) {
> -            assert(surf->msaa_layout == ISL_MSAA_LAYOUT_INTERLEAVED);
> -            assert(surf->samples == 4);
> -            W = ALIGN(W, 2) * 2;
> -         }
> -
> -         x += ALIGN(W, image_align_sa.w);
> -      } else {
> -         uint32_t H = minify(H0, l);
> -
> -         if (surf->samples > 1) {
> -            assert(surf->msaa_layout == ISL_MSAA_LAYOUT_INTERLEAVED);
> -            assert(surf->samples == 4);
> -            H = ALIGN(H, 2) * 2;
> -         }
> -
> -         y += ALIGN(H, image_align_sa.h) * surf->logical_level0_px.array_len;
> -      }
> -   }
> -
> -   /* Now account for our location within the given LOD */
> -   uint32_t Hl = minify(H0, level);
> -   if (surf->samples > 1) {
> -      assert(surf->msaa_layout == ISL_MSAA_LAYOUT_INTERLEAVED);
> -      assert(surf->samples == 4);
> -      Hl = ALIGN(Hl, 2) * 2;
> -   }
> -   y += ALIGN(Hl, image_align_sa.h) * logical_array_layer;
> -
> -   *x_offset_sa = x;
> -   *y_offset_sa = y;
> -}
> -
> -void
> -blorp_get_image_offset_sa(struct isl_device *dev, const struct isl_surf *surf,
> -                          uint32_t level, uint32_t layer,
> -                          uint32_t *x_offset_sa,
> -                          uint32_t *y_offset_sa)
> -{
> -   if (ISL_DEV_GEN(dev) == 6 && surf->tiling == ISL_TILING_W) {
> -      get_image_offset_sa_gen6_stencil(surf, level, layer,
> -                                       x_offset_sa, y_offset_sa);
> -   } else {
> -      isl_surf_get_image_offset_sa(surf, level, layer, 0,
> -                                   x_offset_sa, y_offset_sa);
> -   }
> -}
> -
>  static void
>  apply_gen6_stencil_hiz_offset(struct isl_surf *surf,
>                                struct intel_mipmap_tree *mt,
> @@ -113,10 +40,19 @@ apply_gen6_stencil_hiz_offset(struct isl_surf *surf,
>  {
>     assert(mt->array_layout == ALL_SLICES_AT_EACH_LOD);
>  
> -   *offset = intel_miptree_get_aligned_offset(mt,
> -                                              mt->level[lod].level_x,
> -                                              mt->level[lod].level_y,
> -                                              false);
> +   if (mt->format == MESA_FORMAT_S_UINT8) {
> +      /* Note: we can't compute the stencil offset using
> +       * intel_miptree_get_aligned_offset(), because the miptree
> +       * claims that the region is untiled even though it's W tiled.
> +       */
> +      *offset = mt->level[lod].level_y * mt->pitch +
> +                mt->level[lod].level_x * 64;
> +   } else {
> +      *offset = intel_miptree_get_aligned_offset(mt,
> +                                                 mt->level[lod].level_x,
> +                                                 mt->level[lod].level_y,
> +                                                 false);
> +   }
>  
>     surf->logical_level0_px.width = minify(surf->logical_level0_px.width, lod);
>     surf->logical_level0_px.height = minify(surf->logical_level0_px.height, lod);
> @@ -154,6 +90,24 @@ brw_blorp_surface_info_init(struct brw_context *brw,
>     info->bo = mt->bo;
>     info->offset = mt->offset;
>  
> +   if (brw->gen == 6 && mt->format == MESA_FORMAT_S_UINT8 &&
> +       mt->array_layout == ALL_SLICES_AT_EACH_LOD) {
> +      /* Sandy bridge stencil and HiZ use this ALL_SLICES_AT_EACH_LOD hack in
> +       * order to allow for layered rendering.  The hack makes each LOD of the
> +       * stencil or HiZ buffer a single tightly packed array surface at some
> +       * offset into the surface.  Since ISL doesn't know how to deal with the
> +       * crazy ALL_SLICES_AT_EACH_LOD layout and since we have to do a manual
> +       * offset of it anyway, we might as well do the offset here and keep the
> +       * hacks inside the i965 driver.
> +       *
> +       * See also gen6_depth_stencil_state.c
> +       */
> +      uint32_t offset;
> +      apply_gen6_stencil_hiz_offset(&info->surf, mt, level, &offset);
> +      info->offset += offset;
> +      level = 0;
> +   }
> +
>     intel_miptree_get_aux_isl_surf(brw, mt, &info->aux_surf,
>                                    &info->aux_usage);
>     if (info->aux_usage != ISL_AUX_USAGE_NONE) {
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h b/src/mesa/drivers/dri/i965/brw_blorp.h
> index 95a6257..d369798 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.h
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.h
> @@ -325,12 +325,6 @@ brw_blorp_compile_nir_shader(struct brw_context *brw, struct nir_shader *nir,
>                               struct brw_blorp_prog_data *prog_data,
>                               unsigned *program_size);
>  
> -void
> -blorp_get_image_offset_sa(struct isl_device *dev, const struct isl_surf *surf,
> -                          uint32_t level, uint32_t layer,
> -                          uint32_t *x_offset_sa,
> -                          uint32_t *y_offset_sa);
> -
>  uint32_t
>  brw_blorp_emit_surface_state(struct brw_context *brw,
>                               const struct brw_blorp_surface_info *surface,
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index ee34a70..af75cfa 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -1600,9 +1600,9 @@ surf_convert_to_single_slice(struct brw_context *brw,
>        return;
>  
>     uint32_t x_offset_sa, y_offset_sa;
> -   blorp_get_image_offset_sa(&brw->isl_dev, &info->surf, info->view.base_level,
> -                             info->view.base_array_layer,
> -                             &x_offset_sa, &y_offset_sa);
> +   isl_surf_get_image_offset_sa(&info->surf, info->view.base_level,
> +                                info->view.base_array_layer, 0,
> +                                &x_offset_sa, &y_offset_sa);
>  
>     uint32_t byte_offset;
>     isl_tiling_get_intratile_offset_sa(&brw->isl_dev, info->surf.tiling,
> -- 
> 2.5.0.400.gff86faf
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list