amd: Add and implement gs_wave_id sysval.

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>
This commit is contained in:
Timur Kristóf
2023-04-26 14:27:10 +02:00
committed by Marge Bot
parent c1591bfc28
commit f66281c7fb
4 changed files with 24 additions and 0 deletions
@@ -9018,6 +9018,18 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
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));
+9
View File
@@ -3848,6 +3848,15 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
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),
@@ -199,6 +199,7 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
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:
+2
View File
@@ -1460,6 +1460,8 @@ system_value("prim_xfb_query_enabled_amd", dest_comp=1, bit_sizes=[1])
# 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.