[Mesa-dev] [v3 11/17] i965: Track fast color clear state in level/layer granularity

Pohjolainen, Topi topi.pohjolainen at gmail.com
Thu Nov 24 18:29:17 UTC 2016


On Thu, Nov 24, 2016 at 10:01:51AM -0800, Jason Ekstrand wrote:
>    On Nov 24, 2016 6:06 AM, "Topi Pohjolainen"
>    <[1]topi.pohjolainen at gmail.com> wrote:
>    >
>    > Note that RESOLVED is not tracked in the map explicitly. Absence
>    > of item implicitly means RESOLVED state.
>    >
>    > v2: Added intel_resolve_map_clear() into intel_miptree_release()
>    > v3 (Jason): Properly handle the assumption of resolve map not
>    >             containing any items with state RESOLVED. Removed
>    >             unnecessary intel_miptree_set_fast_clear_state() call
>    >             in brw_blorp_resolve_color() preventing
>    >             intel_miptree_set_fast_clear_state() from asserting
>    >             against RESOLVED.
>    >
>    > Signed-off-by: Topi Pohjolainen <[2]topi.pohjolainen at intel.com>
>    > Reviewed-by: Jason Ekstrand <[3]jason at jlekstrand.net> (v1)
>    > ---
>    >  src/mesa/drivers/dri/i965/brw_blorp.c         |  3 -
>    >  src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 79
>    ++++++++++++++++++++-------
>    >  src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 16 +++---
>    >  3 files changed, 68 insertions(+), 30 deletions(-)
>    >
>    > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c
>    b/src/mesa/drivers/dri/i965/brw_blorp.c
>    > index 67f4cce..d900e15 100644
>    > --- a/src/mesa/drivers/dri/i965/brw_blorp.c
>    > +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
>    > @@ -969,9 +969,6 @@ brw_blorp_resolve_color(struct brw_context *brw,
>    struct intel_mipmap_tree *mt,
>    >                       brw_blorp_to_isl_format(brw, format, true),
>    >                       resolve_op);
>    >     blorp_batch_finish(&batch);
>    > -
>    > -   intel_miptree_set_fast_clear_state(mt, level, layer, 1,
>    > -
>    INTEL_FAST_CLEAR_STATE_RESOLVED);
>    >  }
>    >
>    >  static void
>    > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
>    b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
>    > index a5913bc..d629901 100644
>    > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
>    > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
>    > @@ -397,11 +397,11 @@ intel_miptree_create_layout(struct brw_context
>    *brw,
>    >     mt->logical_width0 = width0;
>    >     mt->logical_height0 = height0;
>    >     mt->logical_depth0 = depth0;
>    > -   mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED;
>    >     mt->disable_aux_buffers = (layout_flags &
>    MIPTREE_LAYOUT_DISABLE_AUX) != 0;
>    >     mt->no_ccs = true;
>    >     mt->is_scanout = (layout_flags & MIPTREE_LAYOUT_FOR_SCANOUT) !=
>    0;
>    >     exec_list_make_empty(&mt->hiz_map);
>    > +   exec_list_make_empty(&mt->color_resolve_map);
>    >     mt->cpp = _mesa_get_format_bytes(format);
>    >     mt->num_samples = num_samples;
>    >     mt->compressed = _mesa_is_format_compressed(format);
>    > @@ -933,7 +933,7 @@ intel_update_winsys_renderbuffer_miptree(struct
>    brw_context *intel,
>    >      */
>    >     if (intel_tiling_supports_non_msrt_mcs(intel,
>    singlesample_mt->tiling) &&
>    >         intel_miptree_supports_non_msrt_fast_clear(intel,
>    singlesample_mt)) {
>    > -      singlesample_mt->fast_clear_state =
>    INTEL_FAST_CLEAR_STATE_RESOLVED;
>    > +      singlesample_mt->no_ccs = false;
>    >     }
>    >
>    >     if (num_samples == 0) {
>    > @@ -1048,6 +1048,7 @@ intel_miptree_release(struct intel_mipmap_tree
>    **mt)
>    >           free((*mt)->mcs_buf);
>    >        }
>    >        intel_resolve_map_clear(&(*mt)->hiz_map);
>    > +      intel_resolve_map_clear(&(*mt)->color_resolve_map);
>    >
>    >        intel_miptree_release(&(*mt)->plane[0]);
>    >        intel_miptree_release(&(*mt)->plane[1]);
>    > @@ -1633,7 +1634,12 @@ intel_miptree_alloc_mcs(struct brw_context
>    *brw,
>    >        return false;
>    >
>    >     intel_miptree_init_mcs(brw, mt, 0xFF);
>    > -   mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_CLEAR;
>    > +
>    > +   /* Multisampled miptrees are only supported for single level. */
>    > +   assert(mt->first_level == 0);
>    > +   intel_miptree_set_fast_clear_state(mt, mt->first_level, 0,
>    > +                                      mt->logical_depth0,
>    > +                                      INTEL_FAST_CLEAR_STATE_CLEAR);
>    >
>    >     return true;
>    >  }
>    > @@ -1713,7 +1719,6 @@ intel_miptree_alloc_non_msrt_mcs(struct
>    brw_context *brw,
>    >         *    Software needs to initialize MCS with zeros."
>    >         */
>    >        intel_miptree_init_mcs(brw, mt, 0);
>    > -      mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED;
>    >        mt->msaa_layout = INTEL_MSAA_LAYOUT_CMS;
>    >     }
>    >
>    > @@ -2209,7 +2214,15 @@ enum intel_fast_clear_state
>    >  intel_miptree_get_fast_clear_state(const struct intel_mipmap_tree
>    *mt,
>    >                                     unsigned level, unsigned layer)
>    >  {
>    > -   return mt->fast_clear_state;
>    > +   intel_miptree_check_level_layer(mt, level, layer);
>    > +
>    > +   const struct intel_resolve_map *item =
>    > +      intel_resolve_map_const_get(&mt->color_resolve_map, level,
>    layer);
>    > +
>    > +   if (!item)
>    > +      return INTEL_FAST_CLEAR_STATE_RESOLVED;
>    > +
>    > +   return item->fast_clear_state;
>    >  }
>    >
>    >  static void
>    > @@ -2240,11 +2253,18 @@ intel_miptree_set_fast_clear_state(struct
>    intel_mipmap_tree *mt,
>    >                                     unsigned num_layers,
>    >                                     enum intel_fast_clear_state
>    new_state)
>    >  {
>    > +   /* Setting the state to resolved means removing the item from the
>    list
>    > +    * altogether.
>    > +    */
>    > +   assert(new_state != INTEL_FAST_CLEAR_STATE_RESOLVED);
> 
>    I'm honestly a bit surprised that nothing calls this to set RESOLVED
>    but if it passes Jenkins, I'll believe it.

There are only two callers of brw_blorp_resolve_color(). And they are the only
entities for which setting RESOLVED makes sense. These are
intel_miptree_resolve_color() and intel_miptree_all_slices_resolve_color().
Both search for items in the map, resolve accordingly and remove the items
in the map (by calling intel_resolve_map_remove()).

> 
>    Series is
> 
>    Reviewed-by:  Jason Ekstrand <[4]jason at jlekstrand.net>

Thanks :)

> 
>    > +
>    >     intel_miptree_check_color_resolve(mt, level, first_layer);
>    >
>    >     assert(first_layer + num_layers <= mt->physical_depth0);
>    >
>    > -   mt->fast_clear_state = new_state;
>    > +   for (unsigned i = 0; i < num_layers; i++)
>    > +      intel_resolve_map_set(&mt->color_resolve_map, level,
>    > +                            first_layer + i, new_state);
>    >  }
>    >
>    >  bool
>    > @@ -2252,7 +2272,9 @@ intel_miptree_has_color_unresolved(const struct
>    intel_mipmap_tree *mt,
>    >                                     unsigned start_level, unsigned
>    num_levels,
>    >                                     unsigned start_layer, unsigned
>    num_layers)
>    >  {
>    > -   return mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_RESOLVED;
>    > +   return intel_resolve_map_find_any(&mt->color_resolve_map,
>    > +                                     start_level, num_levels,
>    > +                                     start_layer, num_layers) !=
>    NULL;
>    >  }
>    >
>    >  void
>    > @@ -2316,19 +2338,27 @@ intel_miptree_resolve_color(struct
>    brw_context *brw,
>    >     if (!intel_miptree_needs_color_resolve(brw, mt, flags))
>    >        return false;
>    >
>    > -   switch (mt->fast_clear_state) {
>    > -   case INTEL_FAST_CLEAR_STATE_RESOLVED:
>    > -      /* No resolve needed */
>    > -      return false;
>    > -   case INTEL_FAST_CLEAR_STATE_UNRESOLVED:
>    > -   case INTEL_FAST_CLEAR_STATE_CLEAR:
>    > -      /* For now arrayed fast clear is not supported. */
>    > -      assert(num_layers == 1);
>    > -      brw_blorp_resolve_color(brw, mt, level, start_layer);
>    > -      return true;
>    > -   default:
>    > -      unreachable("Invalid fast clear state");
>    > +   /* For now arrayed fast clear is not supported. */
>    > +   assert(num_layers == 1);
>    > +
>    > +   bool resolved = false;
>    > +   for (unsigned i = 0; i < num_layers; ++i) {
>    > +      intel_miptree_check_level_layer(mt, level, start_layer + i);
>    > +
>    > +      struct intel_resolve_map *item =
>    > +         intel_resolve_map_get(&mt->color_resolve_map, level,
>    > +                               start_layer + i);
>    > +
>    > +      if (item) {
>    > +         assert(item->fast_clear_state !=
>    INTEL_FAST_CLEAR_STATE_RESOLVED);
>    > +
>    > +         brw_blorp_resolve_color(brw, mt, level, start_layer);
>    > +         intel_resolve_map_remove(item);
>    > +         resolved = true;
>    > +      }
>    >     }
>    > +
>    > +   return resolved;
>    >  }
>    >
>    >  void
>    > @@ -2336,7 +2366,16 @@ intel_miptree_all_slices_resolve_color(struct
>    brw_context *brw,
>    >                                         struct intel_mipmap_tree *mt,
>    >                                         int flags)
>    >  {
>    > -   intel_miptree_resolve_color(brw, mt, 0, 0, 1, flags);
>    > +   if (!intel_miptree_needs_color_resolve(brw, mt, flags))
>    > +      return;
>    > +
>    > +   foreach_list_typed_safe(struct intel_resolve_map, map, link,
>    > +                           &mt->color_resolve_map) {
>    > +      assert(map->fast_clear_state !=
>    INTEL_FAST_CLEAR_STATE_RESOLVED);
>    > +
>    > +      brw_blorp_resolve_color(brw, mt, map->level, map->layer);
>    > +      intel_resolve_map_remove(map);
>    > +   }
>    >  }
>    >
>    >  /**
>    > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
>    b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
>    > index 02f131c..29d0e2f 100644
>    > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
>    > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
>    > @@ -554,15 +554,22 @@ struct intel_mipmap_tree
>    >     struct intel_miptree_hiz_buffer *hiz_buf;
>    >
>    >     /**
>    > -    * \brief Map of miptree slices to needed resolves.
>    > +    * \brief Maps of miptree slices to needed resolves.
>    >      *
>    > -    * This is used only when the miptree has a child HiZ miptree.
>    > +    * hiz_map is used only when the miptree has a child HiZ miptree.
>    >      *
>    >      * Let \c mt be a depth miptree with HiZ enabled. Then the
>    resolve map is
>    >      * \c mt->hiz_map. The resolve map of the child HiZ miptree, \c
>    >      * mt->hiz_mt->hiz_map, is unused.
>    > +    *
>    > +    *
>    > +    * color_resolve_map is used only when the miptree uses fast
>    clear (Gen7+)
>    > +    * lossless compression (Gen9+). It should be noted that absence
>    in the
>    > +    * map means implicitly RESOLVED state. If item is found it
>    always
>    > +    * indicates state other than RESOLVED.
>    >      */
>    >     struct exec_list hiz_map; /* List of intel_resolve_map. */
>    > +   struct exec_list color_resolve_map; /* List of intel_resolve_map.
>    */
>    >
>    >     /**
>    >      * \brief Stencil miptree for depthstencil textures.
>    > @@ -606,11 +613,6 @@ struct intel_mipmap_tree
>    >     struct intel_mipmap_tree *plane[2];
>    >
>    >     /**
>    > -    * Fast clear state for this buffer.
>    > -    */
>    > -   enum intel_fast_clear_state fast_clear_state;
>    > -
>    > -   /**
>    >      * The SURFACE_STATE bits associated with the last fast color
>    clear to this
>    >      * color mipmap tree, if any.
>    >      *
>    > --
>    > 2.5.5
>    >
>    > _______________________________________________
>    > mesa-dev mailing list
>    >[5] mesa-dev at lists.freedesktop.org
>    >[6] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> References
> 
>    1. mailto:topi.pohjolainen at gmail.com
>    2. mailto:topi.pohjolainen at intel.com
>    3. mailto:jason at jlekstrand.net
>    4. mailto:jason at jlekstrand.net
>    5. mailto:mesa-dev at lists.freedesktop.org
>    6. https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list