spirv: Propagate packed information to glsl_type

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>
This commit is contained in:
Boris Brezillon 2020-06-23 12:51:49 +02:00 committed by Marge Bot
parent 938d6ceb83
commit d0c2958f88

View 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;
}