From 4e341e70d8b2feea6414277be0b783b1cf6160da Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 1 Apr 2022 17:24:21 -0400 Subject: [PATCH] pan/bi: Handle transform feedback intrinsics Translate the intrinsics we introduced to lower away transform feedback into Panfrost system values which the GL driver can handle. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bifrost_compile.c | 8 ++++++++ src/panfrost/util/pan_sysval.c | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 74dc3132f3f..65360b60096 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -1752,10 +1752,12 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr) break; case nir_intrinsic_load_ssbo_address: + case nir_intrinsic_load_xfb_address: bi_load_sysval_nir(b, instr, 2, 0); break; case nir_intrinsic_load_work_dim: + case nir_intrinsic_load_num_vertices: bi_load_sysval_nir(b, instr, 1, 0); break; @@ -1843,6 +1845,12 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr) break; + /* We only use in our transform feedback lowering */ + case nir_intrinsic_load_vertex_id_zero_base: + assert(b->shader->nir->info.has_transform_feedback_varyings); + bi_mov_i32_to(b, dst, bi_vertex_id(b)); + break; + case nir_intrinsic_load_instance_id: bi_mov_i32_to(b, dst, bi_instance_id(b)); break; diff --git a/src/panfrost/util/pan_sysval.c b/src/panfrost/util/pan_sysval.c index e5b0a5fa325..78caffb8a55 100644 --- a/src/panfrost/util/pan_sysval.c +++ b/src/panfrost/util/pan_sysval.c @@ -87,6 +87,10 @@ panfrost_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr) case nir_intrinsic_load_ssbo_address: case nir_intrinsic_get_ssbo_size: return panfrost_sysval_for_ssbo(instr); + case nir_intrinsic_load_xfb_address: + return PAN_SYSVAL(XFB, nir_intrinsic_base(instr)); + case nir_intrinsic_load_num_vertices: + return PAN_SYSVAL_NUM_VERTICES; case nir_intrinsic_load_sampler_lod_parameters_pan: return panfrost_sysval_for_sampler(instr); case nir_intrinsic_image_size: