From 63a47d0ba573fea37a6d96630aba1a7e466f9e93 Mon Sep 17 00:00:00 2001 From: yonihemi <2340723+yonihemi@users.noreply.github.com> Date: Mon, 6 Jan 2025 22:01:41 +0800 Subject: [PATCH] iOS: Fix crash on device --- src/renderer/Metal.zig | 35 +++++++++++++++++++++++------------ src/renderer/metal/api.zig | 4 ++++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 75e61ebc0..5ad45da8e 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -209,20 +209,31 @@ pub const GPUState = struct { } fn chooseDevice() error{NoMetalDevice}!objc.Object { - const devices = objc.Object.fromId(mtl.MTLCopyAllDevices()); - defer devices.release(); var chosen_device: ?objc.Object = null; - var iter = devices.iterate(); - while (iter.next()) |device| { - // We want a GPU that’s connected to a display. - if (device.getProperty(bool, "isHeadless")) continue; - chosen_device = device; - // If the user has an eGPU plugged in, they probably want - // to use it. Otherwise, integrated GPUs are better for - // battery life and thermals. - if (device.getProperty(bool, "isRemovable") or - device.getProperty(bool, "isLowPower")) break; + + switch (comptime builtin.os.tag) { + .macos => { + const devices = objc.Object.fromId(mtl.MTLCopyAllDevices()); + defer devices.release(); + + var iter = devices.iterate(); + while (iter.next()) |device| { + // We want a GPU that’s connected to a display. + if (device.getProperty(bool, "isHeadless")) continue; + chosen_device = device; + // If the user has an eGPU plugged in, they probably want + // to use it. Otherwise, integrated GPUs are better for + // battery life and thermals. + if (device.getProperty(bool, "isRemovable") or + device.getProperty(bool, "isLowPower")) break; + } + }, + .ios => { + chosen_device = objc.Object.fromId(mtl.MTLCreateSystemDefaultDevice()); + }, + else => @compileError("unsupported target for Metal"), } + const device = chosen_device orelse return error.NoMetalDevice; return device.retain(); } diff --git a/src/renderer/metal/api.zig b/src/renderer/metal/api.zig index bd4f407cd..48056ae5e 100644 --- a/src/renderer/metal/api.zig +++ b/src/renderer/metal/api.zig @@ -175,4 +175,8 @@ pub const MTLSize = extern struct { depth: c_ulong, }; +/// https://developer.apple.com/documentation/metal/1433367-mtlcopyalldevices pub extern "c" fn MTLCopyAllDevices() ?*anyopaque; + +/// https://developer.apple.com/documentation/metal/1433401-mtlcreatesystemdefaultdevice +pub extern "c" fn MTLCreateSystemDefaultDevice() ?*anyopaque;