Mesa (master): radv: Enforce the contiguous memory for DCC layers in ac_surface.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 5 13:43:29 UTC 2020


Module: Mesa
Branch: master
Commit: b5488a863cf14f6f02b1aa4ec41fdbdd146492e5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b5488a863cf14f6f02b1aa4ec41fdbdd146492e5

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Sun May 24 12:50:55 2020 +0200

radv: Enforce the contiguous memory for DCC layers in ac_surface.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5194>

---

 src/amd/common/ac_surface.c |  7 +++++++
 src/amd/common/ac_surface.h |  2 +-
 src/amd/vulkan/radv_image.c | 18 +++---------------
 3 files changed, 11 insertions(+), 16 deletions(-)

diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index 0a7d9e0d9b2..b29bf552c9f 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -343,6 +343,13 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib,
 					else
 						surf_level->dcc_slice_fast_clear_size = 0;
 				}
+
+				if (surf->flags & RADEON_SURF_CONTIGUOUS_DCC_LAYERS &&
+				    surf->dcc_slice_size != surf_level->dcc_slice_fast_clear_size) {
+					surf->dcc_size = 0;
+					surf->num_dcc_levels = 0;
+					AddrDccOut->subLvlCompressible = false;
+				}
 			} else {
 				surf_level->dcc_slice_fast_clear_size = surf_level->dcc_fast_clear_size;
 			}
diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h
index 7405192d57c..161a54c9888 100644
--- a/src/amd/common/ac_surface.h
+++ b/src/amd/common/ac_surface.h
@@ -69,7 +69,7 @@ enum radeon_micro_mode {
 #define RADEON_SURF_DISABLE_DCC                 (1 << 22)
 #define RADEON_SURF_TC_COMPATIBLE_HTILE         (1 << 23)
 #define RADEON_SURF_IMPORTED                    (1 << 24)
-/* gap */
+#define RADEON_SURF_CONTIGUOUS_DCC_LAYERS       (1 << 25)
 #define RADEON_SURF_SHAREABLE                   (1 << 26)
 #define RADEON_SURF_NO_RENDER_TARGET            (1 << 27)
 /* Force a swizzle mode (gfx9+) or tile mode (gfx6-8).
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 09b086dbcea..b84f71b9a58 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -447,6 +447,9 @@ radv_init_surface(struct radv_device *device,
 		unreachable("unhandled image type");
 	}
 
+	/* Required for clearing/initializing a specific layer on GFX8. */
+	surface->flags |= RADEON_SURF_CONTIGUOUS_DCC_LAYERS;
+
 	if (is_depth) {
 		surface->flags |= RADEON_SURF_ZBUFFER;
 		if (radv_use_tc_compat_htile_for_image(device, pCreateInfo, image_format))
@@ -1288,21 +1291,6 @@ radv_image_can_enable_dcc(struct radv_device *device, struct radv_image *image)
 	    !radv_image_has_dcc(image))
 		return false;
 
-	/* On GFX8, DCC layers can be interleaved and it's currently only
-	 * enabled if slice size is equal to the per slice fast clear size
-	 * because the driver assumes that portions of multiple layers are
-	 * contiguous during fast clears.
-	 */
-	if (image->info.array_size > 1) {
-		const struct legacy_surf_level *surf_level =
-			&image->planes[0].surface.u.legacy.level[0];
-
-		assert(device->physical_device->rad_info.chip_class == GFX8);
-
-		if (image->planes[0].surface.dcc_slice_size != surf_level->dcc_fast_clear_size)
-			return false;
-	}
-
 	return true;
 }
 



More information about the mesa-commit mailing list