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

Author: Rhys Perry <pendingchao...@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 <pendingchao...@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Reviewed-by: Timur Kristóf <timur.kris...@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);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to