From 7ae200a1dcc370a1f51c387c9261be6ac09a0cd6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 22 Mar 2023 13:51:08 -0700 Subject: [PATCH] renderer/metal: fix color bug on macOS 13 Intel. See the associated test. --- src/renderer/Metal.zig | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index a7aaaeee9..13fc7ab8c 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -83,13 +83,28 @@ texture_color: objc.Object, // MTLTexture const GPUCell = extern struct { mode: GPUCellMode, grid_pos: [2]f32, - cell_width: u8, - color: [4]u8, glyph_pos: [2]u32 = .{ 0, 0 }, glyph_size: [2]u32 = .{ 0, 0 }, glyph_offset: [2]i32 = .{ 0, 0 }, + color: [4]u8, + cell_width: u8, }; +// Intel macOS 13 doesn't like it when any field in a vertex buffer is not +// aligned on the alignment of the struct. I don't understand it, I think +// this must be some macOS 13 Metal GPU driver bug because it doesn't matter +// on macOS 12 or Apple Silicon macOS 13. +// +// To be safe, we put this test in here. +test "GPUCell offsets" { + const testing = std.testing; + const alignment = @alignOf(GPUCell); + inline for (@typeInfo(GPUCell).Struct.fields) |field| { + const offset = @offsetOf(GPUCell, field.name); + try testing.expectEqual(0, @mod(offset, alignment)); + } +} + const GPUUniforms = extern struct { /// The projection matrix for turning world coordinates to normalized. /// This is calculated based on the size of the screen.