radv: add RADV_DEBUG=invariantgeom
authorRhys Perry <pendingchaos02@gmail.com>
Mon, 14 Dec 2020 21:54:28 +0000 (21:54 +0000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 12 Jan 2021 15:11:49 +0000 (15:11 +0000)
This can be used to work around a common class of bugs appearing as
flickering.

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

docs/envvars.rst
src/amd/vulkan/radv_debug.h
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_pipeline.c
src/amd/vulkan/radv_private.h
src/amd/vulkan/radv_shader.c

index 3e9e121..c8c6cf1 100644 (file)
@@ -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``
index 57c7723..8806823 100644 (file)
@@ -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 {
index 6fe7eca..d86d2ac 100644 (file)
@@ -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}
 };
 
index 63afe44..2da4df8 100644 (file)
@@ -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;
 }
 
index c273eae..2c91096 100644 (file)
@@ -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,
index 12ca5c3..ebaa567 100644 (file)
@@ -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);