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:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user