From 872c536a88aee6f511fa5d2557bb91feed7ccce2 Mon Sep 17 00:00:00 2001 From: Natalie Vock Date: Wed, 28 Jan 2026 12:18:35 +0100 Subject: [PATCH] radv/rt: Fix discardable attributes on chit and traversal shaders It was incorrect to mark chit/miss arguments as discardable without the equivalent in the traversal shader. Also, tail calls with modified parameters that aren't marked discardable are incorrect. This could lead to random corruption by clobbering parameter values across two levels of nested calls: A Raygen shader calls traversal, expecting e.g. the ray tMax parameter to be preserved. Traversal overwrites the parameter's register with the hit t and tail-calls chit, which immediately returns to raygen. Now the raygen shader still has the clobbered tMax (which is actually the ray hit t) - if it calls traversal multiple times, the second traversal iteration may use the previous ray's hit t as tMax instead of the intended value. Cc: mesa-stable Part-of: (cherry picked from commit 3275be503c39d3f572cce8ed52fe648751041084) --- .pick_status.json | 2 +- .../vulkan/nir/radv_nir_rt_stage_functions.c | 27 +++++++++---------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index eb941a6af46..ec7f7d535c1 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1614,7 +1614,7 @@ "description": "radv/rt: Fix discardable attributes on chit and traversal shaders", "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_stage_functions.c b/src/amd/vulkan/nir/radv_nir_rt_stage_functions.c index 941ab373b7f..342f715dedf 100644 --- a/src/amd/vulkan/nir/radv_nir_rt_stage_functions.c +++ b/src/amd/vulkan/nir/radv_nir_rt_stage_functions.c @@ -39,7 +39,7 @@ radv_nir_init_traversal_params(nir_function *function, unsigned payload_size) function->params = rzalloc_array_size(function->shader, sizeof(nir_parameter), function->num_params); radv_nir_init_common_rt_params(function); radv_nir_param_from_type(function->params + TRAVERSAL_ARG_TRAVERSAL_ADDR, glsl_uint64_t_type(), true, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_SHADER_RECORD_PTR, glsl_uint64_t_type(), false, 0); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_SHADER_RECORD_PTR, glsl_uint64_t_type(), false, ACO_NIR_PARAM_ATTRIB_DISCARDABLE); radv_nir_param_from_type(function->params + TRAVERSAL_ARG_ACCEL_STRUCT, glsl_uint64_t_type(), false, 0); radv_nir_param_from_type(function->params + TRAVERSAL_ARG_CULL_MASK_AND_FLAGS, glsl_uint_type(), false, 0); radv_nir_param_from_type(function->params + TRAVERSAL_ARG_SBT_OFFSET, glsl_uint_type(), false, 0); @@ -49,12 +49,13 @@ radv_nir_init_traversal_params(nir_function *function, unsigned payload_size) radv_nir_param_from_type(function->params + TRAVERSAL_ARG_RAY_TMIN, glsl_float_type(), false, 0); radv_nir_param_from_type(function->params + TRAVERSAL_ARG_RAY_DIRECTION, glsl_vector_type(GLSL_TYPE_UINT, 3), false, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_RAY_TMAX, glsl_float_type(), false, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_PRIMITIVE_ADDR, glsl_uint64_t_type(), false, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_PRIMITIVE_ID, glsl_uint_type(), false, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_INSTANCE_ADDR, glsl_uint64_t_type(), false, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_GEOMETRY_ID_AND_FLAGS, glsl_uint_type(), false, 0); - radv_nir_param_from_type(function->params + TRAVERSAL_ARG_HIT_KIND, glsl_uint_type(), false, 0); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_RAY_TMAX, glsl_float_type(), false, + ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_PRIMITIVE_ADDR, glsl_uint64_t_type(), false, ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_PRIMITIVE_ID, glsl_uint_type(), false, ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_INSTANCE_ADDR, glsl_uint64_t_type(), false, ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_GEOMETRY_ID_AND_FLAGS, glsl_uint_type(), false, ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + TRAVERSAL_ARG_HIT_KIND, glsl_uint_type(), false, ACO_NIR_PARAM_ATTRIB_DISCARDABLE); for (unsigned i = 0; i < DIV_ROUND_UP(payload_size, 4); ++i) { radv_nir_return_param_from_type(function->params + TRAVERSAL_ARG_PAYLOAD_BASE + i, glsl_uint_type(), false, 0); } @@ -128,15 +129,11 @@ radv_nir_init_rt_function_params(nir_function *function, mesa_shader_stage stage radv_nir_init_common_rt_params(function); radv_nir_param_from_type(function->params + CHIT_MISS_ARG_TRAVERSAL_ADDR, glsl_uint64_t_type(), true, 0); radv_nir_param_from_type(function->params + CHIT_MISS_ARG_SHADER_RECORD_PTR, glsl_uint64_t_type(), false, 0); - radv_nir_param_from_type(function->params + CHIT_MISS_ARG_ACCEL_STRUCT, glsl_uint64_t_type(), false, - ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + CHIT_MISS_ARG_ACCEL_STRUCT, glsl_uint64_t_type(), false, 0); radv_nir_param_from_type(function->params + CHIT_MISS_ARG_CULL_MASK_AND_FLAGS, glsl_uint_type(), false, 0); - radv_nir_param_from_type(function->params + CHIT_MISS_ARG_SBT_OFFSET, glsl_uint_type(), false, - ACO_NIR_PARAM_ATTRIB_DISCARDABLE); - radv_nir_param_from_type(function->params + CHIT_MISS_ARG_SBT_STRIDE, glsl_uint_type(), false, - ACO_NIR_PARAM_ATTRIB_DISCARDABLE); - radv_nir_param_from_type(function->params + CHIT_MISS_ARG_MISS_INDEX, glsl_uint_type(), false, - ACO_NIR_PARAM_ATTRIB_DISCARDABLE); + radv_nir_param_from_type(function->params + CHIT_MISS_ARG_SBT_OFFSET, glsl_uint_type(), false, 0); + radv_nir_param_from_type(function->params + CHIT_MISS_ARG_SBT_STRIDE, glsl_uint_type(), false, 0); + radv_nir_param_from_type(function->params + CHIT_MISS_ARG_MISS_INDEX, glsl_uint_type(), false, 0); radv_nir_param_from_type(function->params + CHIT_MISS_ARG_RAY_ORIGIN, glsl_vector_type(GLSL_TYPE_UINT, 3), false, 0); radv_nir_param_from_type(function->params + CHIT_MISS_ARG_RAY_TMIN, glsl_float_type(), false, 0);