Mesa (staging/19.2): radv: fix DCC fast clear code for intensity formats (correctly)

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 17 16:29:37 UTC 2019


Module: Mesa
Branch: staging/19.2
Commit: 01e31f8cab9761d949a2bcf303f0e528f139987f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=01e31f8cab9761d949a2bcf303f0e528f139987f

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Oct 16 22:51:08 2019 +0200

radv: fix DCC fast clear code for intensity formats (correctly)

Previous fix was pretty bogus.

This fixes a rendering regression with Nier (minimap too large).

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1943
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1952
Fixes: ea92273cea8 ("radv: fix DCC fast clear code for intensity formats")
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
(cherry picked from commit c644644c651b5e852a2d7da3a89fbef1fa09669b)

---

 src/amd/vulkan/radv_meta_clear.c | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index 1e8620bec0e..c9d6e423660 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -1455,6 +1455,8 @@ static void vi_get_fast_clear_parameters(struct radv_device *device,
 	int extra_channel;
 	bool main_value = false;
 	bool extra_value = false;
+	bool has_color = false;
+	bool has_alpha = false;
 	int i;
 	*can_avoid_fast_clear_elim = false;
 
@@ -1473,9 +1475,6 @@ static void vi_get_fast_clear_parameters(struct radv_device *device,
 	} else
 		return;
 
-	bool image_alpha_is_on_msb = vi_alpha_is_on_msb(device, image_format);
-	bool view_alpha_is_on_msb = vi_alpha_is_on_msb(device, view_format);
-
 	for (i = 0; i < 4; i++) {
 		int index = desc->swizzle[i] - VK_SWIZZLE_X;
 		if (desc->swizzle[i] < VK_SWIZZLE_X ||
@@ -1504,23 +1503,21 @@ static void vi_get_fast_clear_parameters(struct radv_device *device,
 				return;
 		}
 
-		if (index == extra_channel)
+		if (index == extra_channel) {
 			extra_value = values[i];
-		else
+			has_alpha = true;
+		} else {
 			main_value = values[i];
+			has_color = true;
+		}
 	}
 
 	/* If alpha isn't present, make it the same as color, and vice versa. */
-	if (!extra_value)
+	if (!has_alpha)
 		extra_value = main_value;
-	else if (!main_value)
+	else if (!has_color)
 		main_value = extra_value;
 
-	if (main_value != extra_value) {
-		assert(image_alpha_is_on_msb == view_alpha_is_on_msb);
-		return; /* require ELIMINATE_FAST_CLEAR */
-	}
-
 	for (int i = 0; i < 4; ++i)
 		if (values[i] != main_value &&
 		    desc->swizzle[i] - VK_SWIZZLE_X != extra_channel &&




More information about the mesa-commit mailing list