amd: lower load_frag_coord in NIR

Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32782>
This commit is contained in:
Marek Olšák
2024-12-25 11:32:40 -05:00
committed by Marge Bot
parent 58cb155068
commit 13cb5c7b72
4 changed files with 6 additions and 41 deletions
+6
View File
@@ -174,6 +174,12 @@ lower_intrinsic_to_arg(nir_builder *b, nir_instr *instr, void *state)
case nir_intrinsic_load_pixel_coord:
replacement = nir_unpack_32_2x16(b, ac_nir_load_arg(b, s->args, s->args->pos_fixed_pt));
break;
case nir_intrinsic_load_frag_coord:
replacement = nir_vec4(b, ac_nir_load_arg(b, s->args, s->args->frag_pos[0]),
ac_nir_load_arg(b, s->args, s->args->frag_pos[1]),
ac_nir_load_arg(b, s->args, s->args->frag_pos[2]),
ac_nir_load_arg(b, s->args, s->args->frag_pos[3]));
break;
default:
return false;
}
@@ -5527,29 +5527,6 @@ emit_interp_mov_instr(isel_context* ctx, unsigned idx, unsigned component, unsig
emit_extract_vector(ctx, tmp, high_16bits, dst);
}
void
emit_load_frag_coord(isel_context* ctx, Temp dst, unsigned num_components)
{
Builder bld(ctx->program, ctx->block);
aco_ptr<Instruction> vec(
create_instruction(aco_opcode::p_create_vector, Format::PSEUDO, num_components, 1));
for (unsigned i = 0; i < num_components; i++) {
if (ctx->args->frag_pos[i].used)
vec->operands[i] = Operand(get_arg(ctx, ctx->args->frag_pos[i]));
else
vec->operands[i] = Operand(v1);
}
for (Operand& op : vec->operands)
op = op.isUndefined() ? Operand::zero() : op;
vec->definitions[0] = Definition(dst);
ctx->block->instructions.emplace_back(std::move(vec));
emit_split_vector(ctx, dst, num_components);
return;
}
void
emit_load_frag_shading_rate(isel_context* ctx, Temp dst)
{
@@ -8154,10 +8131,6 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
bld.copy(Definition(dst), Operand(get_arg(ctx, ctx->args->view_index)));
break;
}
case nir_intrinsic_load_frag_coord: {
emit_load_frag_coord(ctx, get_ssa_temp(ctx, &instr->def), 4);
break;
}
case nir_intrinsic_load_frag_shading_rate:
emit_load_frag_shading_rate(ctx, get_ssa_temp(ctx, &instr->def));
break;
@@ -560,7 +560,6 @@ init_context(isel_context* ctx, nir_shader* shader)
case nir_intrinsic_load_barycentric_at_offset:
case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_load_front_face_fsign:
case nir_intrinsic_load_frag_coord:
case nir_intrinsic_load_frag_shading_rate:
case nir_intrinsic_load_sample_pos:
case nir_intrinsic_load_local_invocation_id:
-13
View File
@@ -2873,16 +2873,6 @@ emit_load_frag_shading_rate(struct ac_nir_context *ctx)
return LLVMBuildOr(ctx->ac.builder, x_rate, y_rate, "");
}
static LLVMValueRef
emit_load_frag_coord(struct ac_nir_context *ctx)
{
LLVMValueRef values[4] = {
ac_get_arg(&ctx->ac, ctx->args->frag_pos[0]), ac_get_arg(&ctx->ac, ctx->args->frag_pos[1]),
ac_get_arg(&ctx->ac, ctx->args->frag_pos[2]), ac_get_arg(&ctx->ac, ctx->args->frag_pos[3])};
return ac_to_integer(&ctx->ac, ac_build_gather_values(&ctx->ac, values, 4));
}
static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *instr)
{
LLVMValueRef result = NULL;
@@ -3024,9 +3014,6 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
case nir_intrinsic_load_sample_pos:
result = load_sample_pos(ctx);
break;
case nir_intrinsic_load_frag_coord:
result = emit_load_frag_coord(ctx);
break;
case nir_intrinsic_load_frag_shading_rate:
result = emit_load_frag_shading_rate(ctx);
break;