[Mesa-dev] [v3 11/17] i965: Track fast color clear state in level/layer granularity
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 Reviewed-by: Jason Ekstrand (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); + 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_
Re: [Mesa-dev] [v3 11/17] i965: Track fast color clear state in level/layer granularity
On Nov 24, 2016 6:06 AM, "Topi Pohjolainen" 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 > Reviewed-by: Jason Ekstrand (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_CL
Re: [Mesa-dev] [v3 11/17] i965: Track fast color clear state in level/layer granularity
On Thu, Nov 24, 2016 at 10:01:51AM -0800, Jason Ekstrand wrote: >On Nov 24, 2016 6:06 AM, "Topi Pohjolainen" ><[1]topi.pohjolai...@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.pohjolai...@intel.com> >> Reviewed-by: Jason Ekstrand <[3]ja...@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; >> + inte