[Mesa-dev] [PATCH v2 21/24] anv: Allow fast-clearing the first slice of a multi-slice image
Jason Ekstrand
jason at jlekstrand.net
Fri Jan 19 23:47:38 UTC 2018
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
More information about the mesa-dev
mailing list