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, &surf); > > + 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(&batch, &surf, 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(&batch, &surf, 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 mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev