ntv: emit extra decorations for matrix members of structs

this is awful.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39488>
This commit is contained in:
Mike Blumenkrantz 2026-01-21 11:59:11 -05:00 committed by Marge Bot
parent e61444e33f
commit ec39a48901
3 changed files with 32 additions and 0 deletions

View file

@ -637,6 +637,14 @@ get_glsl_type(struct ntv_context *ctx, const struct glsl_type *type, bool implic
int32_t offset = glsl_get_struct_field_offset(type, i);
if (offset >= 0 && !implicit_stride)
spirv_builder_emit_member_offset(&ctx->builder, ret, i, offset);
const struct glsl_type *field = glsl_get_struct_field(type, i);
if (glsl_type_is_matrix(field) && !implicit_stride) {
unsigned bit_size = glsl_get_bit_size(field);
unsigned stride = (bit_size >> 3) * glsl_get_vector_elements(field);
spirv_builder_emit_member_matrix_stride(&ctx->builder, ret, i, stride);
spirv_builder_emit_member_matrix_major(&ctx->builder, ret, i, glsl_matrix_type_is_row_major(field));
}
}
} else
UNREACHABLE("Unhandled GLSL type");

View file

@ -397,6 +397,22 @@ spirv_builder_emit_member_offset(struct spirv_builder *b, SpvId target,
args, ARRAY_SIZE(args));
}
void
spirv_builder_emit_member_matrix_stride(struct spirv_builder *b, SpvId target,
uint32_t member, uint32_t stride)
{
uint32_t args[] = { stride };
emit_member_decoration(b, target, member, SpvDecorationMatrixStride,
args, ARRAY_SIZE(args));
}
void
spirv_builder_emit_member_matrix_major(struct spirv_builder *b, SpvId target,
uint32_t member, bool rowmajor)
{
emit_member_decoration(b, target, member, rowmajor ? SpvDecorationRowMajor : SpvDecorationColMajor, NULL, 0);
}
SpvId
spirv_builder_emit_undef(struct spirv_builder *b, SpvId result_type)
{

View file

@ -165,6 +165,14 @@ void
spirv_builder_emit_member_offset(struct spirv_builder *b, SpvId target,
uint32_t member, uint32_t offset);
void
spirv_builder_emit_member_matrix_stride(struct spirv_builder *b, SpvId target,
uint32_t member, uint32_t stride);
void
spirv_builder_emit_member_matrix_major(struct spirv_builder *b, SpvId target,
uint32_t member, bool rowmajor);
void
spirv_builder_emit_entry_point(struct spirv_builder *b,
SpvExecutionModel exec_model, SpvId entry_point,