This commit is contained in:
Mitchell Hashimoto
2022-11-19 22:07:48 -08:00
parent 2100523822
commit 30d62fc144
3 changed files with 84 additions and 14 deletions

View File

@ -83,6 +83,11 @@ pub fn build(b: *std.build.Builder) !void {
// Exe
{
if (target.isDarwin()) {
// See the comment in this file
exe.addCSourceFile("src/renderer/metal_workaround.c", &.{});
}
exe.setTarget(target);
exe.setBuildMode(mode);
exe.addOptions("build_options", exe_options);

View File

@ -963,10 +963,10 @@ fn syncAtlasTexture(device: objc.Object, atlas: *const Atlas, texture: *objc.Obj
texture.* = try initAtlasTexture(device, atlas);
}
texture.msgSend(
void,
objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"),
.{
// Workaround for: https://github.com/ziglang/zig/issues/13598
ghostty_metal_replaceregion(
texture.value,
objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:").value,
MTLRegion{
.origin = .{ .x = 0, .y = 0, .z = 0 },
.size = .{
@ -978,10 +978,40 @@ fn syncAtlasTexture(device: objc.Object, atlas: *const Atlas, texture: *objc.Obj
@as(c_ulong, 0),
atlas.data.ptr,
@as(c_ulong, atlas.format.depth() * atlas.size),
},
);
// Once the above linked issue is fixed, this is what we actually
// want to do:
//
// texture.msgSend(
// void,
// objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"),
// .{
// MTLRegion{
// .origin = .{ .x = 0, .y = 0, .z = 0 },
// .size = .{
// .width = @intCast(c_ulong, atlas.size),
// .height = @intCast(c_ulong, atlas.size),
// .depth = 1,
// },
// },
// @as(c_ulong, 0),
// atlas.data.ptr,
// @as(c_ulong, atlas.format.depth() * atlas.size),
// },
// );
}
extern "c" fn ghostty_metal_replaceregion(
objc.c.id,
objc.c.SEL,
MTLRegion,
c_ulong,
*anyopaque,
c_ulong,
) void;
/// Initialize the shader library.
fn initLibrary(device: objc.Object, data: []const u8) !objc.Object {
const source = try macos.foundation.String.createWithBytes(

View File

@ -0,0 +1,35 @@
// Workaround for:
// https://github.com/ziglang/zig/issues/13598
#include <objc/message.h>
#include <objc/runtime.h>
// From Metal.h
typedef struct Origin {
unsigned long x;
unsigned long y;
unsigned long z;
} Origin;
typedef struct Size {
unsigned long width;
unsigned long height;
unsigned long depth;
} Size;
typedef struct MTLRegion {
Origin origin;
Size size;
} MTLRegion;
void ghostty_metal_replaceregion(
id target,
SEL sel,
MTLRegion region,
unsigned long offset,
void *ptr,
unsigned long len
) {
void (*replaceRegion)(id, SEL, MTLRegion, unsigned long, void *, unsigned long) = (void (*)(id, SEL, MTLRegion, unsigned long, void *, unsigned long)) objc_msgSend;
replaceRegion(target, sel, region, offset, ptr, len);
}