Module: Mesa Branch: main Commit: e53f44a4b81c608fa08f1681de1834cb07a4ed2b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e53f44a4b81c608fa08f1681de1834cb07a4ed2b
Author: Alyssa Rosenzweig <[email protected]> Date: Wed Mar 30 14:12:06 2022 -0400 pan/bi: Emit LEA_TEX on Valhall As opposed to LEA_ATTR_TEX. In principle we could do this for Bifrost too, but let's keep the Midgard compatible path for now. Signed-off-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16410> --- src/panfrost/bifrost/bifrost_compile.c | 39 ++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 835e8655693..f22e38197e2 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -1113,8 +1113,15 @@ bi_promote_atom_c1(enum bi_atom_opc op, bi_index arg, enum bi_atom_opc *out) } } -/* Coordinates are 16-bit integers in Bifrost but 32-bit in NIR */ - +/* + * Coordinates are 16-bit integers in Bifrost but 32-bit in NIR. We need to + * translate between these forms (with MKVEC.v2i16). + * + * Aditionally on Valhall, cube maps in the attribute pipe are treated as 2D + * arrays. For uniform handling, we also treat 3D textures like 2D arrays. + * + * Our indexing needs to reflects this. + */ static bi_index bi_emit_image_coord(bi_builder *b, bi_index coord, unsigned src_idx, unsigned coord_comps, bool is_array) @@ -1129,7 +1136,10 @@ bi_emit_image_coord(bi_builder *b, bi_index coord, unsigned src_idx, bi_half(bi_word(coord, 0), false), bi_half(bi_word(coord, 1), false)); } else { - if (coord_comps == 3) + if (coord_comps == 3 && b->shader->arch >= 9) + return bi_mkvec_v2i16(b, bi_imm_u16(0), + bi_half(bi_word(coord, 2), false)); + else if (coord_comps == 3) return bi_word(coord, 2); else if (coord_comps == 2 && is_array) return bi_word(coord, 1); @@ -1195,15 +1205,26 @@ bi_emit_lea_image(bi_builder *b, nir_intrinsic_instr *instr) bi_index coords = bi_src_index(&instr->src[1]); bi_index xy = bi_emit_image_coord(b, coords, 0, coord_comps, array); bi_index zw = bi_emit_image_coord(b, coords, 1, coord_comps, array); + bi_index dest = bi_temp(b->shader); - bi_instr *I = bi_lea_attr_tex_to(b, bi_temp(b->shader), xy, zw, - bi_emit_image_index(b, instr), type); + if (b->shader->arch >= 9 && nir_src_is_const(instr->src[0])) { + bi_instr *I = bi_lea_tex_imm_to(b, dest, xy, zw, false, + nir_src_as_uint(instr->src[0])); - /* LEA_ATTR_TEX defaults to the secondary attribute table, but our ABI - * has all images in the primary attribute table */ - I->table = BI_TABLE_ATTRIBUTE_1; + I->table = PAN_TABLE_IMAGE; + } else if (b->shader->arch >= 9) { + unreachable("Indirect images on Valhall not yet supported"); + } else { + bi_instr *I = bi_lea_attr_tex_to(b, dest, xy, zw, + bi_emit_image_index(b, instr), type); - return I->dest[0]; + /* LEA_ATTR_TEX defaults to the secondary attribute table, but + * our ABI has all images in the primary attribute table + */ + I->table = BI_TABLE_ATTRIBUTE_1; + } + + return dest; } static void
