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; } 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