From 8135a7614d5bbc9d34b59cd0e7cd34408611e7a1 Mon Sep 17 00:00:00 2001 From: Friedrich Vock Date: Thu, 12 Dec 2024 18:03:17 +0100 Subject: [PATCH] radv/rt: Remove nir_intrinsic_execute_callable instrs in monolithic mode It's allowed to place OpExecuteCallableKHR in a SPIR-V, even if the RT pipeline doesn't contain any callable shaders. Unreal hits this case and crashes. We can assume the intrinsic never gets executed, so we can simply remove it. Cc: mesa-stable (cherry picked from commit 0c02a7e8e89aceb93302adef3e8f730a5583d358) Part-of: --- .pick_status.json | 2 +- src/amd/vulkan/nir/radv_nir_rt_shader.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 7c0e23e027f..8ca7a45164b 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -334,7 +334,7 @@ "description": "radv/rt: Remove nir_intrinsic_execute_callable instrs in monolithic mode", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/vulkan/nir/radv_nir_rt_shader.c b/src/amd/vulkan/nir/radv_nir_rt_shader.c index 8dcd853aa72..e661ed20428 100644 --- a/src/amd/vulkan/nir/radv_nir_rt_shader.c +++ b/src/amd/vulkan/nir/radv_nir_rt_shader.c @@ -1772,7 +1772,12 @@ lower_rt_instruction_monolithic(nir_builder *b, nir_instr *instr, void *data) switch (intr->intrinsic) { case nir_intrinsic_execute_callable: - unreachable("nir_intrinsic_execute_callable"); + /* It's allowed to place OpExecuteCallableKHR in a SPIR-V, even if the RT pipeline doesn't contain + * any callable shaders. However, it's impossible to execute the instruction in a valid way, so just remove any + * nir_intrinsic_execute_callable we encounter. + */ + nir_instr_remove(instr); + return true; case nir_intrinsic_trace_ray: { vars->payload_offset = nir_src_as_uint(intr->src[10]);