Mesa (master): panfrost: implement image_size sysval
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jan 27 12:52:33 UTC 2021
Module: Mesa
Branch: master
Commit: 0efe7a6eb909b47fb24a7e15edcf4ee0d01cfd95
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0efe7a6eb909b47fb24a7e15edcf4ee0d01cfd95
Author: Italo Nicola <italonicola at collabora.com>
Date: Wed Dec 16 20:13:36 2020 +0000
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 <italonicola at collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8066>
---
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) \
More information about the mesa-commit
mailing list