Mesa (master): radv: add RADV_DEBUG=invariantgeom

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 12 15:25:37 UTC 2021


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

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Mon Dec 14 21:54:28 2020 +0000

radv: add RADV_DEBUG=invariantgeom

This can be used to work around a common class of bugs appearing as
flickering.

Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof at gmail.com>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8104>

---

 docs/envvars.rst               |  3 +++
 src/amd/vulkan/radv_debug.h    |  1 +
 src/amd/vulkan/radv_device.c   |  1 +
 src/amd/vulkan/radv_pipeline.c |  2 ++
 src/amd/vulkan/radv_private.h  |  1 +
 src/amd/vulkan/radv_shader.c   | 26 ++++++++++++++++++++++++++
 6 files changed, 34 insertions(+)

diff --git a/docs/envvars.rst b/docs/envvars.rst
index 3e9e1219e23..c8c6cf17d8b 100644
--- a/docs/envvars.rst
+++ b/docs/envvars.rst
@@ -568,6 +568,9 @@ RADV driver environment variables
       Print image info
    ``info``
       show GPU-related information
+   ``invariantgeom``
+      Mark geometry-affecting outputs as invariant. This works around a common
+      class of application bugs appearing as flickering.
    ``metashaders``
       dump internal meta shaders
    ``nobinning``
diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h
index 57c7723164f..88068232a7e 100644
--- a/src/amd/vulkan/radv_debug.h
+++ b/src/amd/vulkan/radv_debug.h
@@ -60,6 +60,7 @@ enum {
 	RADV_DEBUG_HANG              = 1u << 29,
 	RADV_DEBUG_IMG               = 1u << 30,
 	RADV_DEBUG_NO_UMR            = 1u << 31,
+	RADV_DEBUG_INVARIANT_GEOM    = 1ull << 32,
 };
 
 enum {
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 6fe7eca29ac..d86d2acb878 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -551,6 +551,7 @@ static const struct debug_control radv_debug_options[] = {
 	{"hang", RADV_DEBUG_HANG},
 	{"img", RADV_DEBUG_IMG},
 	{"noumr", RADV_DEBUG_NO_UMR},
+	{"invariantgeom", RADV_DEBUG_INVARIANT_GEOM},
 	{NULL, 0}
 };
 
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 63afe44c5df..2da4df8d8a5 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -223,6 +223,8 @@ static uint32_t get_hash_flags(const struct radv_device *device)
 		hash_flags |= RADV_HASH_SHADER_DISCARD_TO_DEMOTE;
 	if (device->instance->enable_mrt_output_nan_fixup)
 		hash_flags |= RADV_HASH_SHADER_MRT_NAN_FIXUP;
+	if (device->instance->debug_flags & RADV_DEBUG_INVARIANT_GEOM)
+		hash_flags |= RADV_HASH_SHADER_INVARIANT_GEOM;
 	return hash_flags;
 }
 
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index c273eae2ba3..2c910964bcd 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1666,6 +1666,7 @@ struct radv_shader_module;
 #define RADV_HASH_SHADER_LLVM                (1 << 4)
 #define RADV_HASH_SHADER_DISCARD_TO_DEMOTE   (1 << 5)
 #define RADV_HASH_SHADER_MRT_NAN_FIXUP       (1 << 6)
+#define RADV_HASH_SHADER_INVARIANT_GEOM      (1 << 7)
 
 void
 radv_hash_shaders(unsigned char *hash,
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 12ca5c36f5d..ebaa567873a 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -313,6 +313,27 @@ static void radv_compiler_debug(void *private_data,
 			0, 0, "radv", message);
 }
 
+static void
+mark_geom_invariant(nir_shader *nir)
+{
+	nir_foreach_shader_out_variable(var, nir) {
+		switch (var->data.location) {
+		case VARYING_SLOT_POS:
+		case VARYING_SLOT_PSIZ:
+		case VARYING_SLOT_CLIP_DIST0:
+		case VARYING_SLOT_CLIP_DIST1:
+		case VARYING_SLOT_CULL_DIST0:
+		case VARYING_SLOT_CULL_DIST1:
+		case VARYING_SLOT_TESS_LEVEL_OUTER:
+		case VARYING_SLOT_TESS_LEVEL_INNER:
+			var->data.invariant = true;
+			break;
+		default:
+			break;
+		}
+	}
+}
+
 static bool
 lower_intrinsics(nir_shader *nir)
 {
@@ -538,6 +559,11 @@ radv_shader_compile_to_nir(struct radv_device *device,
 		           nir_var_shader_in | nir_var_shader_out | nir_var_system_value | nir_var_mem_shared,
 			   NULL);
 
+		if (device->instance->debug_flags & RADV_DEBUG_INVARIANT_GEOM &&
+		    stage != MESA_SHADER_FRAGMENT) {
+			mark_geom_invariant(nir);
+		}
+
 		NIR_PASS_V(nir, nir_propagate_invariant);
 
 		NIR_PASS_V(nir, nir_lower_system_values);



More information about the mesa-commit mailing list