radv: Use a global address for ray_launch_size
authorKonstantin Seurer <konstantin.seurer@gmail.com>
Thu, 30 Jun 2022 14:19:25 +0000 (16:19 +0200)
committerMarge Bot <emma+marge@anholt.net>
Thu, 14 Jul 2022 16:35:31 +0000 (16:35 +0000)
Required for indirect(2) ray tracing to work.

Fixes: b30f96dd ("radv,aco: Use ray_launch_size_addr")
Signed-off-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17316>

src/amd/compiler/aco_instruction_selection.cpp
src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_shader_args.c

index 66adb16..697ec2d 100644 (file)
@@ -8435,7 +8435,8 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
    }
    case nir_intrinsic_load_ray_launch_size_addr_amd: {
       Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
-      Temp addr = convert_pointer_to_64_bit(ctx, get_arg(ctx, ctx->args->ac.ray_launch_size_addr));
+      Temp addr = get_arg(ctx, ctx->args->ac.ray_launch_size_addr);
+      assert(addr.regClass() == s2);
       bld.copy(Definition(dst), Operand(addr));
       break;
    }
index ee66c2e..f51aba1 100644 (file)
@@ -7801,7 +7801,7 @@ radv_trace_rays(struct radv_cmd_buffer *cmd_buffer, const VkTraceRaysIndirectCom
       radv_lookup_user_sgpr(&pipeline->base, MESA_SHADER_COMPUTE, AC_UD_CS_RAY_LAUNCH_SIZE_ADDR);
    if (size_loc->sgpr_idx != -1) {
       radv_emit_shader_pointer(cmd_buffer->device, cmd_buffer->cs,
-                               base_reg + size_loc->sgpr_idx * 4, launch_size_va, false);
+                               base_reg + size_loc->sgpr_idx * 4, launch_size_va, true);
    }
 
    radv_dispatch(cmd_buffer, &info, pipeline, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
index 9c4a61a..9564899 100644 (file)
@@ -51,7 +51,8 @@ static void
 set_loc_shader_ptr(struct radv_shader_args *args, int idx, uint8_t *sgpr_idx)
 {
    bool use_32bit_pointers = idx != AC_UD_SCRATCH_RING_OFFSETS &&
-                             idx != AC_UD_CS_TASK_RING_OFFSETS;
+                             idx != AC_UD_CS_TASK_RING_OFFSETS &&
+                             idx != AC_UD_CS_RAY_LAUNCH_SIZE_ADDR;
 
    set_loc_shader(args, idx, sgpr_idx, use_32bit_pointers ? 1 : 2);
 }
@@ -175,7 +176,7 @@ allocate_user_sgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info
       if (info->cs.uses_grid_size)
          user_sgpr_count += args->load_grid_size_from_user_sgpr ? 3 : 2;
       if (info->cs.uses_ray_launch_size)
-         user_sgpr_count++;
+         user_sgpr_count += 2;
       if (info->vs.needs_draw_id)
          user_sgpr_count += 1;
       if (info->cs.uses_task_rings)
@@ -575,7 +576,7 @@ radv_declare_shader_args(enum amd_gfx_level gfx_level, const struct radv_pipelin
       }
 
       if (info->cs.uses_ray_launch_size) {
-         ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_PTR, &args->ac.ray_launch_size_addr);
+         ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_PTR, &args->ac.ray_launch_size_addr);
       }
 
       if (info->vs.needs_draw_id) {