agx: Handle <32-bit local memory access
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Thu, 10 Aug 2023 21:09:14 +0000 (17:09 -0400)
committerMarge Bot <emma+marge@anholt.net>
Fri, 11 Aug 2023 20:31:28 +0000 (20:31 +0000)
I don't know if this is possible to hit with GL, but it is with Vulkan. Fixes:

dEQP-VK.spirv_assembly.instruction.compute.workgroup_memory.*

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24635>

src/asahi/compiler/agx_compile.c

index 3428e44..c21c8b8 100644 (file)
@@ -717,6 +717,21 @@ agx_emit_atomic(agx_builder *b, agx_index dst, nir_intrinsic_instr *instr,
    }
 }
 
+static enum agx_format
+format_for_bitsize(unsigned bitsize)
+{
+   switch (bitsize) {
+   case 8:
+      return AGX_FORMAT_I8;
+   case 16:
+      return AGX_FORMAT_I16;
+   case 32:
+      return AGX_FORMAT_I32;
+   default:
+      unreachable("should've been lowered");
+   }
+}
+
 static void
 agx_emit_local_load(agx_builder *b, agx_index dst, nir_intrinsic_instr *instr)
 {
@@ -724,9 +739,7 @@ agx_emit_local_load(agx_builder *b, agx_index dst, nir_intrinsic_instr *instr)
    agx_index index = agx_zero(); /* TODO: optimize address arithmetic */
    assert(base.size == AGX_SIZE_16);
 
-   assert(nir_dest_bit_size(instr->dest) == 32 && "todo");
-   enum agx_format format = AGX_FORMAT_I32;
-
+   enum agx_format format = format_for_bitsize(nir_dest_bit_size(instr->dest));
    unsigned nr = nir_dest_num_components(instr->dest);
    unsigned mask = BITFIELD_MASK(nr);
 
@@ -742,8 +755,7 @@ agx_emit_local_store(agx_builder *b, nir_intrinsic_instr *instr)
    agx_index index = agx_zero(); /* TODO: optimize address arithmetic */
    assert(base.size == AGX_SIZE_16);
 
-   assert(nir_src_bit_size(instr->src[0]) == 32 && "todo");
-   enum agx_format format = AGX_FORMAT_I32;
+   enum agx_format format = format_for_bitsize(nir_src_bit_size(instr->src[0]));
    unsigned mask = BITFIELD_MASK(
       nir_src_num_components(instr->src[0])); /* XXX: there's a write mask */