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

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>
(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);

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

Reply via email to