From fa7c7791ee52d81fc874cbf4e91615290a5e3d28 Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Mon, 12 Jun 2023 19:41:18 +0200 Subject: [PATCH] radv: Add RADV_DEBUG=nort This makes vkCmdTraceRaysKHR and ray queries no-ops and is useful for triaging GPU hangs with raytracing. Part-of: --- docs/envvars.rst | 3 +++ src/amd/vulkan/nir/radv_nir_lower_ray_queries.c | 8 +++++--- src/amd/vulkan/radv_cmd_buffer.c | 3 +++ src/amd/vulkan/radv_debug.h | 1 + src/amd/vulkan/radv_instance.c | 1 + src/amd/vulkan/radv_pipeline.c | 2 ++ src/amd/vulkan/radv_private.h | 1 + 7 files changed, 16 insertions(+), 3 deletions(-) diff --git a/docs/envvars.rst b/docs/envvars.rst index 21b87dbf615..fece46e794c 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -1160,6 +1160,9 @@ RADV driver environment variables disable NGG for GFX10 and GFX10.3 ``nonggc`` disable NGG culling on GPUs where it's enabled by default (GFX10.3+ only). + ``nort`` + skip executing vkCmdTraceRays and ray queries (RT extensions will still be + advertised) ``notccompatcmask`` disable TC-compat CMASK for MSAA surfaces ``noumr`` diff --git a/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c b/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c index 80e25fc6fd0..4693a5420cf 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c +++ b/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c @@ -27,6 +27,7 @@ #include "util/hash_table.h" #include "bvh/bvh.h" +#include "radv_debug.h" #include "radv_nir.h" #include "radv_private.h" #include "radv_rt_common.h" @@ -372,7 +373,7 @@ enum rq_intersection_type { static void lower_rq_initialize(nir_builder *b, nir_ssa_def *index, nir_intrinsic_instr *instr, - struct ray_query_vars *vars) + struct ray_query_vars *vars, struct radv_instance *instance) { rq_store_var(b, index, vars->flags, instr->src[2].ssa, 0x1); rq_store_var(b, index, vars->cull_mask, nir_ishl_imm(b, instr->src[3].ssa, 24), 0x1); @@ -420,7 +421,8 @@ lower_rq_initialize(nir_builder *b, nir_ssa_def *index, nir_intrinsic_instr *ins rq_store_var(b, index, vars->trav.top_stack, nir_imm_int(b, -1), 1); - rq_store_var(b, index, vars->incomplete, nir_imm_bool(b, true), 0x1); + rq_store_var(b, index, vars->incomplete, + nir_imm_bool(b, !(instance->debug_flags & RADV_DEBUG_NO_RT)), 0x1); } static nir_ssa_def * @@ -741,7 +743,7 @@ radv_nir_lower_ray_queries(struct nir_shader *shader, struct radv_device *device lower_rq_generate_intersection(&builder, index, intrinsic, vars); break; case nir_intrinsic_rq_initialize: - lower_rq_initialize(&builder, index, intrinsic, vars); + lower_rq_initialize(&builder, index, intrinsic, vars, device->instance); break; case nir_intrinsic_rq_load: new_dest = lower_rq_load(&builder, index, intrinsic, vars); diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index d245a3027f6..1a85313c51b 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -10037,6 +10037,9 @@ static void radv_trace_rays(struct radv_cmd_buffer *cmd_buffer, const VkTraceRaysIndirectCommand2KHR *tables, uint64_t indirect_va, enum radv_rt_mode mode) { + if (cmd_buffer->device->instance->debug_flags & RADV_DEBUG_NO_RT) + return; + struct radv_compute_pipeline *pipeline = &cmd_buffer->state.rt_pipeline->base; struct radv_shader *rt_prolog = cmd_buffer->state.rt_prolog; uint32_t base_reg = rt_prolog->info.user_data_0; diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h index 8598b0a6ae8..ea85539dc03 100644 --- a/src/amd/vulkan/radv_debug.h +++ b/src/amd/vulkan/radv_debug.h @@ -71,6 +71,7 @@ enum { RADV_DEBUG_EXTRA_MD = 1ull << 40, RADV_DEBUG_NO_GPL = 1ull << 41, RADV_DEBUG_VIDEO_ARRAY_PATH = 1ull << 42, + RADV_DEBUG_NO_RT = 1ull << 43, }; enum { diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 5c97955888c..7be8b5a354a 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -77,6 +77,7 @@ static const struct debug_control radv_debug_options[] = { {"extra_md", RADV_DEBUG_EXTRA_MD}, {"nogpl", RADV_DEBUG_NO_GPL}, {"videoarraypath", RADV_DEBUG_VIDEO_ARRAY_PATH}, + {"nort", RADV_DEBUG_NO_RT}, {NULL, 0}}; const char * diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 1745a4a6549..9d23c5780cf 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -204,6 +204,8 @@ radv_get_hash_flags(const struct radv_device *device, bool stats) hash_flags |= RADV_HASH_SHADER_NO_FMASK; if (device->physical_device->use_ngg_streamout) hash_flags |= RADV_HASH_SHADER_NGG_STREAMOUT; + if (device->instance->debug_flags & RADV_DEBUG_NO_RT) + hash_flags |= RADV_HASH_SHADER_NO_RT; return hash_flags; } diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index f54179a1697..b8026035fc9 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2162,6 +2162,7 @@ struct radv_event { #define RADV_HASH_SHADER_RT_WAVE64 (1 << 18) #define RADV_HASH_SHADER_NO_FMASK (1 << 19) #define RADV_HASH_SHADER_NGG_STREAMOUT (1 << 20) +#define RADV_HASH_SHADER_NO_RT (1 << 21) struct radv_pipeline_key; struct radv_ray_tracing_group;