[Mesa-dev] [PATCH 10/26] i965: Provide slice details to renderbuffer fast clear state tracker
Jason Ekstrand
jason at jlekstrand.net
Mon Oct 31 14:28:12 UTC 2016
On Mon, Oct 31, 2016 at 12:35 AM, Pohjolainen, Topi <
topi.pohjolainen at gmail.com> wrote:
> On Sat, Oct 29, 2016 at 01:17:16AM -0700, Jason Ekstrand wrote:
> > On Tue, Oct 11, 2016 at 12:26 PM, Topi Pohjolainen
> > <[1]topi.pohjolainen at gmail.com> wrote:
> >
> > This patch also introduces getter and setter for fast clear state
> > preparing for tracking the state per slice.
> > Signed-off-by: Topi Pohjolainen <[2]topi.pohjolainen at intel.com>
> > ---
> > src/mesa/drivers/dri/i965/brw_blorp.c | 7 ++--
> > src/mesa/drivers/dri/i965/brw_draw.c | 12 ++++---
> > src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 46
> > +++++++++++++++++++++++++++
> > src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 25 ++++++++-------
> > 4 files changed, 72 insertions(+), 18 deletions(-)
> > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c
> > b/src/mesa/drivers/dri/i965/brw_blorp.c
> > index 6332788..83f47aa 100644
> > --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> > +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> > @@ -363,7 +363,8 @@ brw_blorp_blit_miptrees(struct brw_context *brw,
> > intel_miptree_check_level_layer(src_mt, src_level, src_layer);
> > intel_miptree_check_level_layer(dst_mt, dst_level, dst_layer);
> > - intel_miptree_used_for_rendering(brw, dst_mt);
> > + intel_miptree_used_for_rendering(brw, dst_mt, dst_level,
> > + dst_logical_layer, 1);
> > struct isl_surf tmp_surfs[4];
> > struct blorp_surf src_surf, dst_surf;
> > @@ -425,7 +426,7 @@ brw_blorp_copy_miptrees(struct brw_context *brw,
> > miptree_check_level_logical_layer(src_mt, src_level,
> src_layer);
> > miptree_check_level_logical_layer(dst_mt, dst_level,
> dst_layer);
> > - intel_miptree_used_for_rendering(brw, dst_mt);
> > + intel_miptree_used_for_rendering(brw, dst_mt, dst_level,
> > dst_layer, 1);
> > struct isl_surf tmp_surfs[4];
> > struct blorp_surf src_surf, dst_surf;
> > @@ -862,7 +863,7 @@ do_single_blorp_clear(struct brw_context *brw,
> > struct gl_framebuffer *fb,
> > */
> > irb->mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_CLEAR;
> > } else {
> > - intel_miptree_used_for_rendering(brw, irb->mt);
> > + intel_miptree_used_for_rendering(brw, irb->mt, level, layer,
> > num_layers);
> > DBG("%s (slow) to mt %p level %d layer %d+%d\n",
> > __FUNCTION__,
> > irb->mt, irb->mt_level, irb->mt_layer, num_layers);
> > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c
> > b/src/mesa/drivers/dri/i965/brw_draw.c
> > index 5680403..e387eb9 100644
> > --- a/src/mesa/drivers/dri/i965/brw_draw.c
> > +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> > @@ -386,10 +386,14 @@ brw_postdraw_set_buffers_need_resolve(struct
> > brw_context *brw)
> > struct intel_renderbuffer *irb =
> > intel_renderbuffer(fb->_ColorDrawBuffers[i]);
> > - if (irb) {
> > - brw_render_cache_set_add_bo(brw, irb->mt->bo);
> > - intel_miptree_used_for_rendering(brw, irb->mt);
> > - }
> > + if (!irb)
> > + continue;
> > +
> > + brw_render_cache_set_add_bo(brw, irb->mt->bo);
> > + intel_miptree_used_for_rendering(
> > + brw, irb->mt, irb->mt_level,
> > + intel_miptree_physical_to_logical_layer(irb->mt,
> > irb->mt_layer),
> > + irb->layer_count);
> > }
> > }
> > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > index 4fb07e9..7b0d411 100644
> > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > @@ -2101,6 +2101,13 @@ intel_miptree_all_slices_
> resolve_depth(struct
> > brw_context *brw,
> >
> > BLORP_HIZ_OP_DEPTH_RESOLVE);
> > }
> > +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;
> > +}
> > +
> > static void
> > intel_miptree_check_color_resolve(const struct intel_mipmap_tree
> > *mt,
> > unsigned level, unsigned layer)
> > @@ -2122,6 +2129,45 @@ intel_miptree_check_color_resolve(const
> > struct intel_mipmap_tree *mt,
> > (void)layer;
> > }
> > +void
> > +intel_miptree_set_fast_clear_state(struct intel_mipmap_tree *mt,
> > + unsigned level,
> > + unsigned first_layer,
> > + unsigned num_layers,
> > + enum intel_fast_clear_state
> > new_state)
> > +{
> > + intel_miptree_check_color_resolve(mt, level, first_layer);
> > +
> > + assert(first_layer + num_layers <= mt->physical_depth0);
> > +
> > + mt->fast_clear_state = new_state;
> > +}
> > +
> > +void
> > +intel_miptree_used_for_rendering(const struct brw_context *brw,
> > + struct intel_mipmap_tree *mt,
> > unsigned level,
> > + unsigned start_layer, unsigned
> > num_layers)
> > +{
> > + const bool is_lossless_compressed =
> > + intel_miptree_is_lossless_compressed(brw, mt);
> > +
> > + for (unsigned i = 0; i < num_layers; ++i) {
> > + const enum intel_fast_clear_state fast_clear_state =
> > + intel_miptree_get_fast_clear_state(mt, level, start_layer
> > + i);
> > +
> > + /* If the buffer was previously in fast clear state, change
> > it to
> > + * unresolved state, since it won't be guaranteed to be clear
> > after
> > + * rendering occurs.
> > + */
> > + if (is_lossless_compressed ||
> > + fast_clear_state == INTEL_FAST_CLEAR_STATE_CLEAR) {
> > + intel_miptree_set_fast_clear_state(
> > + mt, level, start_layer + i, 1,
> > + INTEL_FAST_CLEAR_STATE_UNRESOLVED);
> > + }
> > + }
> > +}
> > +
> > bool
> > intel_miptree_resolve_color(struct brw_context *brw,
> > struct intel_mipmap_tree *mt,
> > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> > b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> > index 57d7b80..44685ca 100644
> > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h
> > @@ -947,22 +947,25 @@ intel_miptree_all_slices_resolve_depth(struct
> > brw_context *brw,
> > /**\}*/
> > +enum intel_fast_clear_state
> > +intel_miptree_get_fast_clear_state(const struct intel_mipmap_tree
> > *mt,
> > + unsigned level, unsigned layer);
> > +
> > +void
> > +intel_miptree_set_fast_clear_state(struct intel_mipmap_tree *mt,
> > + unsigned level,
> > + unsigned first_layer,
> > + unsigned num_layers,
> > + enum intel_fast_clear_state
> > new_state);
> > +
> > /**
> > * Update the fast clear state for a miptree to indicate that it
> > has been used
> > * for rendering.
> > */
> > -static inline void
> > +void
> > intel_miptree_used_for_rendering(const struct brw_context *brw,
> > - struct intel_mipmap_tree *mt)
> > -{
> > - /* If the buffer was previously in fast clear state, change it
> > to
> > - * unresolved state, since it won't be guaranteed to be clear
> > after
> > - * rendering occurs.
> > - */
> > - if (mt->fast_clear_state == INTEL_FAST_CLEAR_STATE_CLEAR ||
> > - intel_miptree_is_lossless_compressed(brw, mt))
> > - mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_UNRESOLVED;
> > -}
> > + struct intel_mipmap_tree *mt,
> > unsigned level,
> > + unsigned start_layer, unsigned
> > num_layers);
> >
> > This hunk doesn't look quite right...
>
> You mean this part changing the inline function to a prototype and adding
> argyments? Implementation is now in intel_mipmap_tree.c and has the same
> signature. Compiles and runs fine.
>
Right... That's just a function going from inline to not. I was having
trouble parsing the diff. Feel free to ignore it.
>
> >
> > /**
> > * Flag values telling color resolve pass which special types of
> > buffers
> > --
> > 2.5.5
> > _______________________________________________
> > mesa-dev mailing list
> > [3]mesa-dev at lists.freedesktop.org
> > [4]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:mesa-dev at lists.freedesktop.org
> > 4. https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161031/51b8c459/attachment-0001.html>
More information about the mesa-dev
mailing list