11#![ allow( clippy:: let_unit_value) ] // `let () =` being used to constrain result type
22
33use std:: ffi:: c_uint;
4+ use std:: mem:: ManuallyDrop ;
45use std:: ptr:: NonNull ;
56use std:: sync:: Once ;
67use std:: thread;
@@ -14,7 +15,7 @@ use objc::{
1415 class,
1516 declare:: ClassDecl ,
1617 msg_send,
17- rc:: autoreleasepool,
18+ rc:: { autoreleasepool, StrongPtr } ,
1819 runtime:: { Class , Object , Sel , BOOL , NO , YES } ,
1920 sel, sel_impl,
2021} ;
@@ -81,7 +82,9 @@ impl super::Surface {
8182 delegate : Option < & HalManagedMetalLayerDelegate > ,
8283 ) -> Self {
8384 let layer = unsafe { Self :: get_metal_layer ( view, delegate) } ;
84- // SAFETY: The layer is an initialized instance of `CAMetalLayer`.
85+ let layer = ManuallyDrop :: new ( layer) ;
86+ // SAFETY: The layer is an initialized instance of `CAMetalLayer`, and
87+ // we transfer the retain count to `MetalLayer` using `ManuallyDrop`.
8588 let layer = unsafe { metal:: MetalLayer :: from_ptr ( layer. cast ( ) ) } ;
8689 let view: * mut Object = msg_send ! [ view. as_ptr( ) , retain] ;
8790 let view = NonNull :: new ( view) . expect ( "retain should return the same object" ) ;
@@ -108,7 +111,7 @@ impl super::Surface {
108111 pub ( crate ) unsafe fn get_metal_layer (
109112 view : NonNull < Object > ,
110113 delegate : Option < & HalManagedMetalLayerDelegate > ,
111- ) -> * mut Object {
114+ ) -> StrongPtr {
112115 let is_main_thread: BOOL = msg_send ! [ class!( NSThread ) , isMainThread] ;
113116 if is_main_thread == NO {
114117 panic ! ( "get_metal_layer cannot be called in non-ui thread." ) ;
@@ -142,7 +145,7 @@ impl super::Surface {
142145 // render directly into that; after all, the user passed a view
143146 // with an explicit Metal layer to us, so this is very likely what
144147 // they expect us to do.
145- root_layer
148+ unsafe { StrongPtr :: retain ( root_layer) }
146149 } else {
147150 // The view does not have a `CAMetalLayer` as the root layer (this
148151 // is the default for most views).
@@ -247,7 +250,7 @@ impl super::Surface {
247250 if let Some ( delegate) = delegate {
248251 let ( ) = msg_send ! [ new_layer, setDelegate: delegate. 0 ] ;
249252 }
250- new_layer
253+ unsafe { StrongPtr :: new ( new_layer) }
251254 }
252255 }
253256
0 commit comments