mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
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:
parent
938d6ceb83
commit
d0c2958f88
1 changed files with 22 additions and 7 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue