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

2016-11-24 Thread Topi Pohjolainen
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

2016-11-24 Thread Jason Ekstrand
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

2016-11-24 Thread Pohjolainen, Topi
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