mirror of
https://github.com/odin-lang/Odin.git
synced 2026-02-15 15:44:04 +00:00
Clean up stride logic
This commit is contained in:
@@ -277,6 +277,7 @@ struct TypeProc {
|
||||
i64 column_count; \
|
||||
Type *generic_row_count; \
|
||||
Type *generic_column_count; \
|
||||
i64 stride_in_bytes; \
|
||||
})
|
||||
|
||||
|
||||
@@ -1251,9 +1252,14 @@ bool is_type_matrix(Type *t) {
|
||||
}
|
||||
|
||||
i64 matrix_type_stride_in_bytes(Type *t, struct TypePath *tp) {
|
||||
// TODO(bill): precompute matrix stride
|
||||
t = base_type(t);
|
||||
GB_ASSERT(t->kind == Type_Matrix);
|
||||
if (t->Matrix.stride_in_bytes != 0) {
|
||||
return t->Matrix.stride_in_bytes;
|
||||
} else if (t->Matrix.row_count == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
i64 elem_size;
|
||||
if (tp != nullptr) {
|
||||
elem_size = type_size_of_internal(t->Matrix.elem, tp);
|
||||
@@ -1265,18 +1271,20 @@ i64 matrix_type_stride_in_bytes(Type *t, struct TypePath *tp) {
|
||||
/*
|
||||
[3; 4]f32 -> [4]{x, y, z, _: f32} // extra padding for alignment reasons
|
||||
*/
|
||||
i64 stride_in_bytes = 0;
|
||||
|
||||
i64 row_count = t->Matrix.row_count;
|
||||
if (row_count == 1) {
|
||||
return elem_size;
|
||||
stride_in_bytes = elem_size;
|
||||
} else {
|
||||
i64 matrix_alignment = type_align_of(t);
|
||||
stride_in_bytes = align_formula(elem_size*t->Matrix.row_count, matrix_alignment);
|
||||
}
|
||||
|
||||
i64 align = type_align_of(t);
|
||||
return align_formula(elem_size*t->Matrix.row_count, align);
|
||||
t->Matrix.stride_in_bytes = stride_in_bytes;
|
||||
return stride_in_bytes;
|
||||
}
|
||||
|
||||
i64 matrix_type_stride_in_elems(Type *t) {
|
||||
// TODO(bill): precompute matrix stride
|
||||
t = base_type(t);
|
||||
GB_ASSERT(t->kind == Type_Matrix);
|
||||
i64 stride = matrix_type_stride_in_bytes(t, nullptr);
|
||||
@@ -1285,7 +1293,6 @@ i64 matrix_type_stride_in_elems(Type *t) {
|
||||
|
||||
|
||||
i64 matrix_type_total_elems(Type *t) {
|
||||
// TODO(bill): precompute matrix total elems
|
||||
t = base_type(t);
|
||||
GB_ASSERT(t->kind == Type_Matrix);
|
||||
i64 size = type_size_of(t);
|
||||
|
||||
Reference in New Issue
Block a user