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:
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)
{
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;
}