Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image

2018-02-02 Thread Nanley Chery
On Fri, Feb 02, 2018 at 09:02:25PM -0800, Jason Ekstrand wrote:
> On Fri, Feb 2, 2018 at 5:58 PM, Nanley Chery  wrote:
> 
> > On Fri, Feb 02, 2018 at 04:42:14PM -0800, Jason Ekstrand wrote:
> > > On Fri, Feb 2, 2018 at 2:39 PM, Nanley Chery 
> > wrote:
> > >
> > > > On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:
> > > > > Now that we're tracking aux properly per-slice, we can enable this
> > for
> > > > > applications which actually care.
> > > > > ---
> > > > >  src/intel/vulkan/anv_blorp.c   | 22 +++---
> > > > >  src/intel/vulkan/genX_cmd_buffer.c | 13 +
> > > > >  2 files changed, 24 insertions(+), 11 deletions(-)
> > > > >
> > > > > diff --git a/src/intel/vulkan/anv_blorp.c
> > b/src/intel/vulkan/anv_blorp.c
> > > > > index 594b0d8..73a44fd 100644
> > > > > --- a/src/intel/vulkan/anv_blorp.c
> > > > > +++ b/src/intel/vulkan/anv_blorp.c
> > > > > @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct
> > > > anv_cmd_buffer *cmd_buffer)
> > > > > image, VK_IMAGE_ASPECT_COLOR_BIT,
> > > > > att_state->aux_usage, );
> > > > >
> > > > > +  uint32_t base_layer = iview->planes[0].isl.base_array_layer;
> > > > > +  uint32_t layer_count = fb->layers;
> > > > > +
> > > > >if (att_state->fast_clear) {
> > > > >   surf.clear_color = vk_to_isl_color(att_state->
> > > > clear_value.color);
> > > > >
> > > > > + /* We only support fast-clears on the first layer */
> > > > > + assert(iview->planes[0].isl.base_level == 0);
> > > > > + assert(iview->planes[0].isl.base_array_layer == 0);
> > > > > +
> > > > >   /* From the Sky Lake PRM Vol. 7, "Render Target Fast
> > Clear":
> > > > >*
> > > > >*"After Render target fast clear, pipe-control with
> > color
> > > > cache
> > > > > @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct
> > > > anv_cmd_buffer *cmd_buffer)
> > > > >
> > > > >   assert(image->n_planes == 1);
> > > > >   blorp_fast_clear(, ,
> > iview->planes[0].isl.format,
> > > > > -  iview->planes[0].isl.base_level,
> > > > > -  iview->planes[0].isl.base_array_layer,
> > > > fb->layers,
> > > > > +  iview->planes[0].isl.base_level,
> > base_layer,
> > > > 1,
> > > > >render_area.offset.x,
> > render_area.offset.y,
> > > > >render_area.offset.x +
> > > > render_area.extent.width,
> > > > >render_area.offset.y +
> > > > render_area.extent.height);
> > > > > + base_layer++;
> > > > > + layer_count--;
> > > > >
> > > > >   cmd_buffer->state.pending_pipe_bits |=
> > > > >  ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT |
> > > > ANV_PIPE_CS_STALL_BIT;
> > > > > -  } else {
> > > > > +  }
> > > > > +
> > > > > +  if (layer_count > 0) {
> > > > >   assert(image->n_planes == 1);
> > > > >   anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> > > > >
> >  VK_IMAGE_ASPECT_COLOR_BIT,
> > > > > att_state->aux_usage,
> > > > >
> >  iview->planes[0].isl.base_
> > > > level,
> > > > > -
> >  iview->planes[0].isl.base_
> > > > array_layer,
> > > > > -   fb->layers);
> > > > > +   base_layer, layer_count);
> > > > >
> > > > >   blorp_clear(, , iview->planes[0].isl.format,
> > > > >   anv_swizzle_for_render(iview->
> > > > planes[0].isl.swizzle),
> > > > > - iview->planes[0].isl.base_level,
> > > > > - iview->planes[0].isl.base_array_layer,
> > fb->layers,
> > > > > + iview->planes[0].isl.base_level, base_layer,
> > > > layer_count,
> > > > >   render_area.offset.x, render_area.offset.y,
> > > > >   render_area.offset.x +
> > render_area.extent.width,
> > > > >   render_area.offset.y +
> > render_area.extent.height,
> > > > > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> > > > b/src/intel/vulkan/genX_cmd_buffer.c
> > > > > index 4c83a5c..484246d 100644
> > > > > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > > > > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > > > > @@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct
> > > > anv_device * device,
> > > > > */
> > > > >if (att_state->fast_clear &&
> > > > >(iview->planes[0].isl.base_level > 0 ||
> > > > > -   iview->image->type == VK_IMAGE_TYPE_3D ||
> > > > > -   iview->image->array_size > 0)) {
> > > > > +   iview->planes[0].isl.base_array_layer > 0 ||
> > > > > +   cmd_state->framebuffer->layers > 1)) {
> > > > >   anv_perf_warn(device->instance, 

Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image

2018-02-02 Thread Jason Ekstrand
On Fri, Feb 2, 2018 at 5:58 PM, Nanley Chery  wrote:

> On Fri, Feb 02, 2018 at 04:42:14PM -0800, Jason Ekstrand wrote:
> > On Fri, Feb 2, 2018 at 2:39 PM, Nanley Chery 
> wrote:
> >
> > > On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:
> > > > Now that we're tracking aux properly per-slice, we can enable this
> for
> > > > applications which actually care.
> > > > ---
> > > >  src/intel/vulkan/anv_blorp.c   | 22 +++---
> > > >  src/intel/vulkan/genX_cmd_buffer.c | 13 +
> > > >  2 files changed, 24 insertions(+), 11 deletions(-)
> > > >
> > > > diff --git a/src/intel/vulkan/anv_blorp.c
> b/src/intel/vulkan/anv_blorp.c
> > > > index 594b0d8..73a44fd 100644
> > > > --- a/src/intel/vulkan/anv_blorp.c
> > > > +++ b/src/intel/vulkan/anv_blorp.c
> > > > @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct
> > > anv_cmd_buffer *cmd_buffer)
> > > > image, VK_IMAGE_ASPECT_COLOR_BIT,
> > > > att_state->aux_usage, );
> > > >
> > > > +  uint32_t base_layer = iview->planes[0].isl.base_array_layer;
> > > > +  uint32_t layer_count = fb->layers;
> > > > +
> > > >if (att_state->fast_clear) {
> > > >   surf.clear_color = vk_to_isl_color(att_state->
> > > clear_value.color);
> > > >
> > > > + /* We only support fast-clears on the first layer */
> > > > + assert(iview->planes[0].isl.base_level == 0);
> > > > + assert(iview->planes[0].isl.base_array_layer == 0);
> > > > +
> > > >   /* From the Sky Lake PRM Vol. 7, "Render Target Fast
> Clear":
> > > >*
> > > >*"After Render target fast clear, pipe-control with
> color
> > > cache
> > > > @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct
> > > anv_cmd_buffer *cmd_buffer)
> > > >
> > > >   assert(image->n_planes == 1);
> > > >   blorp_fast_clear(, ,
> iview->planes[0].isl.format,
> > > > -  iview->planes[0].isl.base_level,
> > > > -  iview->planes[0].isl.base_array_layer,
> > > fb->layers,
> > > > +  iview->planes[0].isl.base_level,
> base_layer,
> > > 1,
> > > >render_area.offset.x,
> render_area.offset.y,
> > > >render_area.offset.x +
> > > render_area.extent.width,
> > > >render_area.offset.y +
> > > render_area.extent.height);
> > > > + base_layer++;
> > > > + layer_count--;
> > > >
> > > >   cmd_buffer->state.pending_pipe_bits |=
> > > >  ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT |
> > > ANV_PIPE_CS_STALL_BIT;
> > > > -  } else {
> > > > +  }
> > > > +
> > > > +  if (layer_count > 0) {
> > > >   assert(image->n_planes == 1);
> > > >   anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> > > >
>  VK_IMAGE_ASPECT_COLOR_BIT,
> > > > att_state->aux_usage,
> > > >
>  iview->planes[0].isl.base_
> > > level,
> > > > -
>  iview->planes[0].isl.base_
> > > array_layer,
> > > > -   fb->layers);
> > > > +   base_layer, layer_count);
> > > >
> > > >   blorp_clear(, , iview->planes[0].isl.format,
> > > >   anv_swizzle_for_render(iview->
> > > planes[0].isl.swizzle),
> > > > - iview->planes[0].isl.base_level,
> > > > - iview->planes[0].isl.base_array_layer,
> fb->layers,
> > > > + iview->planes[0].isl.base_level, base_layer,
> > > layer_count,
> > > >   render_area.offset.x, render_area.offset.y,
> > > >   render_area.offset.x +
> render_area.extent.width,
> > > >   render_area.offset.y +
> render_area.extent.height,
> > > > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> > > b/src/intel/vulkan/genX_cmd_buffer.c
> > > > index 4c83a5c..484246d 100644
> > > > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > > > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > > > @@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct
> > > anv_device * device,
> > > > */
> > > >if (att_state->fast_clear &&
> > > >(iview->planes[0].isl.base_level > 0 ||
> > > > -   iview->image->type == VK_IMAGE_TYPE_3D ||
> > > > -   iview->image->array_size > 0)) {
> > > > +   iview->planes[0].isl.base_array_layer > 0 ||
> > > > +   cmd_state->framebuffer->layers > 1)) {
> > > >   anv_perf_warn(device->instance, iview->image,
> > > > "Rendering to a multi-LOD or multi-layer
> > > framebuffer "
> > > > -   "with LOAD_OP_CLEAR.  Not fast-clearing");
> > > > - att_state->fast_clear = false;
> > > > +   "with LOAD_OP_CLEAR.  

Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image

2018-02-02 Thread Nanley Chery
On Fri, Feb 02, 2018 at 04:42:14PM -0800, Jason Ekstrand wrote:
> On Fri, Feb 2, 2018 at 2:39 PM, Nanley Chery  wrote:
> 
> > On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:
> > > Now that we're tracking aux properly per-slice, we can enable this for
> > > applications which actually care.
> > > ---
> > >  src/intel/vulkan/anv_blorp.c   | 22 +++---
> > >  src/intel/vulkan/genX_cmd_buffer.c | 13 +
> > >  2 files changed, 24 insertions(+), 11 deletions(-)
> > >
> > > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> > > index 594b0d8..73a44fd 100644
> > > --- a/src/intel/vulkan/anv_blorp.c
> > > +++ b/src/intel/vulkan/anv_blorp.c
> > > @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct
> > anv_cmd_buffer *cmd_buffer)
> > > image, VK_IMAGE_ASPECT_COLOR_BIT,
> > > att_state->aux_usage, );
> > >
> > > +  uint32_t base_layer = iview->planes[0].isl.base_array_layer;
> > > +  uint32_t layer_count = fb->layers;
> > > +
> > >if (att_state->fast_clear) {
> > >   surf.clear_color = vk_to_isl_color(att_state->
> > clear_value.color);
> > >
> > > + /* We only support fast-clears on the first layer */
> > > + assert(iview->planes[0].isl.base_level == 0);
> > > + assert(iview->planes[0].isl.base_array_layer == 0);
> > > +
> > >   /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
> > >*
> > >*"After Render target fast clear, pipe-control with color
> > cache
> > > @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct
> > anv_cmd_buffer *cmd_buffer)
> > >
> > >   assert(image->n_planes == 1);
> > >   blorp_fast_clear(, , iview->planes[0].isl.format,
> > > -  iview->planes[0].isl.base_level,
> > > -  iview->planes[0].isl.base_array_layer,
> > fb->layers,
> > > +  iview->planes[0].isl.base_level, base_layer,
> > 1,
> > >render_area.offset.x, render_area.offset.y,
> > >render_area.offset.x +
> > render_area.extent.width,
> > >render_area.offset.y +
> > render_area.extent.height);
> > > + base_layer++;
> > > + layer_count--;
> > >
> > >   cmd_buffer->state.pending_pipe_bits |=
> > >  ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT |
> > ANV_PIPE_CS_STALL_BIT;
> > > -  } else {
> > > +  }
> > > +
> > > +  if (layer_count > 0) {
> > >   assert(image->n_planes == 1);
> > >   anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> > > VK_IMAGE_ASPECT_COLOR_BIT,
> > > att_state->aux_usage,
> > > iview->planes[0].isl.base_
> > level,
> > > -   iview->planes[0].isl.base_
> > array_layer,
> > > -   fb->layers);
> > > +   base_layer, layer_count);
> > >
> > >   blorp_clear(, , iview->planes[0].isl.format,
> > >   anv_swizzle_for_render(iview->
> > planes[0].isl.swizzle),
> > > - iview->planes[0].isl.base_level,
> > > - iview->planes[0].isl.base_array_layer, fb->layers,
> > > + iview->planes[0].isl.base_level, base_layer,
> > layer_count,
> > >   render_area.offset.x, render_area.offset.y,
> > >   render_area.offset.x + render_area.extent.width,
> > >   render_area.offset.y + render_area.extent.height,
> > > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> > b/src/intel/vulkan/genX_cmd_buffer.c
> > > index 4c83a5c..484246d 100644
> > > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > > @@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct
> > anv_device * device,
> > > */
> > >if (att_state->fast_clear &&
> > >(iview->planes[0].isl.base_level > 0 ||
> > > -   iview->image->type == VK_IMAGE_TYPE_3D ||
> > > -   iview->image->array_size > 0)) {
> > > +   iview->planes[0].isl.base_array_layer > 0 ||
> > > +   cmd_state->framebuffer->layers > 1)) {
> > >   anv_perf_warn(device->instance, iview->image,
> > > "Rendering to a multi-LOD or multi-layer
> > framebuffer "
> > > -   "with LOAD_OP_CLEAR.  Not fast-clearing");
> > > - att_state->fast_clear = false;
> > > +   "with LOAD_OP_CLEAR.  Only fast-clearing the
> > first "
> > > +   "slice");
> > > +
> > > + /* Leave fast_clear enabled if we are clearing the first
> > slice. */
> > > + 

Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image

2018-02-02 Thread Jason Ekstrand
On Fri, Feb 2, 2018 at 2:39 PM, Nanley Chery  wrote:

> On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:
> > Now that we're tracking aux properly per-slice, we can enable this for
> > applications which actually care.
> > ---
> >  src/intel/vulkan/anv_blorp.c   | 22 +++---
> >  src/intel/vulkan/genX_cmd_buffer.c | 13 +
> >  2 files changed, 24 insertions(+), 11 deletions(-)
> >
> > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> > index 594b0d8..73a44fd 100644
> > --- a/src/intel/vulkan/anv_blorp.c
> > +++ b/src/intel/vulkan/anv_blorp.c
> > @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct
> anv_cmd_buffer *cmd_buffer)
> > image, VK_IMAGE_ASPECT_COLOR_BIT,
> > att_state->aux_usage, );
> >
> > +  uint32_t base_layer = iview->planes[0].isl.base_array_layer;
> > +  uint32_t layer_count = fb->layers;
> > +
> >if (att_state->fast_clear) {
> >   surf.clear_color = vk_to_isl_color(att_state->
> clear_value.color);
> >
> > + /* We only support fast-clears on the first layer */
> > + assert(iview->planes[0].isl.base_level == 0);
> > + assert(iview->planes[0].isl.base_array_layer == 0);
> > +
> >   /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
> >*
> >*"After Render target fast clear, pipe-control with color
> cache
> > @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct
> anv_cmd_buffer *cmd_buffer)
> >
> >   assert(image->n_planes == 1);
> >   blorp_fast_clear(, , iview->planes[0].isl.format,
> > -  iview->planes[0].isl.base_level,
> > -  iview->planes[0].isl.base_array_layer,
> fb->layers,
> > +  iview->planes[0].isl.base_level, base_layer,
> 1,
> >render_area.offset.x, render_area.offset.y,
> >render_area.offset.x +
> render_area.extent.width,
> >render_area.offset.y +
> render_area.extent.height);
> > + base_layer++;
> > + layer_count--;
> >
> >   cmd_buffer->state.pending_pipe_bits |=
> >  ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT |
> ANV_PIPE_CS_STALL_BIT;
> > -  } else {
> > +  }
> > +
> > +  if (layer_count > 0) {
> >   assert(image->n_planes == 1);
> >   anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> > VK_IMAGE_ASPECT_COLOR_BIT,
> > att_state->aux_usage,
> > iview->planes[0].isl.base_
> level,
> > -   iview->planes[0].isl.base_
> array_layer,
> > -   fb->layers);
> > +   base_layer, layer_count);
> >
> >   blorp_clear(, , iview->planes[0].isl.format,
> >   anv_swizzle_for_render(iview->
> planes[0].isl.swizzle),
> > - iview->planes[0].isl.base_level,
> > - iview->planes[0].isl.base_array_layer, fb->layers,
> > + iview->planes[0].isl.base_level, base_layer,
> layer_count,
> >   render_area.offset.x, render_area.offset.y,
> >   render_area.offset.x + render_area.extent.width,
> >   render_area.offset.y + render_area.extent.height,
> > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> > index 4c83a5c..484246d 100644
> > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > @@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct
> anv_device * device,
> > */
> >if (att_state->fast_clear &&
> >(iview->planes[0].isl.base_level > 0 ||
> > -   iview->image->type == VK_IMAGE_TYPE_3D ||
> > -   iview->image->array_size > 0)) {
> > +   iview->planes[0].isl.base_array_layer > 0 ||
> > +   cmd_state->framebuffer->layers > 1)) {
> >   anv_perf_warn(device->instance, iview->image,
> > "Rendering to a multi-LOD or multi-layer
> framebuffer "
> > -   "with LOAD_OP_CLEAR.  Not fast-clearing");
> > - att_state->fast_clear = false;
> > +   "with LOAD_OP_CLEAR.  Only fast-clearing the
> first "
> > +   "slice");
> > +
> > + /* Leave fast_clear enabled if we are clearing the first
> slice. */
> > + if (iview->planes[0].isl.base_level > 0 ||
> > + iview->planes[0].isl.base_array_layer > 0)
> > +att_state->fast_clear = false;
>
> The new perf_warn is only true for the else portion of this if statement.
>

No, it fires whenever the framebuffer 

Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image

2018-02-02 Thread Nanley Chery
On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:
> Now that we're tracking aux properly per-slice, we can enable this for
> applications which actually care.
> ---
>  src/intel/vulkan/anv_blorp.c   | 22 +++---
>  src/intel/vulkan/genX_cmd_buffer.c | 13 +
>  2 files changed, 24 insertions(+), 11 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index 594b0d8..73a44fd 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
> *cmd_buffer)
> image, VK_IMAGE_ASPECT_COLOR_BIT,
> att_state->aux_usage, );
>  
> +  uint32_t base_layer = iview->planes[0].isl.base_array_layer;
> +  uint32_t layer_count = fb->layers;
> +
>if (att_state->fast_clear) {
>   surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
>  
> + /* We only support fast-clears on the first layer */
> + assert(iview->planes[0].isl.base_level == 0);
> + assert(iview->planes[0].isl.base_array_layer == 0);
> +
>   /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
>*
>*"After Render target fast clear, pipe-control with color cache
> @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
> *cmd_buffer)
>  
>   assert(image->n_planes == 1);
>   blorp_fast_clear(, , iview->planes[0].isl.format,
> -  iview->planes[0].isl.base_level,
> -  iview->planes[0].isl.base_array_layer, fb->layers,
> +  iview->planes[0].isl.base_level, base_layer, 1,
>render_area.offset.x, render_area.offset.y,
>render_area.offset.x + render_area.extent.width,
>render_area.offset.y + render_area.extent.height);
> + base_layer++;
> + layer_count--;
>  
>   cmd_buffer->state.pending_pipe_bits |=
>  ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
> -  } else {
> +  }
> +
> +  if (layer_count > 0) {
>   assert(image->n_planes == 1);
>   anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> VK_IMAGE_ASPECT_COLOR_BIT,
> att_state->aux_usage,
> iview->planes[0].isl.base_level,
> -   
> iview->planes[0].isl.base_array_layer,
> -   fb->layers);
> +   base_layer, layer_count);
>  
>   blorp_clear(, , iview->planes[0].isl.format,
>   anv_swizzle_for_render(iview->planes[0].isl.swizzle),
> - iview->planes[0].isl.base_level,
> - iview->planes[0].isl.base_array_layer, fb->layers,
> + iview->planes[0].isl.base_level, base_layer, 
> layer_count,
>   render_area.offset.x, render_area.offset.y,
>   render_area.offset.x + render_area.extent.width,
>   render_area.offset.y + render_area.extent.height,
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
> b/src/intel/vulkan/genX_cmd_buffer.c
> index 4c83a5c..484246d 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct anv_device * 
> device,
> */
>if (att_state->fast_clear &&
>(iview->planes[0].isl.base_level > 0 ||
> -   iview->image->type == VK_IMAGE_TYPE_3D ||
> -   iview->image->array_size > 0)) {
> +   iview->planes[0].isl.base_array_layer > 0 ||
> +   cmd_state->framebuffer->layers > 1)) {
>   anv_perf_warn(device->instance, iview->image,
> "Rendering to a multi-LOD or multi-layer framebuffer "
> -   "with LOAD_OP_CLEAR.  Not fast-clearing");
> - att_state->fast_clear = false;
> +   "with LOAD_OP_CLEAR.  Only fast-clearing the first "
> +   "slice");
> +
> + /* Leave fast_clear enabled if we are clearing the first slice. */
> + if (iview->planes[0].isl.base_level > 0 ||
> + iview->planes[0].isl.base_array_layer > 0)
> +att_state->fast_clear = false;

The new perf_warn is only true for the else portion of this if statement.

>}
>  
>if (att_state->fast_clear) {
> -- 
> 2.5.0.400.gff86faf
> 
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev 

Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image

2018-01-22 Thread Pohjolainen, Topi
On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:
> Now that we're tracking aux properly per-slice, we can enable this for
> applications which actually care.
> ---
>  src/intel/vulkan/anv_blorp.c   | 22 +++---
>  src/intel/vulkan/genX_cmd_buffer.c | 13 +
>  2 files changed, 24 insertions(+), 11 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index 594b0d8..73a44fd 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
> *cmd_buffer)
> image, VK_IMAGE_ASPECT_COLOR_BIT,
> att_state->aux_usage, );
>  
> +  uint32_t base_layer = iview->planes[0].isl.base_array_layer;
> +  uint32_t layer_count = fb->layers;
> +
>if (att_state->fast_clear) {
>   surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
>  
> + /* We only support fast-clears on the first layer */
> + assert(iview->planes[0].isl.base_level == 0);
> + assert(iview->planes[0].isl.base_array_layer == 0);
> +

Before reading to the end of the patch I was wondering how this assumption
holds. Then I realized the logic in color_attachment_compute_aux_usage(). In
other words, if "att_state->fast_clear == true" then the view covers also the
very first slice.

>   /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":
>*
>*"After Render target fast clear, pipe-control with color cache
> @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer 
> *cmd_buffer)
>  
>   assert(image->n_planes == 1);
>   blorp_fast_clear(, , iview->planes[0].isl.format,
> -  iview->planes[0].isl.base_level,
> -  iview->planes[0].isl.base_array_layer, fb->layers,
> +  iview->planes[0].isl.base_level, base_layer, 1,

Given the design for "first slice only" and as there are the asserts earlier
I was expecting to see "0, 0, 1," here. Not a big deal though.

Reviewed-by: Topi Pohjolainen 

>render_area.offset.x, render_area.offset.y,
>render_area.offset.x + render_area.extent.width,
>render_area.offset.y + render_area.extent.height);
> + base_layer++;
> + layer_count--;
>  
>   cmd_buffer->state.pending_pipe_bits |=
>  ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
> -  } else {
> +  }
> +
> +  if (layer_count > 0) {
>   assert(image->n_planes == 1);
>   anv_cmd_buffer_mark_image_written(cmd_buffer, image,
> VK_IMAGE_ASPECT_COLOR_BIT,
> att_state->aux_usage,
> iview->planes[0].isl.base_level,
> -   
> iview->planes[0].isl.base_array_layer,
> -   fb->layers);
> +   base_layer, layer_count);
>  
>   blorp_clear(, , iview->planes[0].isl.format,
>   anv_swizzle_for_render(iview->planes[0].isl.swizzle),
> - iview->planes[0].isl.base_level,
> - iview->planes[0].isl.base_array_layer, fb->layers,
> + iview->planes[0].isl.base_level, base_layer, 
> layer_count,
>   render_area.offset.x, render_area.offset.y,
>   render_area.offset.x + render_area.extent.width,
>   render_area.offset.y + render_area.extent.height,
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
> b/src/intel/vulkan/genX_cmd_buffer.c
> index 4c83a5c..484246d 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -329,12 +329,17 @@ color_attachment_compute_aux_usage(struct anv_device * 
> device,
> */
>if (att_state->fast_clear &&
>(iview->planes[0].isl.base_level > 0 ||
> -   iview->image->type == VK_IMAGE_TYPE_3D ||
> -   iview->image->array_size > 0)) {
> +   iview->planes[0].isl.base_array_layer > 0 ||
> +   cmd_state->framebuffer->layers > 1)) {
>   anv_perf_warn(device->instance, iview->image,
> "Rendering to a multi-LOD or multi-layer framebuffer "
> -   "with LOAD_OP_CLEAR.  Not fast-clearing");
> - att_state->fast_clear = false;
> +   "with LOAD_OP_CLEAR.  Only fast-clearing the first "
> +   "slice");
> +
> + /* Leave fast_clear enabled if we are clearing the first slice. */
> + if (iview->planes[0].isl.base_level > 0 ||
> +