11//! macOS IOSurface texture import implementation
22
3- #![ allow( unexpected_cfgs) ] // Suppress objc crate internal cfg warnings
4-
53use super :: common:: texture;
64use super :: { TextureImportError , TextureImportResult , TextureImporter } ;
75use crate :: osr_texture_import:: common:: format;
86use crate :: { sys:: cef_color_type_t, AcceleratedPaintInfo } ;
7+ use objc2:: rc:: Retained ;
98use objc2_io_surface:: IOSurfaceRef ;
9+ use objc2_metal:: {
10+ MTLDevice , MTLPixelFormat , MTLStorageMode , MTLTextureDescriptor , MTLTextureType ,
11+ MTLTextureUsage ,
12+ } ;
1013use wgpu:: TextureDescriptor ;
1114
1215use std:: os:: raw:: c_void;
1316
14- #[ cfg( target_os = "macos" ) ]
15- use objc:: { sel, sel_impl} ;
16-
1717pub struct IOSurfaceImporter {
1818 pub handle : * mut c_void ,
1919 pub format : cef_color_type_t ,
@@ -91,43 +91,41 @@ impl IOSurfaceImporter {
9191 fn get_metal_desc (
9292 & self ,
9393 texture_desc : & TextureDescriptor ,
94- ) -> Result < metal:: TextureDescriptor , TextureImportError > {
95- use metal:: { MTLPixelFormat , MTLStorageMode , MTLTextureType , MTLTextureUsage } ;
96-
94+ ) -> Result < Retained < MTLTextureDescriptor > , TextureImportError > {
9795 if self . width == 0 || self . height == 0 {
9896 return Err ( TextureImportError :: InvalidHandle (
9997 "Invalid IOSurface texture dimensions" . to_string ( ) ,
10098 ) ) ;
10199 }
102100
103- let metal_desc = metal:: TextureDescriptor :: new ( ) ;
104- metal_desc. set_width ( texture_desc. size . width as _ ) ;
105- metal_desc. set_height ( texture_desc. size . height as _ ) ;
106- metal_desc. set_array_length ( texture_desc. array_layer_count ( ) as _ ) ;
107- metal_desc. set_mipmap_level_count ( texture_desc. mip_level_count as _ ) ;
108- metal_desc. set_sample_count ( texture_desc. sample_count as _ ) ;
109- metal_desc. set_texture_type ( MTLTextureType :: D2 ) ;
110- metal_desc. set_pixel_format ( match texture_desc. format {
111- wgpu:: TextureFormat :: Rgba8Unorm => MTLPixelFormat :: RGBA8Unorm ,
112- wgpu:: TextureFormat :: Bgra8Unorm => MTLPixelFormat :: BGRA8Unorm ,
113- _ => unimplemented ! ( ) ,
114- } ) ;
115- metal_desc. set_usage ( MTLTextureUsage :: ShaderRead ) ;
116- metal_desc. set_storage_mode ( MTLStorageMode :: Managed ) ;
101+ let metal_desc = MTLTextureDescriptor :: new ( ) ;
102+ unsafe {
103+ metal_desc. setWidth ( texture_desc. size . width as _ ) ;
104+ metal_desc. setHeight ( texture_desc. size . height as _ ) ;
105+ metal_desc. setArrayLength ( texture_desc. array_layer_count ( ) as _ ) ;
106+ metal_desc. setMipmapLevelCount ( texture_desc. mip_level_count as _ ) ;
107+ metal_desc. setSampleCount ( texture_desc. sample_count as _ ) ;
108+ metal_desc. setTextureType ( MTLTextureType :: Type2D ) ;
109+ metal_desc. setPixelFormat ( match texture_desc. format {
110+ wgpu:: TextureFormat :: Rgba8Unorm => MTLPixelFormat :: RGBA8Unorm ,
111+ wgpu:: TextureFormat :: Bgra8Unorm => MTLPixelFormat :: BGRA8Unorm ,
112+ _ => unimplemented ! ( ) ,
113+ } ) ;
114+ metal_desc. setUsage ( MTLTextureUsage :: ShaderRead ) ;
115+ metal_desc. setStorageMode ( MTLStorageMode :: Managed ) ;
116+ }
117117
118118 Ok ( metal_desc)
119119 }
120120
121121 fn import_via_metal ( & self , device : & wgpu:: Device ) -> TextureImportResult {
122- use metal:: MTLTextureType ;
123-
124122 // Convert handle to IOSurface
125123 let io_surface = std:: ptr:: NonNull :: new ( self . handle . cast :: < IOSurfaceRef > ( ) ) . ok_or (
126124 TextureImportError :: InvalidHandle ( "Invalid IOSurface handle" . to_string ( ) ) ,
127125 ) ?;
128126
129127 let texture_desc = self . get_texture_desc ( ) ;
130- let hal_tex = objc :: rc :: autoreleasepool ( || {
128+ let hal_tex = {
131129 let metal_desc = self . get_metal_desc ( & texture_desc) ?;
132130
133131 // Get Metal device from wgpu and create texture
@@ -139,17 +137,21 @@ impl IOSurfaceImporter {
139137 ) ) ;
140138 } ;
141139
142- let texture = objc:: msg_send![
143- hal_device. raw_device( ) . as_ref( ) ,
144- newTextureWithDescriptor: metal_desc. as_ref( )
145- iosurface: io_surface
146- plane: 0
147- ] ;
140+ let texture = hal_device
141+ . raw_device ( )
142+ . newTextureWithDescriptor_iosurface_plane (
143+ metal_desc. as_ref ( ) ,
144+ io_surface. as_ref ( ) ,
145+ 0 ,
146+ )
147+ . ok_or ( TextureImportError :: InvalidHandle (
148+ "Invalid IOSurface handle" . to_string ( ) ,
149+ ) ) ?;
148150
149151 let hal_tex = <wgpu:: wgc:: api:: Metal as wgpu:: hal:: Api >:: Device :: texture_from_raw (
150152 texture,
151153 texture_desc. format ,
152- MTLTextureType :: D2 ,
154+ MTLTextureType :: Type2D ,
153155 texture_desc. array_layer_count ( ) ,
154156 texture_desc. mip_level_count ,
155157 wgpu:: hal:: CopyExtent {
@@ -161,8 +163,8 @@ impl IOSurfaceImporter {
161163
162164 Ok :: < _ , TextureImportError > ( hal_tex)
163165 } ?;
164- Ok ( texture)
165- } ) ? ;
166+ texture
167+ } ;
166168
167169 Ok ( unsafe {
168170 device. create_texture_from_hal :: < wgpu:: wgc:: api:: Metal > ( hal_tex, & texture_desc)
0 commit comments