ac/llvm,radeonsi: lower nir_load_ring_tess_factors_amd
authorQiang Yu <yuq825@gmail.com>
Tue, 14 Feb 2023 07:26:56 +0000 (15:26 +0800)
committerMarge Bot <emma+marge@anholt.net>
Thu, 16 Mar 2023 04:33:30 +0000 (04:33 +0000)
No one implement this intrinsic in llvm, so remove the
llvm entry too.

This will be used in TCS nir tess factor write.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21437>

src/amd/llvm/ac_nir_to_llvm.c
src/gallium/drivers/radeonsi/si_nir_lower_abi.c

index 1d12ba9..194296b 100644 (file)
@@ -3437,7 +3437,6 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
    case nir_intrinsic_load_base_vertex:
    case nir_intrinsic_load_first_vertex:
    case nir_intrinsic_load_tess_rel_patch_id_amd:
-   case nir_intrinsic_load_ring_tess_factors_amd:
    case nir_intrinsic_load_ring_tess_offchip_amd:
    case nir_intrinsic_load_ring_esgs_amd:
    case nir_intrinsic_load_ring_attr_amd:
index a20b984..a0bc84f 100644 (file)
@@ -173,6 +173,42 @@ fetch_framebuffer(nir_builder *b, struct si_shader_args *args,
                                   .access = ACCESS_CAN_REORDER);
 }
 
+static nir_ssa_def *build_tess_factor_ring_desc(nir_builder *b, struct si_screen *screen,
+                                                struct si_shader_args *args)
+{
+   nir_ssa_def *addr = ac_nir_load_arg(b, &args->ac, args->tcs_out_lds_layout);
+   /* TCS only receives high 13 bits of the address. */
+   addr = nir_iand_imm(b, addr, 0xfff80000);
+   addr = nir_iadd_imm(b, addr, screen->hs.tess_offchip_ring_size);
+
+   uint32_t rsrc3 =
+      S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
+      S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
+      S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
+      S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W);
+
+   if (screen->info.gfx_level >= GFX11) {
+      rsrc3 |= S_008F0C_FORMAT(V_008F0C_GFX11_FORMAT_32_FLOAT) |
+               S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_RAW);
+   } else if (screen->info.gfx_level >= GFX10) {
+      rsrc3 |= S_008F0C_FORMAT(V_008F0C_GFX10_FORMAT_32_FLOAT) |
+               S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_RAW) |
+               S_008F0C_RESOURCE_LEVEL(1);
+   } else {
+      rsrc3 |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
+               S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
+   }
+
+   nir_ssa_def *comp[4] = {
+      addr,
+      nir_imm_int(b, S_008F04_BASE_ADDRESS_HI(screen->info.address32_hi)),
+      nir_imm_int(b, 0xffffffff),
+      nir_imm_int(b, rsrc3),
+   };
+
+   return nir_vec(b, comp, 4);
+}
+
 static bool lower_abi_instr(nir_builder *b, nir_instr *instr, struct lower_abi_state *s)
 {
    if (instr->type != nir_instr_type_intrinsic)
@@ -436,6 +472,9 @@ static bool lower_abi_instr(nir_builder *b, nir_instr *instr, struct lower_abi_s
       replacement = fetch_framebuffer(b, args, sel, key);
       break;
    }
+   case nir_intrinsic_load_ring_tess_factors_amd:
+      replacement = build_tess_factor_ring_desc(b, sel->screen, args);
+      break;
    default:
       return false;
    }