Module: Mesa
Branch: main
Commit: 88f399b6515787adbe6e396df85fb5659797cb00
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=88f399b6515787adbe6e396df85fb5659797cb00

Author: Christian Gmeiner <[email protected]>
Date:   Tue Jul 11 15:41:36 2023 +0200

etnaviv: nir: support intrinsic used for txs lowering

Signed-off-by: Christian Gmeiner <[email protected]>
Acked-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24217>

---

 src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c | 12 +++++
 src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h |  3 +-
 src/gallium/drivers/etnaviv/etnaviv_context.h      |  3 ++
 src/gallium/drivers/etnaviv/etnaviv_uniforms.c     | 54 ++++++++++++++++++++++
 4 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c 
b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c
index cde517bb5c6..c6bc4573382 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c
@@ -221,6 +221,7 @@ src_swizzle(hw_src src, unsigned swizzle)
 #define CONST(x) CONST_VAL(ETNA_UNIFORM_CONSTANT, x)
 #define UNIFORM(x) CONST_VAL(ETNA_UNIFORM_UNIFORM, x)
 #define TEXSCALE(x, i) CONST_VAL(ETNA_UNIFORM_TEXRECT_SCALE_X + (i), x)
+#define TEXSIZE(x, i) CONST_VAL(ETNA_UNIFORM_TEXTURE_WIDTH + (i), x)
 
 static int
 const_add(uint64_t *c, uint64_t value)
@@ -380,6 +381,16 @@ get_src(struct etna_compile *c, nir_src *src)
 
          return src_swizzle(const_src(c, values, 2), SWIZZLE(X,Y,X,X));
       }
+      case nir_intrinsic_load_texture_size_etna: {
+         int sampler = nir_src_as_int(intr->src[0]);
+         nir_const_value values[] = {
+            TEXSIZE(sampler, 0),
+            TEXSIZE(sampler, 1),
+            TEXSIZE(sampler, 2),
+         };
+
+         return src_swizzle(const_src(c, values, 3), SWIZZLE(X,Y,Z,X));
+      }
       default:
          compile_error(c, "Unhandled NIR intrinsic type: %s\n",
                        nir_intrinsic_infos[intr->intrinsic].name);
@@ -601,6 +612,7 @@ emit_intrinsic(struct etna_compile *c, nir_intrinsic_instr 
* intr)
    case nir_intrinsic_load_input:
    case nir_intrinsic_load_instance_id:
    case nir_intrinsic_load_texture_scale:
+   case nir_intrinsic_load_texture_size_etna:
       break;
    default:
       compile_error(c, "Unhandled NIR intrinsic type: %s\n",
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h 
b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h
index 5f720029fea..2260f90cb76 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h
@@ -218,7 +218,8 @@ dest_for_instr(nir_instr *instr)
           intr->intrinsic == nir_intrinsic_load_ubo ||
           intr->intrinsic == nir_intrinsic_load_input ||
           intr->intrinsic == nir_intrinsic_load_instance_id ||
-          intr->intrinsic == nir_intrinsic_load_texture_scale)
+          intr->intrinsic == nir_intrinsic_load_texture_scale ||
+          intr->intrinsic == nir_intrinsic_load_texture_size_etna)
          dest = &intr->dest;
    } break;
    case nir_instr_type_deref:
diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.h 
b/src/gallium/drivers/etnaviv/etnaviv_context.h
index e08157b64b8..874867d7da2 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_context.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_context.h
@@ -96,6 +96,9 @@ enum etna_uniform_contents {
    ETNA_UNIFORM_UNIFORM,
    ETNA_UNIFORM_TEXRECT_SCALE_X,
    ETNA_UNIFORM_TEXRECT_SCALE_Y,
+   ETNA_UNIFORM_TEXTURE_WIDTH,
+   ETNA_UNIFORM_TEXTURE_HEIGHT,
+   ETNA_UNIFORM_TEXTURE_DEPTH,
    ETNA_UNIFORM_UBO0_ADDR,
    ETNA_UNIFORM_UBOMAX_ADDR = ETNA_UNIFORM_UBO0_ADDR + ETNA_MAX_CONST_BUF - 1,
 };
diff --git a/src/gallium/drivers/etnaviv/etnaviv_uniforms.c 
b/src/gallium/drivers/etnaviv/etnaviv_uniforms.c
index 92d5665e973..2e1cc4469f7 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_uniforms.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_uniforms.c
@@ -60,6 +60,53 @@ get_texrect_scale(const struct etna_context *ctx, bool frag,
    return fui(1.0f / dim);
 }
 
+static inline bool
+is_array_texture(enum pipe_texture_target target)
+{
+   switch (target) {
+   case PIPE_TEXTURE_1D_ARRAY:
+   case PIPE_TEXTURE_2D_ARRAY:
+   case PIPE_TEXTURE_CUBE_ARRAY:
+      return true;
+   default:
+      return false;
+   }
+}
+
+static uint32_t
+get_texture_size(const struct etna_context *ctx, bool frag,
+                  enum etna_uniform_contents contents, uint32_t data)
+{
+   unsigned index = get_const_idx(ctx, frag, data);
+   struct pipe_sampler_view *texture = ctx->sampler_view[index];
+
+   switch (contents) {
+   case ETNA_UNIFORM_TEXTURE_WIDTH:
+      if (texture->target == PIPE_BUFFER) {
+         return texture->u.buf.size / 
util_format_get_blocksize(texture->format);
+      } else {
+         return u_minify(texture->texture->width0, texture->u.tex.first_level);
+      }
+   case ETNA_UNIFORM_TEXTURE_HEIGHT:
+      return u_minify(texture->texture->height0, texture->u.tex.first_level);
+   case ETNA_UNIFORM_TEXTURE_DEPTH:
+      assert(texture->target != PIPE_BUFFER);
+
+      if (is_array_texture(texture->target)) {
+         if (texture->target != PIPE_TEXTURE_CUBE_ARRAY) {
+            return texture->texture->array_size;
+         } else {
+            assert(texture->texture->array_size % 6 == 0);
+            return texture->texture->array_size / 6;
+         }
+      }
+
+      return u_minify(texture->texture->depth0, texture->u.tex.first_level);
+   default:
+      unreachable("Bad texture size field");
+   }
+}
+
 void
 etna_uniforms_write(const struct etna_context *ctx,
                     const struct etna_shader_variant *sobj,
@@ -97,6 +144,13 @@ etna_uniforms_write(const struct etna_context *ctx,
             get_texrect_scale(ctx, frag, uinfo->contents[i], val));
          break;
 
+      case ETNA_UNIFORM_TEXTURE_WIDTH:
+      case ETNA_UNIFORM_TEXTURE_HEIGHT:
+      case ETNA_UNIFORM_TEXTURE_DEPTH:
+         etna_cmd_stream_emit(stream,
+            get_texture_size(ctx, frag, uinfo->contents[i], val));
+         break;
+
       case ETNA_UNIFORM_UBO0_ADDR ... ETNA_UNIFORM_UBOMAX_ADDR:
          idx = uinfo->contents[i] - ETNA_UNIFORM_UBO0_ADDR;
          etna_cmd_stream_reloc(stream, &(struct etna_reloc) {

Reply via email to