mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 02:48:06 +02:00
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:
parent
e61444e33f
commit
ec39a48901
3 changed files with 32 additions and 0 deletions
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue