Commit 18ed5fe5 authored by Boris Brezillon's avatar Boris Brezillon Committed by Erik Faye-Lund
Browse files

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's avatarBoris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Karol Herbst's avatarKarol Herbst <kherbst@redhat.com>
Reviewed-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Jesse Natalie's avatarJesse Natalie <jenatali@microsoft.com>
Part-of: <mesa/mesa!6472>
parent 577f2604
......@@ -1028,6 +1028,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,
......@@ -1126,11 +1141,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:
......@@ -1350,10 +1361,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);
}
......@@ -1381,7 +1395,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;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment