ac/llvm,radeonsi: lower ps color load in nir

Remove the color0/1 in ac_shader_abi which is used by
radeonsi only.

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/21683>
This commit is contained in:
Qiang Yu
2023-04-13 10:43:48 +08:00
committed by Marge Bot
parent 35d5c7c251
commit cc891e871e
6 changed files with 25 additions and 34 deletions
-6
View File
@@ -3544,12 +3544,6 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
case nir_intrinsic_is_helper_invocation:
result = ac_build_is_helper_invocation(&ctx->ac);
break;
case nir_intrinsic_load_color0:
result = ctx->abi->color0;
break;
case nir_intrinsic_load_color1:
result = ctx->abi->color1;
break;
case nir_intrinsic_load_user_data_amd:
assert(LLVMTypeOf(ctx->abi->user_data) == ctx->ac.v4i32);
result = ctx->abi->user_data;
-1
View File
@@ -47,7 +47,6 @@ struct ac_shader_abi {
LLVMValueRef vs_rel_patch_id;
LLVMValueRef instance_id;
LLVMValueRef persp_centroid, linear_centroid;
LLVMValueRef color0, color1;
LLVMValueRef user_data;
/* replaced registers when culling enabled */
@@ -488,6 +488,29 @@ static bool lower_abi_instr(nir_builder *b, nir_instr *instr, struct lower_abi_s
replacement = nir_ilt(b, prim_mask, nir_imm_int(b, 0));
break;
}
case nir_intrinsic_load_color0:
case nir_intrinsic_load_color1: {
uint32_t colors_read = sel->info.colors_read;
int start, offset;
if (intrin->intrinsic == nir_intrinsic_load_color0) {
start = 0;
offset = 0;
} else {
start = 4;
offset = util_bitcount(colors_read & 0xf);
}
nir_ssa_def *color[4];
for (int i = 0; i < 4; i++) {
color[i] = colors_read & BITFIELD_BIT(start + i) ?
ac_nir_load_arg_at_offset(b, &args->ac, args->color_start, offset++) :
nir_ssa_undef(b, 1, 32);
}
replacement = nir_vec(b, color, 4);
break;
}
default:
return false;
}
+1 -1
View File
@@ -706,7 +706,7 @@ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args)
unsigned num_color_elements = util_bitcount(shader->selector->info.colors_read);
for (i = 0; i < num_color_elements; i++)
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, NULL);
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, i ? NULL : &args->color_start);
num_prolog_vgprs += num_color_elements;
}
@@ -82,6 +82,7 @@ struct si_shader_args {
/* PS */
struct ac_arg pos_fixed_pt;
struct ac_arg alpha_reference;
struct ac_arg color_start;
/* CS */
struct ac_arg block_size;
struct ac_arg cs_user_data;
@@ -832,32 +832,6 @@ static bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shade
break;
case MESA_SHADER_FRAGMENT: {
unsigned colors_read = ctx->shader->selector->info.colors_read;
LLVMValueRef main_fn = ctx->main_fn.value;
LLVMValueRef undef = LLVMGetUndef(ctx->ac.f32);
unsigned offset = SI_PARAM_POS_FIXED_PT + 1;
if (colors_read & 0x0f) {
unsigned mask = colors_read & 0x0f;
LLVMValueRef values[4];
values[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : undef;
values[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : undef;
values[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : undef;
values[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : undef;
ctx->abi.color0 = ac_to_integer(&ctx->ac, ac_build_gather_values(&ctx->ac, values, 4));
}
if (colors_read & 0xf0) {
unsigned mask = (colors_read & 0xf0) >> 4;
LLVMValueRef values[4];
values[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : undef;
values[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : undef;
values[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : undef;
values[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : undef;
ctx->abi.color1 = ac_to_integer(&ctx->ac, ac_build_gather_values(&ctx->ac, values, 4));
}
ctx->abi.num_interp = si_get_ps_num_interp(shader);
ctx->abi.kill_ps_if_inf_interp =