anv: Allow fast-clearing the first slice of a multi-slice image
Now that we're tracking aux properly per-slice, we can enable this for applications which actually care. Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com> Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
parent
de3be61801
commit
1810f965c8
|
@ -1206,6 +1206,9 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||||
image, VK_IMAGE_ASPECT_COLOR_BIT,
|
image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
att_state->aux_usage, &surf);
|
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) {
|
if (att_state->fast_clear) {
|
||||||
surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
|
surf.clear_color = vk_to_isl_color(att_state->clear_value.color);
|
||||||
|
|
||||||
|
@ -1228,29 +1231,33 @@ anv_cmd_buffer_clear_subpass(struct anv_cmd_buffer *cmd_buffer)
|
||||||
cmd_buffer->state.pending_pipe_bits |=
|
cmd_buffer->state.pending_pipe_bits |=
|
||||||
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
|
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
assert(image->n_planes == 1);
|
assert(image->n_planes == 1);
|
||||||
blorp_fast_clear(&batch, &surf, iview->planes[0].isl.format,
|
blorp_fast_clear(&batch, &surf, iview->planes[0].isl.format, 0, 0, 1,
|
||||||
iview->planes[0].isl.base_level,
|
|
||||||
iview->planes[0].isl.base_array_layer, fb->layers,
|
|
||||||
render_area.offset.x, render_area.offset.y,
|
render_area.offset.x, render_area.offset.y,
|
||||||
render_area.offset.x + render_area.extent.width,
|
render_area.offset.x + render_area.extent.width,
|
||||||
render_area.offset.y + render_area.extent.height);
|
render_area.offset.y + render_area.extent.height);
|
||||||
|
base_layer++;
|
||||||
|
layer_count--;
|
||||||
|
|
||||||
cmd_buffer->state.pending_pipe_bits |=
|
cmd_buffer->state.pending_pipe_bits |=
|
||||||
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
|
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
if (layer_count > 0) {
|
||||||
assert(image->n_planes == 1);
|
assert(image->n_planes == 1);
|
||||||
anv_cmd_buffer_mark_image_written(cmd_buffer, image,
|
anv_cmd_buffer_mark_image_written(cmd_buffer, image,
|
||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
att_state->aux_usage,
|
att_state->aux_usage,
|
||||||
iview->planes[0].isl.base_level,
|
iview->planes[0].isl.base_level,
|
||||||
iview->planes[0].isl.base_array_layer,
|
base_layer, layer_count);
|
||||||
fb->layers);
|
|
||||||
|
|
||||||
blorp_clear(&batch, &surf, iview->planes[0].isl.format,
|
blorp_clear(&batch, &surf, iview->planes[0].isl.format,
|
||||||
anv_swizzle_for_render(iview->planes[0].isl.swizzle),
|
anv_swizzle_for_render(iview->planes[0].isl.swizzle),
|
||||||
iview->planes[0].isl.base_level,
|
iview->planes[0].isl.base_level, base_layer, layer_count,
|
||||||
iview->planes[0].isl.base_array_layer, fb->layers,
|
|
||||||
render_area.offset.x, render_area.offset.y,
|
render_area.offset.x, render_area.offset.y,
|
||||||
render_area.offset.x + render_area.extent.width,
|
render_area.offset.x + render_area.extent.width,
|
||||||
render_area.offset.y + render_area.extent.height,
|
render_area.offset.y + render_area.extent.height,
|
||||||
|
|
|
@ -329,12 +329,16 @@ color_attachment_compute_aux_usage(struct anv_device * device,
|
||||||
*/
|
*/
|
||||||
if (att_state->fast_clear &&
|
if (att_state->fast_clear &&
|
||||||
(iview->planes[0].isl.base_level > 0 ||
|
(iview->planes[0].isl.base_level > 0 ||
|
||||||
iview->image->extent.depth > 0 ||
|
iview->planes[0].isl.base_array_layer > 0)) {
|
||||||
iview->image->array_size > 0)) {
|
|
||||||
anv_perf_warn(device->instance, iview->image,
|
anv_perf_warn(device->instance, iview->image,
|
||||||
"Rendering to a multi-LOD or multi-layer framebuffer "
|
"Rendering with multi-lod or multi-layer framebuffer "
|
||||||
"with LOAD_OP_CLEAR. Not fast-clearing");
|
"with LOAD_OP_LOAD and baseMipLevel > 0 or "
|
||||||
|
"baseArrayLayer > 0. Not fast clearing.");
|
||||||
att_state->fast_clear = false;
|
att_state->fast_clear = false;
|
||||||
|
} else if (att_state->fast_clear && cmd_state->framebuffer->layers > 1) {
|
||||||
|
anv_perf_warn(device->instance, iview->image,
|
||||||
|
"Rendering to a multi-layer framebuffer with "
|
||||||
|
"LOAD_OP_CLEAR. Only fast-clearing the first slice");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (att_state->fast_clear) {
|
if (att_state->fast_clear) {
|
||||||
|
|
Loading…
Reference in New Issue