Contains a global wave ID of legacy GS waves.
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22690>
bld.sopp(aco_opcode::s_sendmsg, bld.m0(m0_content), -1, imm);
break;
}
+ case nir_intrinsic_load_gs_wave_id_amd: {
+ Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
+ if (ctx->args->merged_wave_info.used)
+ bld.pseudo(aco_opcode::p_extract, Definition(dst), bld.def(s1, scc),
+ get_arg(ctx, ctx->args->merged_wave_info), Operand::c32(2u),
+ Operand::c32(8u), Operand::zero());
+ else if (ctx->args->gs_wave_id.used)
+ bld.copy(Definition(dst), get_arg(ctx, ctx->args->gs_wave_id));
+ else
+ unreachable("Shader doesn't have GS wave ID.");
+ break;
+ }
case nir_intrinsic_is_subgroup_invocation_lt_amd: {
Temp src = bld.as_uniform(get_ssa_temp(ctx, instr->src[0].ssa));
bld.copy(Definition(get_ssa_temp(ctx, &instr->dest.ssa)), lanecount_to_mask(ctx, src));
ac_build_sendmsg(&ctx->ac, imm, m0_content);
break;
}
+ case nir_intrinsic_load_gs_wave_id_amd: {
+ if (ctx->args->merged_wave_info.used)
+ result = ac_unpack_param(&ctx->ac, ac_get_arg(&ctx->ac, ctx->args->merged_wave_info), 16, 8);
+ else if (ctx->args->gs_wave_id.used)
+ result = ac_get_arg(&ctx->ac, ctx->args->gs_wave_id);
+ else
+ unreachable("Shader doesn't have GS wave ID.");
+ break;
+ }
case nir_intrinsic_load_tess_coord: {
LLVMValueRef coord[] = {
ctx->abi->tes_u_replaced ? ctx->abi->tes_u_replaced : ac_get_arg(&ctx->ac, ctx->args->tes_u),
case nir_intrinsic_load_num_vertices_per_primitive_amd:
case nir_intrinsic_load_streamout_buffer_amd:
case nir_intrinsic_load_ordered_id_amd:
+ case nir_intrinsic_load_gs_wave_id_amd:
case nir_intrinsic_load_provoking_vtx_in_prim_amd:
case nir_intrinsic_load_lds_ngg_scratch_base_amd:
case nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd:
# Merged wave info. Bits 0-7 are the ES thread count, 8-15 are the GS thread count, 16-24 is the
# GS Wave ID, 24-27 is the wave index in the workgroup, and 28-31 is the workgroup size in waves.
system_value("merged_wave_info_amd", dest_comp=1)
+# Global ID for GS waves on GCN/RDNA legacy GS.
+system_value("gs_wave_id_amd", dest_comp=1)
# Whether the shader should clamp vertex color outputs to [0, 1].
system_value("clamp_vertex_color_amd", dest_comp=1, bit_sizes=[1])
# Whether the shader should cull front facing triangles.