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