radv: synchronize after performing a separate depth/stencil fast clears
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 26 Nov 2019 15:55:02 +0000 (16:55 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 10 Dec 2019 12:09:22 +0000 (13:09 +0100)
For depth+stencil images, the driver might use an optimized path
if only one aspect is cleared. It either clears the depth or the
stencil part of HTILE. Because the two separate aspects might use
the same HTILE memory we have to synchronize.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_meta_clear.c

index 29905f01f1f1091184d3a6905d383e604f8a132d..04f0b8a3f9d2bb2fe0807dff9485317a89babcd8 100644 (file)
@@ -1108,6 +1108,16 @@ radv_fast_clear_depth(struct radv_cmd_buffer *cmd_buffer,
                                              htile_mask);
        }
 
+       if (iview->image->planes[0].surface.has_stencil &&
+           !(aspects == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
+               /* Synchronize after performing a depth-only or a stencil-only
+                * fast clear because the driver uses an optimized path which
+                * performs a read-modify-write operation, and the two separate
+                * aspects might use the same HTILE memory.
+                */
+               cmd_buffer->state.flush_bits |= flush_bits;
+       }
+
        radv_update_ds_clear_metadata(cmd_buffer, iview, clear_value, aspects);
        if (post_flush) {
                *post_flush |= flush_bits;