|
@@ -1474,6 +1474,7 @@ gb_internal i64 matrix_align_of(Type *t, struct TypePath *tp) {
|
|
|
|
|
|
Type *elem = t->Matrix.elem;
|
|
Type *elem = t->Matrix.elem;
|
|
i64 row_count = gb_max(t->Matrix.row_count, 1);
|
|
i64 row_count = gb_max(t->Matrix.row_count, 1);
|
|
|
|
+ i64 column_count = gb_max(t->Matrix.column_count, 1);
|
|
|
|
|
|
bool pop = type_path_push(tp, elem);
|
|
bool pop = type_path_push(tp, elem);
|
|
if (tp->failure) {
|
|
if (tp->failure) {
|
|
@@ -1491,7 +1492,7 @@ gb_internal i64 matrix_align_of(Type *t, struct TypePath *tp) {
|
|
// could be maximally aligned but as a compromise, having no padding will be
|
|
// could be maximally aligned but as a compromise, having no padding will be
|
|
// beneficial to third libraries that assume no padding
|
|
// beneficial to third libraries that assume no padding
|
|
|
|
|
|
- i64 total_expected_size = row_count*t->Matrix.column_count*elem_size;
|
|
|
|
|
|
+ i64 total_expected_size = row_count*column_count*elem_size;
|
|
// i64 min_alignment = prev_pow2(elem_align * row_count);
|
|
// i64 min_alignment = prev_pow2(elem_align * row_count);
|
|
i64 min_alignment = prev_pow2(total_expected_size);
|
|
i64 min_alignment = prev_pow2(total_expected_size);
|
|
while (total_expected_size != 0 && (total_expected_size % min_alignment) != 0) {
|
|
while (total_expected_size != 0 && (total_expected_size % min_alignment) != 0) {
|
|
@@ -1523,12 +1524,15 @@ gb_internal i64 matrix_type_stride_in_bytes(Type *t, struct TypePath *tp) {
|
|
i64 stride_in_bytes = 0;
|
|
i64 stride_in_bytes = 0;
|
|
|
|
|
|
// NOTE(bill, 2021-10-25): The alignment strategy here is to have zero padding
|
|
// NOTE(bill, 2021-10-25): The alignment strategy here is to have zero padding
|
|
- // It would be better for performance to pad each column so that each column
|
|
|
|
|
|
+ // It would be better for performance to pad each column/row so that each column/row
|
|
// could be maximally aligned but as a compromise, having no padding will be
|
|
// could be maximally aligned but as a compromise, having no padding will be
|
|
// beneficial to third libraries that assume no padding
|
|
// beneficial to third libraries that assume no padding
|
|
- i64 row_count = t->Matrix.row_count;
|
|
|
|
- stride_in_bytes = elem_size*row_count;
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ if (t->Matrix.is_row_major) {
|
|
|
|
+ stride_in_bytes = elem_size*t->Matrix.column_count;
|
|
|
|
+ } else {
|
|
|
|
+ stride_in_bytes = elem_size*t->Matrix.row_count;
|
|
|
|
+ }
|
|
t->Matrix.stride_in_bytes = stride_in_bytes;
|
|
t->Matrix.stride_in_bytes = stride_in_bytes;
|
|
return stride_in_bytes;
|
|
return stride_in_bytes;
|
|
}
|
|
}
|
|
@@ -4217,7 +4221,11 @@ gb_internal i64 type_size_of_internal(Type *t, TypePath *path) {
|
|
|
|
|
|
case Type_Matrix: {
|
|
case Type_Matrix: {
|
|
i64 stride_in_bytes = matrix_type_stride_in_bytes(t, path);
|
|
i64 stride_in_bytes = matrix_type_stride_in_bytes(t, path);
|
|
- return stride_in_bytes * t->Matrix.column_count;
|
|
|
|
|
|
+ if (t->Matrix.is_row_major) {
|
|
|
|
+ return stride_in_bytes * t->Matrix.row_count;
|
|
|
|
+ } else {
|
|
|
|
+ return stride_in_bytes * t->Matrix.column_count;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
case Type_BitField:
|
|
case Type_BitField:
|