diff --git a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm index ea48bb8c79..044329608c 100644 --- a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm +++ b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm @@ -43,12 +43,35 @@ #import #import +#include + TypeHandle CocoaGraphicsWindow::_type_handle; #ifndef MAC_OS_X_VERSION_10_15 #define NSAppKitVersionNumber10_14 1671 #endif +/** + * Returns true if this is an arm64-based mac. + */ +static int is_arm64_mac() { +#ifdef __aarch64__ + return 1; +#elif defined(__x86_64__) + // Running in Rosetta 2? + static int ret = -1; + if (ret < 0) { + size_t size = sizeof(ret); + if (sysctlbyname("sysctl.proc_translated", &ret, &size, nullptr, 0) == -1) { + ret = 0; + } + } + return ret; +#else + return 0; +#endif +} + /** * */ @@ -189,8 +212,17 @@ begin_frame(FrameMode mode, Thread *current_thread) { // Set the drawable. if (_properties.get_fullscreen()) { - // Fullscreen. - CGLSetFullScreenOnDisplay((CGLContextObj) [cocoagsg->_context CGLContextObj], CGDisplayIDToOpenGLDisplayMask(_display)); + // Fullscreen. Note that this call doesn't work with the newer + // Metal-based OpenGL drivers. + if (!is_arm64_mac()) { + CGLError err = CGLSetFullScreenOnDisplay((CGLContextObj) [cocoagsg->_context CGLContextObj], CGDisplayIDToOpenGLDisplayMask(_display)); + if (err != kCGLNoError) { + cocoadisplay_cat.error() + << "Failed call to CGLSetFullScreenOnDisplay with display mask " + << CGDisplayIDToOpenGLDisplayMask(_display) << ": " << CGLErrorString(err) << "\n"; + return false; + } + } } else { // Although not recommended, it is technically possible to use the same // context with multiple different-sized windows. If that happens, the @@ -626,7 +658,7 @@ open_window() { } if (_properties.get_fullscreen()) { - [_window setLevel: NSMainMenuWindowLevel + 1]; + [_window setLevel: CGShieldingWindowLevel()]; } else { switch (_properties.get_z_order()) { case WindowProperties::Z_bottom: @@ -859,7 +891,7 @@ set_properties_now(WindowProperties &properties) { [_window setStyleMask:NSBorderlessWindowMask]; } [_window makeFirstResponder:_view]; - [_window setLevel:NSMainMenuWindowLevel+1]; + [_window setLevel:CGShieldingWindowLevel()]; [_window makeKeyAndOrderFront:nil]; } @@ -898,7 +930,7 @@ set_properties_now(WindowProperties &properties) { [_window setStyleMask:NSBorderlessWindowMask]; } [_window makeFirstResponder:_view]; - [_window setLevel:NSMainMenuWindowLevel+1]; + [_window setLevel:CGShieldingWindowLevel()]; [_window makeKeyAndOrderFront:nil]; }