radv: copy the number of TCS vertices out to TES shader info
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 27 Jul 2023 06:43:02 +0000 (08:43 +0200)
committerMarge Bot <emma+marge@anholt.net>
Fri, 28 Jul 2023 08:21:40 +0000 (08:21 +0000)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24346>

src/amd/vulkan/nir/radv_nir_lower_abi.c
src/amd/vulkan/radv_shader.h
src/amd/vulkan/radv_shader_info.c

index 6489a82..f422cc8 100644 (file)
@@ -150,7 +150,7 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
           */
          nir_ssa_def *arg = ac_nir_load_arg(b, &s->args->ac, s->args->ac.tes_rel_patch_id);
          nir_intrinsic_instr *load_arg = nir_instr_as_intrinsic(arg->parent_instr);
-         nir_intrinsic_set_arg_upper_bound_u32_amd(load_arg, 2048 / MAX2(b->shader->info.tess.tcs_vertices_out, 1));
+         nir_intrinsic_set_arg_upper_bound_u32_amd(load_arg, 2048 / MAX2(s->info->tes.tcs_vertices_out, 1));
          replacement = arg;
       } else {
          unreachable("invalid tessellation shader stage");
@@ -164,7 +164,7 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
             replacement = GET_SGPR_FIELD_NIR(s->args->tcs_offchip_layout, TCS_OFFCHIP_LAYOUT_PATCH_CONTROL_POINTS);
          }
       } else if (stage == MESA_SHADER_TESS_EVAL) {
-         replacement = nir_imm_int(b, b->shader->info.tess.tcs_vertices_out);
+         replacement = nir_imm_int(b, s->info->tes.tcs_vertices_out);
       } else
          unreachable("invalid tessellation shader stage");
       break;
@@ -278,9 +278,16 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
       break;
    }
    case nir_intrinsic_load_hs_out_patch_data_offset_amd: {
-      unsigned out_vertices_per_patch = b->shader->info.tess.tcs_vertices_out;
+      unsigned out_vertices_per_patch;
       unsigned num_tcs_outputs =
          stage == MESA_SHADER_TESS_CTRL ? s->info->tcs.num_linked_outputs : s->info->tes.num_linked_inputs;
+
+      if (stage == MESA_SHADER_TESS_CTRL) {
+         out_vertices_per_patch = s->info->tcs.tcs_vertices_out;
+      } else {
+         out_vertices_per_patch = s->info->tes.tcs_vertices_out;
+      }
+
       int per_vertex_output_patch_size = out_vertices_per_patch * num_tcs_outputs * 16u;
 
       if (s->info->num_tess_patches) {
index daaf011..df0f23d 100644 (file)
@@ -346,6 +346,7 @@ struct radv_shader_info {
       enum gl_tess_spacing spacing;
       bool ccw;
       bool point_mode;
+      unsigned tcs_vertices_out;
       uint8_t num_linked_inputs;
       uint8_t num_linked_patch_inputs;
       uint8_t num_linked_outputs;
index 8afc134..c242534 100644 (file)
@@ -491,6 +491,7 @@ gather_shader_info_tes(struct radv_device *device, const nir_shader *nir, struct
    info->tes.spacing = nir->info.tess.spacing;
    info->tes.ccw = nir->info.tess.ccw;
    info->tes.point_mode = nir->info.tess.point_mode;
+   info->tes.tcs_vertices_out = nir->info.tess.tcs_vertices_out;
 
    if (!info->outputs_linked)
       info->tes.num_linked_outputs = util_last_bit64(nir->info.outputs_written);