diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index 42fea123232..32d5e1a184a 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -71,7 +71,29 @@ agx_emit_load_attr(agx_builder *b, nir_intrinsic_instr *instr) static void agx_emit_load_vary(agx_builder *b, nir_intrinsic_instr *instr) { - unreachable("stub"); + unsigned components = instr->num_components; + bool smooth = instr->intrinsic == nir_intrinsic_load_interpolated_input; + + assert(components >= 1 && components <= 4); + + if (smooth) { + nir_intrinsic_instr *parent = nir_src_as_intrinsic(instr->src[0]); + assert(parent); + + /* TODO: Interpolation modes */ + assert(parent->intrinsic == + nir_intrinsic_load_barycentric_pixel); + } else { + /* TODO: flat varyings */ + } + + nir_src *offset = nir_get_io_offset_src(instr); + assert(nir_src_is_const(*offset) && "no indirects"); + unsigned imm_index = (4 * nir_intrinsic_base(instr)) + nir_src_as_uint(*offset); + imm_index += 1; + + agx_ld_vary_to(b, agx_dest_index(&instr->dest), + agx_immediate(imm_index), components); } static void