<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Feb 2, 2018 at 5:58 PM, Nanley Chery <span dir="ltr"><<a href="mailto:nanleychery@gmail.com" target="_blank">nanleychery@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, Feb 02, 2018 at 04:42:14PM -0800, Jason Ekstrand wrote:<br>
> On Fri, Feb 2, 2018 at 2:39 PM, Nanley Chery <<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a>> wrote:<br>
><br>
> > On Fri, Jan 19, 2018 at 03:47:38PM -0800, Jason Ekstrand wrote:<br>
> > > Now that we're tracking aux properly per-slice, we can enable this for<br>
> > > applications which actually care.<br>
> > > ---<br>
> > >  src/intel/vulkan/anv_blorp.c       | 22 +++++++++++++++-------<br>
> > >  src/intel/vulkan/genX_cmd_<wbr>buffer.c | 13 +++++++++----<br>
> > >  2 files changed, 24 insertions(+), 11 deletions(-)<br>
> > ><br>
> > > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c<br>
> > > index 594b0d8..73a44fd 100644<br>
> > > --- a/src/intel/vulkan/anv_blorp.c<br>
> > > +++ b/src/intel/vulkan/anv_blorp.c<br>
> > > @@ -1205,9 +1205,16 @@ anv_cmd_buffer_clear_subpass(<wbr>struct<br>
> > anv_cmd_buffer *cmd_buffer)<br>
> > >                                     image, VK_IMAGE_ASPECT_COLOR_BIT,<br>
> > >                                     att_state->aux_usage, &surf);<br>
> > ><br>
> > > +      uint32_t base_layer = iview->planes[0].isl.base_<wbr>array_layer;<br>
> > > +      uint32_t layer_count = fb->layers;<br>
> > > +<br>
> > >        if (att_state->fast_clear) {<br>
> > >           surf.clear_color = vk_to_isl_color(att_state-><br>
> > clear_value.color);<br>
> > ><br>
> > > +         /* We only support fast-clears on the first layer */<br>
> > > +         assert(iview->planes[0].isl.<wbr>base_level == 0);<br>
> > > +         assert(iview->planes[0].isl.<wbr>base_array_layer == 0);<br>
> > > +<br>
> > >           /* From the Sky Lake PRM Vol. 7, "Render Target Fast Clear":<br>
> > >            *<br>
> > >            *    "After Render target fast clear, pipe-control with color<br>
> > cache<br>
> > > @@ -1229,27 +1236,28 @@ anv_cmd_buffer_clear_subpass(<wbr>struct<br>
> > anv_cmd_buffer *cmd_buffer)<br>
> > ><br>
> > >           assert(image->n_planes == 1);<br>
> > >           blorp_fast_clear(&batch, &surf, iview->planes[0].isl.format,<br>
> > > -                          iview->planes[0].isl.base_<wbr>level,<br>
> > > -                          iview->planes[0].isl.base_<wbr>array_layer,<br>
> > fb->layers,<br>
> > > +                          iview->planes[0].isl.base_<wbr>level, base_layer,<br>
> > 1,<br>
> > >                            render_area.offset.x, render_area.offset.y,<br>
> > >                            render_area.offset.x +<br>
> > render_area.extent.width,<br>
> > >                            render_area.offset.y +<br>
> > render_area.extent.height);<br>
> > > +         base_layer++;<br>
> > > +         layer_count--;<br>
> > ><br>
> > >           cmd_buffer->state.pending_<wbr>pipe_bits |=<br>
> > >              ANV_PIPE_RENDER_TARGET_CACHE_<wbr>FLUSH_BIT |<br>
> > ANV_PIPE_CS_STALL_BIT;<br>
> > > -      } else {<br>
> > > +      }<br>
> > > +<br>
> > > +      if (layer_count > 0) {<br>
> > >           assert(image->n_planes == 1);<br>
> > >           anv_cmd_buffer_mark_image_<wbr>written(cmd_buffer, image,<br>
> > >                                             VK_IMAGE_ASPECT_COLOR_BIT,<br>
> > >                                             att_state->aux_usage,<br>
> > >                                             iview->planes[0].isl.base_<br>
> > level,<br>
> > > -                                           iview->planes[0].isl.base_<br>
> > array_layer,<br>
> > > -                                           fb->layers);<br>
> > > +                                           base_layer, layer_count);<br>
> > ><br>
> > >           blorp_clear(&batch, &surf, iview->planes[0].isl.format,<br>
> > >                       anv_swizzle_for_render(iview-><br>
> > planes[0].isl.swizzle),<br>
> > > -                     iview->planes[0].isl.base_<wbr>level,<br>
> > > -                     iview->planes[0].isl.base_<wbr>array_layer, fb->layers,<br>
> > > +                     iview->planes[0].isl.base_<wbr>level, base_layer,<br>
> > layer_count,<br>
> > >                       render_area.offset.x, render_area.offset.y,<br>
> > >                       render_area.offset.x + render_area.extent.width,<br>
> > >                       render_area.offset.y + render_area.extent.height,<br>
> > > diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > > index 4c83a5c..484246d 100644<br>
> > > --- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > > +++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > > @@ -329,12 +329,17 @@ color_attachment_compute_aux_<wbr>usage(struct<br>
> > anv_device * device,<br>
> > >         */<br>
> > >        if (att_state->fast_clear &&<br>
> > >            (iview->planes[0].isl.base_<wbr>level > 0 ||<br>
> > > -           iview->image->type == VK_IMAGE_TYPE_3D ||<br>
> > > -           iview->image->array_size > 0)) {<br>
> > > +           iview->planes[0].isl.base_<wbr>array_layer > 0 ||<br>
> > > +           cmd_state->framebuffer->layers > 1)) {<br>
> > >           anv_perf_warn(device-><wbr>instance, iview->image,<br>
> > >                         "Rendering to a multi-LOD or multi-layer<br>
> > framebuffer "<br>
> > > -                       "with LOAD_OP_CLEAR.  Not fast-clearing");<br>
> > > -         att_state->fast_clear = false;<br>
> > > +                       "with LOAD_OP_CLEAR.  Only fast-clearing the<br>
> > first "<br>
> > > +                       "slice");<br>
> > > +<br>
> > > +         /* Leave fast_clear enabled if we are clearing the first<br>
> > slice. */<br>
> > > +         if (iview->planes[0].isl.base_<wbr>level > 0 ||<br>
> > > +             iview->planes[0].isl.base_<wbr>array_layer > 0)<br>
> > > +            att_state->fast_clear = false;<br>
> ><br>
> > The new perf_warn is only true for the else portion of this if statement.<br>
> ><br>
><br>
> No, it fires whenever the framebuffer is on LOD > 0 or multi-layer because<br>
> there are slices that are being rendered to which are not being<br>
> fast-cleared.  This if, on the other hand, disables fast clear if none of<br>
> the slices can be fast-cleared (i.e. zero is not in the set).<br>
><br>
><br>
<br>
</div></div>Sorry, I meant to say that the perf_warn is only *always* true in the<br>
else case. The perf_warn will wrongly state that it's fast-clearing the<br>
first slice even though the image view starts on level 1 or layer 1. By<br>
"else portion" I'm referring to:<br>
<span class=""><br>
if (iview->planes[0].isl.base_<wbr>level > 0 ||<br>
</span>   iview->planes[0].isl.base_<wbr>array_layer > 0) {<br>
  att_state->fast_clear = false;<br>
} else {<br>
   ^^^<br>
   This<br>
<div class="HOEnZb"><div class="h5">}<br></div></div></blockquote><div><br></div><div>Right.  Do you want me to split it into two anv_perf_warns, one which says "only clearing first slice" and another which says "not fast clearing"?<br><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
> > >        }<br>
> > ><br>
> > >        if (att_state->fast_clear) {<br>
> > > --<br>
> > > 2.5.0.400.gff86faf<br>
> > ><br>
> > > ______________________________<wbr>_________________<br>
> > > mesa-dev mailing list<br>
> > > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > > <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
> ><br>
</div></div></blockquote></div><br></div></div>