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