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