Mesa (staging/20.3): radv: add RADV_DEBUG=invariantgeom

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 13 00:04:28 UTC 2021


Module: Mesa
Branch: staging/20.3
Commit: f8033bdc6d641fa06669864f026f490c6013ec09
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f8033bdc6d641fa06669864f026f490c6013ec09

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>
(cherry picked from commit f17de6a803d2fd21dc0f74b0cb28a65cd9eca257)

---

 .pick_status.json              |  2 +-
 docs/envvars.rst               |  3 +++
 src/amd/vulkan/radv_debug.h    | 61 +++++++++++++++++++++---------------------
 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 ++++++++++++++++++
 7 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 9b8c9d7f885..c252613351e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -409,7 +409,7 @@
         "description": "radv: add RADV_DEBUG=invariantgeom",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/docs/envvars.rst b/docs/envvars.rst
index ed9d6402161..ad8e684a1cd 100644
--- a/docs/envvars.rst
+++ b/docs/envvars.rst
@@ -559,6 +559,9 @@ RADV driver environment variables
       if a GPU hang is detected
    ``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 0985be36940..2c559d8c125 100644
--- a/src/amd/vulkan/radv_debug.h
+++ b/src/amd/vulkan/radv_debug.h
@@ -28,36 +28,37 @@
 
 /* Please keep docs/envvars.rst up-to-date when you add/remove options. */
 enum {
-	RADV_DEBUG_NO_FAST_CLEARS    = 1 << 0,
-	RADV_DEBUG_NO_DCC            = 1 << 1,
-	RADV_DEBUG_DUMP_SHADERS      = 1 << 2,
-	RADV_DEBUG_NO_CACHE          = 1 << 3,
-	RADV_DEBUG_DUMP_SHADER_STATS = 1 << 4,
-	RADV_DEBUG_NO_HIZ            = 1 << 5,
-	RADV_DEBUG_NO_COMPUTE_QUEUE  = 1 << 6,
-	RADV_DEBUG_ALL_BOS           = 1 << 7,
-	RADV_DEBUG_NO_IBS            = 1 << 8,
-	RADV_DEBUG_DUMP_SPIRV        = 1 << 9,
-	RADV_DEBUG_VM_FAULTS         = 1 << 10,
-	RADV_DEBUG_ZERO_VRAM         = 1 << 11,
-	RADV_DEBUG_SYNC_SHADERS      = 1 << 12,
-	RADV_DEBUG_PREOPTIR          = 1 << 13,
-	RADV_DEBUG_NO_DYNAMIC_BOUNDS = 1 << 14,
-	RADV_DEBUG_NO_OUT_OF_ORDER   = 1 << 15,
-	RADV_DEBUG_INFO              = 1 << 16,
-	RADV_DEBUG_ERRORS            = 1 << 17,
-	RADV_DEBUG_STARTUP           = 1 << 18,
-	RADV_DEBUG_CHECKIR           = 1 << 19,
-	RADV_DEBUG_NOTHREADLLVM      = 1 << 20,
-	RADV_DEBUG_NOBINNING         = 1 << 21,
-	RADV_DEBUG_NO_NGG            = 1 << 22,
-	RADV_DEBUG_ALL_ENTRYPOINTS   = 1 << 23,
-	RADV_DEBUG_DUMP_META_SHADERS = 1 << 24,
-	RADV_DEBUG_NO_MEMORY_CACHE   = 1 << 25,
-	RADV_DEBUG_DISCARD_TO_DEMOTE = 1 << 26,
-	RADV_DEBUG_LLVM              = 1 << 27,
-	RADV_DEBUG_FORCE_COMPRESS    = 1 << 28,
-	RADV_DEBUG_HANG              = 1 << 29,
+	RADV_DEBUG_NO_FAST_CLEARS    = 1u << 0,
+	RADV_DEBUG_NO_DCC            = 1u << 1,
+	RADV_DEBUG_DUMP_SHADERS      = 1u << 2,
+	RADV_DEBUG_NO_CACHE          = 1u << 3,
+	RADV_DEBUG_DUMP_SHADER_STATS = 1u << 4,
+	RADV_DEBUG_NO_HIZ            = 1u << 5,
+	RADV_DEBUG_NO_COMPUTE_QUEUE  = 1u << 6,
+	RADV_DEBUG_ALL_BOS           = 1u << 7,
+	RADV_DEBUG_NO_IBS            = 1u << 8,
+	RADV_DEBUG_DUMP_SPIRV        = 1u << 9,
+	RADV_DEBUG_VM_FAULTS         = 1u << 10,
+	RADV_DEBUG_ZERO_VRAM         = 1u << 11,
+	RADV_DEBUG_SYNC_SHADERS      = 1u << 12,
+	RADV_DEBUG_PREOPTIR          = 1u << 13,
+	RADV_DEBUG_NO_DYNAMIC_BOUNDS = 1u << 14,
+	RADV_DEBUG_NO_OUT_OF_ORDER   = 1u << 15,
+	RADV_DEBUG_INFO              = 1u << 16,
+	RADV_DEBUG_ERRORS            = 1u << 17,
+	RADV_DEBUG_STARTUP           = 1u << 18,
+	RADV_DEBUG_CHECKIR           = 1u << 19,
+	RADV_DEBUG_NOTHREADLLVM      = 1u << 20,
+	RADV_DEBUG_NOBINNING         = 1u << 21,
+	RADV_DEBUG_NO_NGG            = 1u << 22,
+	RADV_DEBUG_ALL_ENTRYPOINTS   = 1u << 23,
+	RADV_DEBUG_DUMP_META_SHADERS = 1u << 24,
+	RADV_DEBUG_NO_MEMORY_CACHE   = 1u << 25,
+	RADV_DEBUG_DISCARD_TO_DEMOTE = 1u << 26,
+	RADV_DEBUG_LLVM              = 1u << 27,
+	RADV_DEBUG_FORCE_COMPRESS    = 1u << 28,
+	RADV_DEBUG_HANG              = 1u << 29,
+	RADV_DEBUG_INVARIANT_GEOM    = 1ull << 32,
 };
 
 enum {
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 80c622bcab0..3f8b5eb812c 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -553,6 +553,7 @@ static const struct debug_control radv_debug_options[] = {
 	{"llvm", RADV_DEBUG_LLVM},
 	{"forcecompress", RADV_DEBUG_FORCE_COMPRESS},
 	{"hang", RADV_DEBUG_HANG},
+	{"invariantgeom", RADV_DEBUG_INVARIANT_GEOM},
 	{NULL, 0}
 };
 
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index ee4dbbad8cc..e276082580e 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 cb2b638bff2..82788fafbd5 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1652,6 +1652,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 0c5579f5f5f..ae43b03c7f5 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -311,6 +311,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_load_vulkan_descriptor(nir_shader *nir)
 {
@@ -528,6 +549,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