@@ -34,7 +34,7 @@ use std::{
34
34
35
35
use arrayvec:: ArrayVec ;
36
36
use bitflags:: bitflags;
37
- use metal:: foreign_types:: ForeignTypeRef as _;
37
+ use metal:: foreign_types:: { ForeignType as _ , ForeignTypeRef as _} ;
38
38
use parking_lot:: { Mutex , RwLock } ;
39
39
40
40
#[ derive( Clone , Debug ) ]
@@ -100,7 +100,7 @@ pub struct Instance {}
100
100
101
101
impl Instance {
102
102
pub fn create_surface_from_layer ( & self , layer : & metal:: MetalLayerRef ) -> Surface {
103
- unsafe { Surface :: from_layer ( layer) }
103
+ Surface :: from_layer ( layer)
104
104
}
105
105
}
106
106
@@ -119,19 +119,25 @@ impl crate::Instance for Instance {
119
119
_display_handle : raw_window_handle:: RawDisplayHandle ,
120
120
window_handle : raw_window_handle:: RawWindowHandle ,
121
121
) -> Result < Surface , crate :: InstanceError > {
122
- match window_handle {
123
- #[ cfg( target_os = "ios" ) ]
124
- raw_window_handle:: RawWindowHandle :: UiKit ( handle) => {
125
- Ok ( unsafe { Surface :: from_view ( handle. ui_view . cast ( ) ) } )
122
+ let layer = match window_handle {
123
+ raw_window_handle:: RawWindowHandle :: AppKit ( handle) => unsafe {
124
+ raw_window_metal:: Layer :: from_ns_view ( handle. ns_view )
125
+ } ,
126
+ raw_window_handle:: RawWindowHandle :: UiKit ( handle) => unsafe {
127
+ raw_window_metal:: Layer :: from_ui_view ( handle. ui_view )
128
+ } ,
129
+ _ => {
130
+ return Err ( crate :: InstanceError :: new ( format ! (
131
+ "window handle {window_handle:?} is not a Metal-compatible handle"
132
+ ) ) )
126
133
}
127
- #[ cfg( target_os = "macos" ) ]
128
- raw_window_handle:: RawWindowHandle :: AppKit ( handle) => {
129
- Ok ( unsafe { Surface :: from_view ( handle. ns_view . cast ( ) ) } )
130
- }
131
- _ => Err ( crate :: InstanceError :: new ( format ! (
132
- "window handle {window_handle:?} is not a Metal-compatible handle"
133
- ) ) ) ,
134
- }
134
+ } ;
135
+
136
+ // SAFETY: The layer is an initialized instance of `CAMetalLayer`, and
137
+ // we transfer the retain count to `MetalLayer` using `into_raw`.
138
+ let layer = unsafe { metal:: MetalLayer :: from_ptr ( layer. into_raw ( ) . cast ( ) . as_ptr ( ) ) } ;
139
+
140
+ Ok ( Surface :: new ( layer) )
135
141
}
136
142
137
143
unsafe fn enumerate_adapters (
0 commit comments