aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-10-20 01:26:33 +0100
committergingerBill <bill@gingerbill.org>2021-10-20 01:26:33 +0100
commit3f1930b76eac0c7c38a36bfd1cdcf97c91ae527d (patch)
treea5c07475dbe1bbd94ad327263ef2c8826dd3cebc /src/types.cpp
parentafac1a2cc1fd3b9278b9ae0ab5f0905c5945ab54 (diff)
Clean up stride logic
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/types.cpp b/src/types.cpp
index c23335f3b..eaf1bac74 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -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);