Re: [Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image
On Fri, Feb 02, 2018 at 09:02:25PM -0800, Jason Ekstrand wrote: > On Fri, Feb 2, 2018 at 5:58 PM, Nanley Cherywrote: > > > 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
On Fri, Feb 2, 2018 at 5:58 PM, Nanley Cherywrote: > 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
On Fri, Feb 02, 2018 at 04:42:14PM -0800, Jason Ekstrand wrote: > On Fri, Feb 2, 2018 at 2:39 PM, Nanley Cherywrote: > > > 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
On Fri, Feb 2, 2018 at 2:39 PM, Nanley Cherywrote: > 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
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
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 || > +