diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index aae3a1a500c..f0adf50fc5a 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -144,6 +144,20 @@ bi_emit_ld_output(bi_context *ctx, nir_intrinsic_instr *instr) bi_emit(ctx, ins); } +static enum bifrost_interp_mode +bi_interp_for_intrinsic(nir_intrinsic_op op) +{ + switch (op) { + case nir_intrinsic_load_barycentric_centroid: + return BIFROST_INTERP_CENTROID; + case nir_intrinsic_load_barycentric_sample: + return BIFROST_INTERP_SAMPLE; + case nir_intrinsic_load_barycentric_pixel: + default: + return BIFROST_INTERP_CENTER; + } +} + static void bi_emit_ld_vary(bi_context *ctx, nir_intrinsic_instr *instr) { @@ -154,6 +168,14 @@ bi_emit_ld_vary(bi_context *ctx, nir_intrinsic_instr *instr) ins.dest_type = nir_type_float | nir_dest_bit_size(instr->dest); ins.format = ins.dest_type; + if (instr->intrinsic == nir_intrinsic_load_interpolated_input) { + nir_intrinsic_instr *parent = nir_src_as_intrinsic(instr->src[0]); + if (parent) { + ins.load_vary.interp_mode = + bi_interp_for_intrinsic(parent->intrinsic); + } + } + if (nir_src_is_const(*nir_get_io_offset_src(instr))) { /* Zero it out for direct */ ins.src[1] = BIR_INDEX_ZERO; @@ -681,6 +703,8 @@ emit_intrinsic(bi_context *ctx, nir_intrinsic_instr *instr) switch (instr->intrinsic) { case nir_intrinsic_load_barycentric_pixel: + case nir_intrinsic_load_barycentric_centroid: + case nir_intrinsic_load_barycentric_sample: /* stub */ break; case nir_intrinsic_load_interpolated_input: