diff --git a/src/intel/genxml/gen300_rt.xml b/src/intel/genxml/gen300_rt.xml
index 9579d1b4ef5..73811e49ce8 100644
--- a/src/intel/genxml/gen300_rt.xml
+++ b/src/intel/genxml/gen300_rt.xml
@@ -9,4 +9,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h
index 2aa9881bea6..2abdcc4c690 100644
--- a/src/intel/vulkan/anv_genX.h
+++ b/src/intel/vulkan/anv_genX.h
@@ -274,6 +274,22 @@ genX(compute_pipeline_emit)(struct anv_compute_pipeline *pipeline);
void
genX(ray_tracing_pipeline_emit)(struct anv_ray_tracing_pipeline *pipeline);
+#if GFX_VERx10 >= 300
+#define anv_shader_bin_get_handler(bin, local_arg_offset) ({ \
+ assert((local_arg_offset) % 8 == 0); \
+ const struct brw_bs_prog_data *prog_data = \
+ brw_bs_prog_data_const(bin->prog_data); \
+ assert(prog_data->simd_size == 16); \
+ \
+ (struct GENX(CALL_STACK_HANDLER)) { \
+ .OffsetToLocalArguments = (local_arg_offset) / 8, \
+ .BindlessShaderDispatchMode = RT_SIMD16, \
+ .KernelStartPointer = bin->kernel.offset, \
+ .RegistersPerThread = ptl_register_blocks(prog_data->base.grf_used), \
+ }; \
+})
+#endif
+
#if GFX_VERx10 >= 300
#define anv_shader_bin_get_bsr(bin, local_arg_offset) ({ \
assert((local_arg_offset) % 8 == 0); \
diff --git a/src/intel/vulkan/genX_cmd_compute.c b/src/intel/vulkan/genX_cmd_compute.c
index cc55f60acd5..d267658a146 100644
--- a/src/intel/vulkan/genX_cmd_compute.c
+++ b/src/intel/vulkan/genX_cmd_compute.c
@@ -1031,8 +1031,13 @@ cmd_buffer_emit_rt_dispatch_globals(struct anv_cmd_buffer *cmd_buffer,
.bo = rt->scratch.bo,
.offset = rt->scratch.layout.ray_stack_start,
},
+#if GFX_VERx10 == 300
+ .CallStackHandler = anv_shader_bin_get_handler(
+ cmd_buffer->device->rt_trivial_return, 0),
+#else
.CallStackHandler = anv_shader_bin_get_bsr(
cmd_buffer->device->rt_trivial_return, 0),
+#endif
.AsyncRTStackSize = rt->scratch.layout.ray_stack_stride / 64,
.NumDSSRTStacks = rt->scratch.layout.stack_ids_per_dss,
.MaxBVHLevels = BRW_RT_MAX_BVH_LEVELS,
@@ -1079,8 +1084,13 @@ cmd_buffer_emit_rt_dispatch_globals_indirect(struct anv_cmd_buffer *cmd_buffer,
.bo = rt->scratch.bo,
.offset = rt->scratch.layout.ray_stack_start,
},
+#if GFX_VERx10 == 300
+ .CallStackHandler = anv_shader_bin_get_handler(
+ cmd_buffer->device->rt_trivial_return, 0),
+#else
.CallStackHandler = anv_shader_bin_get_bsr(
cmd_buffer->device->rt_trivial_return, 0),
+#endif
.AsyncRTStackSize = rt->scratch.layout.ray_stack_stride / 64,
.NumDSSRTStacks = rt->scratch.layout.stack_ids_per_dss,
.MaxBVHLevels = BRW_RT_MAX_BVH_LEVELS,