Merge pull request #39943 from bruvzg/macos_apple_silicon_3

[macOS, 3.2] Add support for the Apple Silicon (ARM64) build target.
This commit is contained in:
Rémi Verschelde 2020-06-29 15:30:03 +02:00 committed by GitHub
commit b833296cbb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 58 additions and 18 deletions

View file

@ -30,12 +30,18 @@
<string>$camera_usage_description</string> <string>$camera_usage_description</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>$copyright</string> <string>$copyright</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.9.0</string> <string>10.9</string>
<key>LSMinimumSystemVersionByArchitecture</key> <key>LSMinimumSystemVersionByArchitecture</key>
<dict> <dict>
<key>x86_64</key> <key>x86_64</key>
<string>10.9.0</string> <string>10.9</string>
</dict> </dict>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>
$highres $highres

View file

@ -29,15 +29,21 @@
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>Camera access is required to capture video.</string> <string>Camera access is required to capture video.</string>
<key>NSRequiresAquaSystemAppearance</key> <key>NSRequiresAquaSystemAppearance</key>
<false /> <false />
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>© 2007-2020 Juan Linietsky, Ariel Manzur &amp; Godot Engine contributors</string> <string>© 2007-2020 Juan Linietsky, Ariel Manzur &amp; Godot Engine contributors</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.9.0</string> <string>10.9</string>
<key>LSMinimumSystemVersionByArchitecture</key> <key>LSMinimumSystemVersionByArchitecture</key>
<dict> <dict>
<key>x86_64</key> <key>x86_64</key>
<string>10.9.0</string> <string>10.9</string>
</dict> </dict>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>
<true/> <true/>

View file

@ -313,7 +313,12 @@ MyDeviceNotifications *device_notifications = nil;
// CameraOSX - Subclass for our camera server on OSX // CameraOSX - Subclass for our camera server on OSX
void CameraOSX::update_feeds() { void CameraOSX::update_feeds() {
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:[NSArray arrayWithObjects:AVCaptureDeviceTypeExternalUnknown, AVCaptureDeviceTypeBuiltInWideAngleCamera, nil] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
NSArray *devices = session.devices;
#else
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
#endif
// remove devices that are gone.. // remove devices that are gone..
for (int i = feeds.size() - 1; i >= 0; i--) { for (int i = feeds.size() - 1; i >= 0; i--) {

View file

@ -227,6 +227,9 @@ if env["builtin_opus"]:
env_opus.Append(CPPDEFINES=["OPUS_ARM_OPT"]) env_opus.Append(CPPDEFINES=["OPUS_ARM_OPT"])
elif "arch" in env and env["arch"] == "arm64": elif "arch" in env and env["arch"] == "arm64":
env_opus.Append(CPPDEFINES=["OPUS_ARM64_OPT"]) env_opus.Append(CPPDEFINES=["OPUS_ARM64_OPT"])
elif env["platform"] == "osx":
if "arch" in env and env["arch"] == "arm64":
env_opus.Append(CPPDEFINES=["OPUS_ARM64_OPT"])
env_thirdparty = env_opus.Clone() env_thirdparty = env_opus.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()

View file

@ -230,6 +230,7 @@ else:
is_x11_or_server_arm = (env["platform"] == "x11" or env["platform"] == "server") and ( is_x11_or_server_arm = (env["platform"] == "x11" or env["platform"] == "server") and (
platform.machine().startswith("arm") or platform.machine().startswith("aarch") platform.machine().startswith("arm") or platform.machine().startswith("aarch")
) )
is_macos_x86 = env["platform"] == "osx" and ("arch" in env and (env["arch"] != "arm64"))
is_ios_x86 = env["platform"] == "iphone" and ("arch" in env and env["arch"].startswith("x86")) is_ios_x86 = env["platform"] == "iphone" and ("arch" in env and env["arch"].startswith("x86"))
is_android_x86 = env["platform"] == "android" and env["android_arch"].startswith("x86") is_android_x86 = env["platform"] == "android" and env["android_arch"].startswith("x86")
if is_android_x86: if is_android_x86:
@ -240,14 +241,15 @@ else:
and ( and (
env["platform"] == "windows" env["platform"] == "windows"
or env["platform"] == "x11" or env["platform"] == "x11"
or env["platform"] == "osx"
or env["platform"] == "haiku" or env["platform"] == "haiku"
or is_macos_x86
or is_android_x86 or is_android_x86
or is_ios_x86 or is_ios_x86
) )
) )
webm_cpu_arm = ( webm_cpu_arm = (
is_x11_or_server_arm is_x11_or_server_arm
or (not is_macos_x86 and env["platform"] == "osx")
or (not is_ios_x86 and env["platform"] == "iphone") or (not is_ios_x86 and env["platform"] == "iphone")
or (not is_android_x86 and env["platform"] == "android") or (not is_android_x86 and env["platform"] == "android")
) )

View file

@ -81,8 +81,15 @@ def configure(env):
env["osxcross"] = True env["osxcross"] = True
if not "osxcross" in env: # regular native build if not "osxcross" in env: # regular native build
env.Append(CCFLAGS=["-arch", "x86_64"]) if env["arch"] == "arm64":
env.Append(LINKFLAGS=["-arch", "x86_64"]) print("Building for macOS 10.15+, platform arm64.")
env.Append(CCFLAGS=["-arch", "arm64", "-mmacosx-version-min=10.15", "-target", "arm64-apple-macos10.15"])
env.Append(LINKFLAGS=["-arch", "arm64", "-mmacosx-version-min=10.15", "-target", "arm64-apple-macos10.15"])
else:
print("Building for macOS 10.9+, platform x86-64.")
env.Append(CCFLAGS=["-arch", "x86_64", "-mmacosx-version-min=10.9"])
env.Append(LINKFLAGS=["-arch", "x86_64", "-mmacosx-version-min=10.9"])
if env["macports_clang"] != "no": if env["macports_clang"] != "no":
mpprefix = os.environ.get("MACPORTS_PREFIX", "/opt/local") mpprefix = os.environ.get("MACPORTS_PREFIX", "/opt/local")
mpclangver = env["macports_clang"] mpclangver = env["macports_clang"]
@ -142,7 +149,8 @@ def configure(env):
## Dependencies ## Dependencies
if env["builtin_libtheora"]: if env["builtin_libtheora"]:
env["x86_libtheora_opt_gcc"] = True if env["arch"] != "arm64":
env["x86_libtheora_opt_gcc"] = True
## Flags ## Flags
@ -155,6 +163,7 @@ def configure(env):
"APPLE_STYLE_KEYS", "APPLE_STYLE_KEYS",
"COREAUDIO_ENABLED", "COREAUDIO_ENABLED",
"COREMIDI_ENABLED", "COREMIDI_ENABLED",
"GL_SILENCE_DEPRECATION",
] ]
) )
env.Append( env.Append(
@ -187,6 +196,3 @@ def configure(env):
] ]
) )
env.Append(LIBS=["pthread"]) env.Append(LIBS=["pthread"])
env.Append(CCFLAGS=["-mmacosx-version-min=10.9"])
env.Append(LINKFLAGS=["-mmacosx-version-min=10.9"])

View file

@ -444,7 +444,7 @@ static NSCursor *cursorFromSelector(SEL selector, SEL fallback = nil) {
@end @end
@interface GodotContentView : NSView <NSTextInputClient> { @interface GodotContentView : NSOpenGLView <NSTextInputClient> {
NSTrackingArea *trackingArea; NSTrackingArea *trackingArea;
NSMutableAttributedString *markedText; NSMutableAttributedString *markedText;
bool imeInputEventInProgress; bool imeInputEventInProgress;
@ -475,7 +475,11 @@ static NSCursor *cursorFromSelector(SEL selector, SEL fallback = nil) {
trackingArea = nil; trackingArea = nil;
imeInputEventInProgress = false; imeInputEventInProgress = false;
[self updateTrackingAreas]; [self updateTrackingAreas];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeFileURL]];
#else
[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
#endif
markedText = [[NSMutableAttributedString alloc] init]; markedText = [[NSMutableAttributedString alloc] init];
return self; return self;
} }
@ -619,11 +623,19 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { - (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
NSPasteboard *pboard = [sender draggingPasteboard]; NSPasteboard *pboard = [sender draggingPasteboard];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
NSArray<NSURL *> *filenames = [pboard propertyListForType:NSPasteboardTypeFileURL];
#else
NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType]; NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
#endif
Vector<String> files; Vector<String> files;
for (NSUInteger i = 0; i < filenames.count; i++) { for (NSUInteger i = 0; i < filenames.count; i++) {
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
NSString *ns = [[filenames objectAtIndex:i] path];
#else
NSString *ns = [filenames objectAtIndex:i]; NSString *ns = [filenames objectAtIndex:i];
#endif
char *utfs = strdup([ns UTF8String]); char *utfs = strdup([ns UTF8String]);
String ret; String ret;
ret.parse_utf8(utfs); ret.parse_utf8(utfs);
@ -712,7 +724,7 @@ static void _mouseDownEvent(NSEvent *event, int index, int mask, bool pressed) {
const Vector2 pos = get_mouse_pos([event locationInWindow], backingScaleFactor); const Vector2 pos = get_mouse_pos([event locationInWindow], backingScaleFactor);
mm->set_position(pos); mm->set_position(pos);
mm->set_pressure([event pressure]); mm->set_pressure([event pressure]);
if ([event subtype] == NSTabletPointEventSubtype) { if ([event subtype] == NSEventSubtypeTabletPoint) {
const NSPoint p = [event tilt]; const NSPoint p = [event tilt];
mm->set_tilt(Vector2(p.x, p.y)); mm->set_tilt(Vector2(p.x, p.y));
} }
@ -1600,7 +1612,7 @@ Error OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
ERR_FAIL_COND_V(context == nil, ERR_UNAVAILABLE); ERR_FAIL_COND_V(context == nil, ERR_UNAVAILABLE);
[context setView:window_view]; [window_view setOpenGLContext:context];
[context makeCurrentContext]; [context makeCurrentContext];
@ -1800,7 +1812,7 @@ void OS_OSX::alert(const String &p_alert, const String &p_title) {
[window addButtonWithTitle:@"OK"]; [window addButtonWithTitle:@"OK"];
[window setMessageText:ns_title]; [window setMessageText:ns_title];
[window setInformativeText:ns_alert]; [window setInformativeText:ns_alert];
[window setAlertStyle:NSWarningAlertStyle]; [window setAlertStyle:NSAlertStyleWarning];
// Display it, then release // Display it, then release
[window runModal]; [window runModal];
@ -2686,14 +2698,14 @@ void OS_OSX::set_window_per_pixel_transparency_enabled(bool p_enabled) {
[window_object setBackgroundColor:[NSColor clearColor]]; [window_object setBackgroundColor:[NSColor clearColor]];
[window_object setOpaque:NO]; [window_object setOpaque:NO];
[window_object setHasShadow:NO]; [window_object setHasShadow:NO];
[context setValues:&opacity forParameter:NSOpenGLCPSurfaceOpacity]; [context setValues:&opacity forParameter:NSOpenGLContextParameterSurfaceOpacity];
layered_window = true; layered_window = true;
} else { } else {
GLint opacity = 1; GLint opacity = 1;
[window_object setBackgroundColor:[NSColor colorWithCalibratedWhite:1 alpha:1]]; [window_object setBackgroundColor:[NSColor colorWithCalibratedWhite:1 alpha:1]];
[window_object setOpaque:YES]; [window_object setOpaque:YES];
[window_object setHasShadow:YES]; [window_object setHasShadow:YES];
[context setValues:&opacity forParameter:NSOpenGLCPSurfaceOpacity]; [context setValues:&opacity forParameter:NSOpenGLContextParameterSurfaceOpacity];
layered_window = false; layered_window = false;
} }
[context update]; [context update];