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@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>
This commit is contained in:
Rhys Perry 2020-12-14 21:54:28 +00:00 committed by Marge Bot
parent 08fbd5d454
commit f17de6a803
6 changed files with 34 additions and 0 deletions

View 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``

View 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 {

View 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}
};

View 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;
}

View 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,

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