pan/mdg: implement nir_intrinsic_image_size
authorItalo Nicola <italonicola@collabora.com>
Wed, 16 Dec 2020 03:52:15 +0000 (03:52 +0000)
committerMarge Bot <eric+marge@anholt.net>
Wed, 27 Jan 2021 12:39:41 +0000 (12:39 +0000)
To implement it in midgard, we just need to read the image_size sysval.

Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8066>

src/panfrost/midgard/midgard_compile.c
src/panfrost/util/pan_sysval.c

index dc6ab9a..63e60d4 100644 (file)
@@ -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:
index 80e4469..a80c5ab 100644 (file)
@@ -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;
         }