spirv: Propagate packed information to glsl_type
authorBoris Brezillon <boris.brezillon@collabora.com>
Tue, 23 Jun 2020 10:51:49 +0000 (12:51 +0200)
committerMarge Bot <eric+marge@anholt.net>
Thu, 3 Sep 2020 18:02:50 +0000 (18:02 +0000)
We need to parse the CPacked decoration early enough to apply it when
calculating field offsets and creating the struct type.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6472>

src/compiler/spirv/spirv_to_nir.c

index 6f29ab624841950396d56d0ba9772f442a10d1e3..6bd87bfc8dbe5ca2a72c8a8658710d972e15cf16 100644 (file)
@@ -1131,6 +1131,21 @@ struct_member_matrix_stride_cb(struct vtn_builder *b,
    ctx->fields[member].type = ctx->type->members[member]->type;
 }
 
+static void
+struct_packed_decoration_cb(struct vtn_builder *b,
+                            struct vtn_value *val, int member,
+                            const struct vtn_decoration *dec, void *void_ctx)
+{
+   vtn_assert(val->type->base_type == vtn_base_type_struct);
+   if (dec->decoration == SpvDecorationCPacked) {
+      if (b->shader->info.stage != MESA_SHADER_KERNEL) {
+         vtn_warn("Decoration only allowed for CL-style kernels: %s",
+                  spirv_decoration_to_string(dec->decoration));
+      }
+      val->type->packed = true;
+   }
+}
+
 static void
 struct_block_decoration_cb(struct vtn_builder *b,
                            struct vtn_value *val, int member,
@@ -1229,11 +1244,7 @@ type_decoration_cb(struct vtn_builder *b,
       break;
 
    case SpvDecorationCPacked:
-      if (b->shader->info.stage != MESA_SHADER_KERNEL)
-         vtn_warn("Decoration only allowed for CL-style kernels: %s",
-                  spirv_decoration_to_string(dec->decoration));
-      else
-         type->packed = true;
+      /* Handled when parsing a struct type, nothing to do here. */
       break;
 
    case SpvDecorationSaturatedConversion:
@@ -1457,10 +1468,13 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
          };
       }
 
+      vtn_foreach_decoration(b, val, struct_packed_decoration_cb, NULL);
+
       if (b->shader->info.stage == MESA_SHADER_KERNEL) {
          unsigned offset = 0;
          for (unsigned i = 0; i < num_fields; i++) {
-            offset = align(offset, glsl_get_cl_alignment(fields[i].type));
+            if (!val->type->packed)
+               offset = align(offset, glsl_get_cl_alignment(fields[i].type));
             fields[i].offset = offset;
             offset += glsl_get_cl_size(fields[i].type);
          }
@@ -1488,7 +1502,8 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
                                                name ? name : "block");
       } else {
          val->type->type = glsl_struct_type(fields, num_fields,
-                                            name ? name : "struct", false);
+                                            name ? name : "struct",
+                                            val->type->packed);
       }
       break;
    }