diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index 2a6f17cb5d5f..880279e525e9 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -63,6 +63,7 @@ #import #import #import +#import const NSMenu *DisplayServerMacOS::_get_menu_root(const String &p_menu_root) const { const NSMenu *menu = nullptr; @@ -3405,7 +3406,7 @@ - (void)popupAction:(id)sender { wd.wb_offset.x = MAX(wd.wb_offset.x, 12); wd.wb_offset.y = MAX(wd.wb_offset.y, 12); if (wd.window_button_view) { - [wd.window_button_view setOffset:NSMakePoint(wd.wb_offset.x, wd.wb_offset.y)]; + [(GodotButtonView *)wd.window_button_view setOffset:NSMakePoint(wd.wb_offset.x, wd.wb_offset.y)]; } } @@ -4513,34 +4514,51 @@ - (void)popupAction:(id)sender { [main_menu setSubmenu:apple_menu forItem:menu_item]; [main_menu setAutoenablesItems:NO]; - //!!!!!!!!!!!!!!!!!!!!!!!!!! - //TODO - do Vulkan and OpenGL support checks, driver selection and fallback rendering_driver = p_rendering_driver; #if defined(GLES3_ENABLED) if (rendering_driver == "opengl3_angle") { - gl_manager_angle = memnew(GLManagerANGLE_MacOS); - if (gl_manager_angle->initialize() != OK || gl_manager_angle->open_display(nullptr) != OK) { - memdelete(gl_manager_angle); - gl_manager_angle = nullptr; - bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_native"); - if (fallback) { - WARN_PRINT("Your video card drivers seem not to support the required Metal version, switching to native OpenGL."); - rendering_driver = "opengl3"; - } else { - r_error = ERR_UNAVAILABLE; - ERR_FAIL_MSG("Could not initialize ANGLE OpenGL."); + if (@available(macOS 10.15, *)) { + // Try ANGLE over Metal if running on macOS 10.15+ and on hardware with Metal 2 support. + id device = MTLCreateSystemDefaultDevice(); + if (device && [device supportsFamily:MTLGPUFamilyMac2]) { + gl_manager_angle = memnew(GLManagerANGLE_MacOS(true)); + if (gl_manager_angle->initialize() != OK || gl_manager_angle->open_display(nullptr) != OK) { + memdelete(gl_manager_angle); + gl_manager_angle = nullptr; + + WARN_PRINT("Your video card drivers seem not to support the required Metal version for ANGLE, switching to ANGLE over OpenGL."); + } + } + } + if (!gl_manager_angle) { + // Try ANGLE over native OpenGL. + gl_manager_angle = memnew(GLManagerANGLE_MacOS(false)); + if (gl_manager_angle->initialize() != OK || gl_manager_angle->open_display(nullptr) != OK) { + memdelete(gl_manager_angle); + gl_manager_angle = nullptr; + + bool fallback = GLOBAL_GET("rendering/gl_compatibility/fallback_to_native"); + if (fallback) { + WARN_PRINT("Your video card drivers seem not to support the required OpenGL version for ANGLE, switching to native OpenGL."); + rendering_driver = "opengl3"; + } else { + r_error = ERR_UNAVAILABLE; + ERR_FAIL_MSG("Could not initialize OpenGL (ANGLE)."); + } } } } if (rendering_driver == "opengl3") { + // Try natvie OpenGL. gl_manager_legacy = memnew(GLManagerLegacy_MacOS); if (gl_manager_legacy->initialize() != OK) { memdelete(gl_manager_legacy); gl_manager_legacy = nullptr; + r_error = ERR_UNAVAILABLE; - ERR_FAIL_MSG("Could not initialize native OpenGL."); + ERR_FAIL_MSG("Could not initialize OpenGL (Native)."); } } #endif diff --git a/platform/macos/gl_manager_macos_angle.h b/platform/macos/gl_manager_macos_angle.h index 919b8ec9c868..768c908c6b01 100644 --- a/platform/macos/gl_manager_macos_angle.h +++ b/platform/macos/gl_manager_macos_angle.h @@ -45,6 +45,8 @@ class GLManagerANGLE_MacOS : public EGLManager { private: + bool use_metal = true; + virtual const char *_get_platform_extension_name() const override; virtual EGLenum _get_platform_extension_enum() const override; virtual EGLenum _get_platform_api_enum() const override; @@ -54,7 +56,7 @@ class GLManagerANGLE_MacOS : public EGLManager { public: void window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height) {} - GLManagerANGLE_MacOS() {} + GLManagerANGLE_MacOS(bool p_metal); ~GLManagerANGLE_MacOS() {} }; diff --git a/platform/macos/gl_manager_macos_angle.mm b/platform/macos/gl_manager_macos_angle.mm index ec0ca3e1f319..c3f5230e0619 100644 --- a/platform/macos/gl_manager_macos_angle.mm +++ b/platform/macos/gl_manager_macos_angle.mm @@ -48,7 +48,11 @@ Vector GLManagerANGLE_MacOS::_get_platform_display_attributes() const { Vector ret; ret.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); - ret.push_back(EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE); + if (use_metal) { + ret.push_back(EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE); + } else { + ret.push_back(EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE); + } ret.push_back(EGL_NONE); return ret; @@ -67,4 +71,8 @@ return ret; } +GLManagerANGLE_MacOS::GLManagerANGLE_MacOS(bool p_metal) { + use_metal = p_metal; +} + #endif // MACOS_ENABLED && GLES3_ENABLED