diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index ef7a973b4aa..ef51ebc33b0 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -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"); diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c index 1ce242d9089..bcf8a6aa476 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -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) { diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h index 8f68516a926..0b10c99ecbe 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -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,