From 0efe7a6eb909b47fb24a7e15edcf4ee0d01cfd95 Mon Sep 17 00:00:00 2001 From: Italo Nicola Date: Wed, 16 Dec 2020 20:13:36 +0000 Subject: [PATCH] panfrost: implement image_size sysval Since there's no hardware support for it, we use a sysval to implement nir_intrinsic_image_size. Signed-off-by: Italo Nicola Reviewed-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 40 ++++++++++++++++++++ src/panfrost/util/pan_ir.h | 1 + 2 files changed, 41 insertions(+) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index e370554ffe3..4d87b6f02ab 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -789,6 +789,41 @@ static void panfrost_upload_txs_sysval(struct panfrost_batch *batch, uniform->i[dim] = tex->texture->array_size; } +static void panfrost_upload_image_size_sysval(struct panfrost_batch *batch, + enum pipe_shader_type st, + unsigned int sysvalid, + struct sysval_uniform *uniform) +{ + struct panfrost_context *ctx = batch->ctx; + unsigned idx = PAN_SYSVAL_ID_TO_TXS_TEX_IDX(sysvalid); + unsigned dim = PAN_SYSVAL_ID_TO_TXS_DIM(sysvalid); + unsigned is_array = PAN_SYSVAL_ID_TO_TXS_IS_ARRAY(sysvalid); + + assert(dim && dim < 4); + + struct pipe_image_view *image = &ctx->images[st][idx]; + + if (image->resource->target == PIPE_BUFFER) { + unsigned blocksize = util_format_get_blocksize(image->format); + uniform->i[0] = image->resource->width0 / blocksize; + return; + } + + uniform->i[0] = u_minify(image->resource->width0, + image->u.tex.level); + + if (dim > 1) + uniform->i[1] = u_minify(image->resource->height0, + image->u.tex.level); + + if (dim > 2) + uniform->i[2] = u_minify(image->resource->depth0, + image->u.tex.level); + + if (is_array) + uniform->i[dim] = image->resource->array_size; +} + static void panfrost_upload_ssbo_sysval(struct panfrost_batch *batch, enum pipe_shader_type st, @@ -911,6 +946,11 @@ panfrost_upload_sysvals(struct panfrost_batch *batch, void *buf, PAN_SYSVAL_ID(sysval), &uniforms[i]); break; + case PAN_SYSVAL_IMAGE_SIZE: + panfrost_upload_image_size_sysval(batch, st, + PAN_SYSVAL_ID(sysval), + &uniforms[i]); + break; default: assert(0); } diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h index 4c90587f35d..e299dcc656a 100644 --- a/src/panfrost/util/pan_ir.h +++ b/src/panfrost/util/pan_ir.h @@ -52,6 +52,7 @@ enum { PAN_SYSVAL_SAMPLER = 7, PAN_SYSVAL_LOCAL_GROUP_SIZE = 8, PAN_SYSVAL_WORK_DIM = 9, + PAN_SYSVAL_IMAGE_SIZE = 10, }; #define PAN_TXS_SYSVAL_ID(texidx, dim, is_array) \