diff --git a/Cargo.toml b/Cargo.toml index b914b5e411..a3e3d3d4c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,6 +79,8 @@ mint = ["dpi/mint"] rwh_04 = ["dep:rwh_04", "ndk/rwh_04"] rwh_05 = ["dep:rwh_05", "ndk/rwh_05"] rwh_06 = ["dep:rwh_06", "ndk/rwh_06"] +# Only works on iOS/macOS, will create a UIView/NSView with CAMetalLayer and sets gl_or_metal_backed (iOS) true +metal = [] [build-dependencies] cfg_aliases = "0.2.1" diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/ios/view.rs index 418968c70c..64b62aa964 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/ios/view.rs @@ -48,6 +48,11 @@ declare_class!( } unsafe impl WinitView { + #[allow(non_snake_case)] + #[cfg(feature="metal")] + #[method(layerClass)] + fn layerClass() -> &'static objc2::runtime::AnyClass{ objc2::class!(CAMetalLayer) } + #[method(drawRect:)] fn draw_rect(&self, rect: CGRect) { let mtm = MainThreadMarker::new().unwrap(); diff --git a/src/platform_impl/ios/window.rs b/src/platform_impl/ios/window.rs index be0275952d..c25883e3f0 100644 --- a/src/platform_impl/ios/window.rs +++ b/src/platform_impl/ios/window.rs @@ -522,8 +522,9 @@ impl Window { let view = WinitView::new(mtm, &window_attributes, frame); - let gl_or_metal_backed = - view.isKindOfClass(class!(CAMetalLayer)) || view.isKindOfClass(class!(CAEAGLLayer)); + let gl_or_metal_backed = cfg!(feature = "metal") + || view.isKindOfClass(class!(CAMetalLayer)) + || view.isKindOfClass(class!(CAEAGLLayer)); let view_controller = WinitViewController::new(mtm, &window_attributes, &view); let window = WinitUIWindow::new(mtm, &window_attributes, frame, &view_controller); diff --git a/src/platform_impl/macos/view.rs b/src/platform_impl/macos/view.rs index d2a9948fc1..97710cde6e 100644 --- a/src/platform_impl/macos/view.rs +++ b/src/platform_impl/macos/view.rs @@ -804,6 +804,16 @@ impl WinitView { }); let this: Retained = unsafe { msg_send_id![super(this), init] }; + if cfg!(feature = "metal") { + unsafe { + let _: () = objc2::msg_send![&this, setWantsLayer: objc2::ffi::YES]; + let metal_layer_cls = objc2::class!(CAMetalLayer); + let metal_layer: *mut objc2::runtime::AnyObject = + objc2::msg_send![metal_layer_cls, new]; + let _: () = objc2::msg_send![&this, setLayer: metal_layer]; + } + } + this.setPostsFrameChangedNotifications(true); let notification_center = unsafe { NSNotificationCenter::defaultCenter() }; unsafe {