From 3d456eec0a3461fb6097824912a96d393ca96ebb Mon Sep 17 00:00:00 2001 From: Matt Clayton Date: Thu, 12 Feb 2026 22:21:18 -0500 Subject: [PATCH 1/2] Enable building for metal with macOS SDK < 15 --- backends/apple/metal/runtime/shims/et_metal.mm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/backends/apple/metal/runtime/shims/et_metal.mm b/backends/apple/metal/runtime/shims/et_metal.mm index 684f3a0784d..26ae14c7aa5 100644 --- a/backends/apple/metal/runtime/shims/et_metal.mm +++ b/backends/apple/metal/runtime/shims/et_metal.mm @@ -18,6 +18,15 @@ #include #include +#if (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 150000) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 180000) || \ + (defined(__TV_OS_VERSION_MAX_ALLOWED) && __TV_OS_VERSION_MAX_ALLOWED >= 180000) || \ + (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && __WATCH_OS_VERSION_MAX_ALLOWED >= 110000) +#define ET_METAL_HAS_MTL_MATH_COMPILE_OPTIONS 1 +#else +#define ET_METAL_HAS_MTL_MATH_COMPILE_OPTIONS 0 +#endif + namespace executorch { namespace backends { namespace metal { @@ -235,10 +244,12 @@ int metal_copy_memory(void* dst, const void* src, size_t nbytes, bool src_is_dev NSError* error = nil; MTLCompileOptions* options = [[MTLCompileOptions new] autorelease]; +#if ET_METAL_HAS_MTL_MATH_COMPILE_OPTIONS if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, *)) { options.mathMode = MTLMathModeSafe; options.mathFloatingPointFunctions = MTLMathFloatingPointFunctionsPrecise; } +#endif library_ = [device newLibraryWithSource:sourceString options:options error:&error]; if (!library_ || error) { From c932509f2d45cc9bb371ff376be68dddc48ca72d Mon Sep 17 00:00:00 2001 From: Matt Clayton Date: Fri, 13 Feb 2026 20:13:43 -0500 Subject: [PATCH 2/2] Fix so that binary built on old machine can use new features --- .../apple/metal/runtime/shims/et_metal.mm | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/backends/apple/metal/runtime/shims/et_metal.mm b/backends/apple/metal/runtime/shims/et_metal.mm index 26ae14c7aa5..60c70e6f6e4 100644 --- a/backends/apple/metal/runtime/shims/et_metal.mm +++ b/backends/apple/metal/runtime/shims/et_metal.mm @@ -19,12 +19,32 @@ #include #if (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 150000) || \ - (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 180000) || \ - (defined(__TV_OS_VERSION_MAX_ALLOWED) && __TV_OS_VERSION_MAX_ALLOWED >= 180000) || \ - (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && __WATCH_OS_VERSION_MAX_ALLOWED >= 110000) -#define ET_METAL_HAS_MTL_MATH_COMPILE_OPTIONS 1 + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 180000) || \ + (defined(__TV_OS_VERSION_MAX_ALLOWED) && __TV_OS_VERSION_MAX_ALLOWED >= 180000) || \ + (defined(__WATCH_OS_VERSION_MAX_ALLOWED) && __WATCH_OS_VERSION_MAX_ALLOWED >= 110000) +#define ET_METAL_SDK_HAS_MTL_MATH_COMPILE_OPTIONS 1 #else -#define ET_METAL_HAS_MTL_MATH_COMPILE_OPTIONS 0 +#define ET_METAL_SDK_HAS_MTL_MATH_COMPILE_OPTIONS 0 +#endif + +#if !ET_METAL_SDK_HAS_MTL_MATH_COMPILE_OPTIONS +// When building with an older SDK, declare newer Metal compile option symbols so we can still +// use them behind runtime availability checks. +typedef NS_ENUM(NSInteger, MTLMathMode) { + MTLMathModeSafe = 0, + MTLMathModeRelaxed = 1, + MTLMathModeFast = 2, +}; + +typedef NS_ENUM(NSInteger, MTLMathFloatingPointFunctions) { + MTLMathFloatingPointFunctionsFast = 0, + MTLMathFloatingPointFunctionsPrecise = 1, +}; + +@interface MTLCompileOptions () +@property(readwrite, nonatomic) MTLMathMode mathMode; +@property(readwrite, nonatomic) MTLMathFloatingPointFunctions mathFloatingPointFunctions; +@end #endif namespace executorch { @@ -244,12 +264,10 @@ int metal_copy_memory(void* dst, const void* src, size_t nbytes, bool src_is_dev NSError* error = nil; MTLCompileOptions* options = [[MTLCompileOptions new] autorelease]; -#if ET_METAL_HAS_MTL_MATH_COMPILE_OPTIONS if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, *)) { options.mathMode = MTLMathModeSafe; options.mathFloatingPointFunctions = MTLMathFloatingPointFunctionsPrecise; } -#endif library_ = [device newLibraryWithSource:sourceString options:options error:&error]; if (!library_ || error) {