From 7584a25919a0ac015a6e1e8dc78c5c4326fa485a Mon Sep 17 00:00:00 2001 From: Italo Nicola Date: Wed, 16 Dec 2020 03:52:15 +0000 Subject: [PATCH] pan/mdg: implement nir_intrinsic_image_size To implement it in midgard, we just need to read the image_size sysval. Signed-off-by: Italo Nicola Reviewed-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/panfrost/midgard/midgard_compile.c | 6 ++++++ src/panfrost/util/pan_sysval.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index dc6ab9aaf6c..63e60d42bcb 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1646,6 +1646,12 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) emit_image_op(ctx, instr, false); break; + case nir_intrinsic_image_size: { + unsigned nr_comp = nir_intrinsic_dest_components(instr); + emit_sysval_read(ctx, &instr->instr, nr_comp, 0); + break; + } + case nir_intrinsic_load_uniform: case nir_intrinsic_load_ubo: case nir_intrinsic_load_global: diff --git a/src/panfrost/util/pan_sysval.c b/src/panfrost/util/pan_sysval.c index 80e4469f754..a80c5ab3f8a 100644 --- a/src/panfrost/util/pan_sysval.c +++ b/src/panfrost/util/pan_sysval.c @@ -48,6 +48,19 @@ panfrost_sysval_for_sampler(nir_intrinsic_instr *instr) return PAN_SYSVAL(SAMPLER, uindex); } +static int +panfrost_sysval_for_image_size(nir_intrinsic_instr *instr) +{ + nir_src index = instr->src[0]; + assert(nir_src_is_const(index)); + + bool is_array = nir_intrinsic_image_array(instr); + uint32_t uindex = nir_src_as_uint(index); + unsigned dim = nir_intrinsic_dest_components(instr) - is_array; + + return PAN_SYSVAL(IMAGE_SIZE, PAN_TXS_SYSVAL_ID(uindex, dim, is_array)); +} + static unsigned panfrost_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr) { @@ -67,6 +80,8 @@ panfrost_nir_sysval_for_intrinsic(nir_intrinsic_instr *instr) return panfrost_sysval_for_ssbo(instr); case nir_intrinsic_load_sampler_lod_parameters_pan: return panfrost_sysval_for_sampler(instr); + case nir_intrinsic_image_size: + return panfrost_sysval_for_image_size(instr); default: return ~0; }