[Mesa-dev] [PATCH 13/27] i965/gen6: Calculate hiz offset on demand

Jason Ekstrand jason at jlekstrand.net
Wed Feb 1 00:44:56 UTC 2017


On Mon, Jan 16, 2017 at 1:13 AM, Topi Pohjolainen <
topi.pohjolainen at gmail.com> wrote:

> This is kept on purpose in i965. It can be moved to ISL if it
> is needed in vulkan.
>
> Pointers to miptrees are given solely for verification purposes.
> These will be dropped in following patches.
>
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_tex_layout.c    | 44
> +++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/gen6_depth_state.c  | 18 ++++++++---
>  src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 11 +++++++
>  3 files changed, 69 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c
> b/src/mesa/drivers/dri/i965/brw_tex_layout.c
> index 80b341a..6f1c228 100644
> --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c
> +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c
> @@ -353,6 +353,50 @@ brw_stencil_all_slices_at_each_lod_offset(const
> struct isl_surf *surf,
>     return level_y * two_rows_interleaved_pitch + level_x * 64;
>  }
>
> +uint32_t
> +brw_get_mipmap_total_width(unsigned w0, unsigned num_levels, unsigned
> halign)
> +{
> +   /* If there is not level two, no adjustment is needed. */
> +   if (num_levels < 2)
> +      return ALIGN(w0, halign);
> +
> +   const uint32_t w1 = ALIGN(minify(w0, 1), halign);
> +   const uint32_t w2 = minify(w0, 2);
> +
> +   /* Levels one and two sit side-by-side below level zero. Due to
> alignment
> +    * of level one levels one and two may require more space than level
> zero.
> +    */
> +   return ALIGN(MAX2(w0, w1 + w2), halign);
> +}
> +
> +uint32_t
> +brw_hiz_all_slices_at_each_lod_offset(
> +   const struct isl_extent4d *phys_level0_sa,
> +   enum isl_surf_dim dim, unsigned num_levels,
> +   enum isl_format format,
> +   const struct intel_mipmap_tree *mt,
> +   unsigned level)
> +{
> +   assert(mt->array_layout == ALL_SLICES_AT_EACH_LOD);
> +
> +   const uint32_t cpp = isl_format_get_layout(format)->bpb / 8;
> +   const uint32_t halign = 128 / cpp;
> +   const uint32_t valign = 32;
>

I'm very sure that this calculation (using the cpp of the depth format) is
completely bogus.  However, given the asserts below, I would also easily
believe that it's exactly the same calculation as we've always done so
let's leave it for now.


> +   const uint32_t level_x = all_slices_at_each_lod_x_offset(
> +                               phys_level0_sa->width, halign, level);
> +   const uint32_t level_y = all_slices_at_each_lod_y_offset(
> +                               phys_level0_sa, dim, valign, level);
> +   const uint32_t pitch = brw_get_mipmap_total_width(
> +                             phys_level0_sa->width, num_levels, halign) *
> cpp;
> +
> +   assert(level_x == mt->level[level].level_x);
> +   assert(level_y == mt->level[level].level_y);
> +   assert(pitch == mt->pitch);
> +   assert(cpp == mt->cpp);
> +
> +   return level_y * pitch + level_x / halign * 4096;
> +}
> +
>  static void
>  brw_miptree_layout_2d(struct intel_mipmap_tree *mt)
>  {
> diff --git a/src/mesa/drivers/dri/i965/gen6_depth_state.c
> b/src/mesa/drivers/dri/i965/gen6_depth_state.c
> index 80cb890..05565de 100644
> --- a/src/mesa/drivers/dri/i965/gen6_depth_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_depth_state.c
> @@ -165,10 +165,20 @@ gen6_emit_depth_stencil_hiz(struct brw_context *brw,
>
>           assert(hiz_mt->array_layout == ALL_SLICES_AT_EACH_LOD);
>
> -         const uint32_t offset = intel_miptree_get_aligned_offset(
> -                                    hiz_mt,
> -                                    hiz_mt->level[lod].level_x,
> -                                    hiz_mt->level[lod].level_y);
> +         struct isl_surf temp_surf;
> +         intel_miptree_get_isl_surf(brw, mt, &temp_surf);
> +
> +         /* Main and hiz surfaces agree on the base level dimensions and
> +          * format. Therefore one can calculate against the main surface.
> +          */
> +         const uint32_t offset = brw_hiz_all_slices_at_each_lod_offset(
> +            &temp_surf.phys_level0_sa, temp_surf.dim, temp_surf.levels,
> +            temp_surf.format, hiz_mt, lod);
> +
> +         assert(offset == intel_miptree_get_aligned_offset(
> +                             hiz_mt,
> +                             hiz_mt->level[lod].level_x,
> +                             hiz_mt->level[lod].level_y));
>
>          BEGIN_BATCH(3);
>          OUT_BATCH((_3DSTATE_HIER_DEPTH_BUFFER << 16) | (3 - 2));
> diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> index e51872f..11c61c2 100644
> --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> @@ -984,10 +984,21 @@ brw_miptree_get_vertical_slice_pitch(const struct
> brw_context *brw,
>                                       unsigned level);
>
>  uint32_t
> +brw_get_mipmap_total_width(unsigned w0, unsigned num_levels, unsigned
> halign);
> +
> +uint32_t
>  brw_stencil_all_slices_at_each_lod_offset(const struct isl_surf *surf,
>                                            const struct intel_mipmap_tree
> *mt,
>                                            uint32_t level);
>
> +uint32_t
> +brw_hiz_all_slices_at_each_lod_offset(
> +   const struct isl_extent4d *phys_level0_sa,
> +   enum isl_surf_dim dim, unsigned num_levels,
> +   enum isl_format format,
> +   const struct intel_mipmap_tree *mt,
> +   unsigned level);
> +
>  void
>  brw_miptree_layout(struct brw_context *brw,
>                     struct intel_mipmap_tree *mt,
> --
> 2.5.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170131/cf3de1c3/attachment-0001.html>


More information about the mesa-dev mailing list