radv: fix clearing FMASK for layered MSAA images on GFX9+
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 4 Dec 2020 16:41:37 +0000 (17:41 +0100)
committerMarge Bot <eric+marge@anholt.net>
Mon, 7 Dec 2020 16:19:22 +0000 (16:19 +0000)
If we always clear the whole FMASK buffer, layers can be corrupted.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3710
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7924>

src/amd/vulkan/radv_meta_clear.c

index e839de5..143c36e 100644 (file)
@@ -1438,22 +1438,15 @@ radv_clear_fmask(struct radv_cmd_buffer *cmd_buffer,
                 const VkImageSubresourceRange *range, uint32_t value)
 {
        uint64_t offset = image->offset + image->planes[0].surface.fmask_offset;
+       unsigned slice_size = image->planes[0].surface.fmask_slice_size;
        uint64_t size;
 
        /* MSAA images do not support mipmap levels. */
        assert(range->baseMipLevel == 0 &&
               radv_get_levelCount(image, range) == 1);
 
-       if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9) {
-               /* TODO: clear layers. */
-               size = image->planes[0].surface.fmask_size;
-       } else {
-               unsigned fmask_slice_size =
-                       image->planes[0].surface.fmask_slice_size;
-
-               offset += fmask_slice_size * range->baseArrayLayer;
-               size = fmask_slice_size * radv_get_layerCount(image, range);
-       }
+       offset += slice_size * range->baseArrayLayer;
+       size = slice_size * radv_get_layerCount(image, range);
 
        return radv_fill_buffer(cmd_buffer, image->bo, offset, size, value);
 }