Skip to content

Commit 2822f9a

Browse files
authored
Merge pull request #407 from wravery/objc2-metal
chore(deps): switch to objc2-metal crate
2 parents dab5165 + 261ce14 commit 2822f9a

6 files changed

Lines changed: 58 additions & 54 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,11 @@ glib-unix = "0.22"
4141
io-surface = "0.16"
4242
libc = "0.2"
4343
libloading = "0.9"
44-
metal = "0.33"
45-
objc = "0.2"
4644
objc2 = "0.6.3"
4745
objc2-app-kit = { version = "0.3.2", default-features = false }
4846
objc2-foundation = "0.3.2"
4947
objc2-io-surface = "0.3.2"
48+
objc2-metal = { version = "0.3", features = ["objc2-io-surface"] }
5049
plist = "1"
5150
proc-macro2 = "1"
5251
quote = "1"
@@ -58,7 +57,7 @@ syn = { version = "2", features = ["full"] }
5857
thiserror = "2"
5958
toml_edit = "0.25"
6059
tracing = "0.1"
61-
wgpu = "28"
60+
wgpu = "29"
6261
winres = "0.1"
6362
x11-dl = "2"
6463

cef/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ sandbox = ["cef-dll-sys/sandbox"]
2222
accelerated_osr = [
2323
"ash",
2424
"libc",
25-
"objc",
25+
"objc2-foundation",
2626
"objc2-io-surface",
27-
"metal",
27+
"objc2-metal",
2828
"thiserror",
2929
"tracing",
3030
"wgpu",
@@ -72,9 +72,9 @@ windows = { workspace = true, optional = true }
7272
[target.'cfg(target_os = "macos")'.dependencies]
7373
libloading.workspace = true
7474
objc2.workspace = true
75+
objc2-foundation = { workspace = true, optional = true }
7576
objc2-io-surface = { workspace = true, optional = true }
76-
objc = { workspace = true, optional = true }
77-
metal = { workspace = true, optional = true }
77+
objc2-metal = { workspace = true, optional = true }
7878
plist = { workspace = true, optional = true }
7979
semver = { workspace = true, optional = true }
8080

cef/src/osr_texture_import/iosurface.rs

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
//! macOS IOSurface texture import implementation
22
3-
#![allow(unexpected_cfgs)] // Suppress objc crate internal cfg warnings
4-
53
use super::common::texture;
64
use super::{TextureImportError, TextureImportResult, TextureImporter};
75
use crate::osr_texture_import::common::format;
86
use crate::{sys::cef_color_type_t, AcceleratedPaintInfo};
7+
use objc2::rc::Retained;
98
use objc2_io_surface::IOSurfaceRef;
9+
use objc2_metal::{
10+
MTLDevice, MTLPixelFormat, MTLStorageMode, MTLTextureDescriptor, MTLTextureType,
11+
MTLTextureUsage,
12+
};
1013
use wgpu::TextureDescriptor;
1114

1215
use std::os::raw::c_void;
1316

14-
#[cfg(target_os = "macos")]
15-
use objc::{sel, sel_impl};
16-
1717
pub 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)

examples/osr/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ windows = { workspace = true }
2626
libloading.workspace = true
2727

2828
[target.'cfg(target_os = "macos")'.dependencies]
29-
metal.workspace = true
30-
objc.workspace = true
31-
io-surface.workspace = true
29+
objc2-metal.workspace = true
30+
objc2-io-surface.workspace = true
3231

3332
[target.'cfg(target_os = "linux")'.dependencies]
3433
libc.workspace = true

examples/osr/src/main.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ mod webrender;
22

33
use cef::{args::Args, *};
44
use std::{cell::RefCell, process::ExitCode, sync::Arc, thread::sleep, time::Duration};
5-
use wgpu::Backends;
6-
use wgpu::util::DeviceExt;
5+
use wgpu::{Backends, CurrentSurfaceTexture, util::DeviceExt};
76
use winit::{
87
application::ApplicationHandler,
98
event::WindowEvent,
@@ -30,15 +29,15 @@ struct State {
3029

3130
impl State {
3231
async fn new(window: Arc<Window>) -> State {
33-
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
32+
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
3433
#[cfg(target_os = "windows")]
3534
backends: Backends::from_comma_list("dx12"),
3635
#[cfg(target_os = "macos")]
3736
backends: Backends::from_comma_list("metal"),
3837
#[cfg(target_os = "linux")]
3938
backends: Backends::from_comma_list("vulkan"),
4039
//flags: wgpu::InstanceFlags::debugging(),
41-
..Default::default()
40+
..wgpu::InstanceDescriptor::new_without_display_handle()
4241
});
4342
let adapter = instance
4443
.request_adapter(&wgpu::RequestAdapterOptions {
@@ -91,7 +90,7 @@ impl State {
9190
let render_pipeline_layout =
9291
device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
9392
label: Some("Cef Pipeline Layout"),
94-
bind_group_layouts: &[&texture_bind_group_layout],
93+
bind_group_layouts: &[Some(&texture_bind_group_layout)],
9594
immediate_size: 0,
9695
});
9796
let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
@@ -178,10 +177,15 @@ impl State {
178177
}
179178

180179
fn render(&mut self) {
181-
let surface_texture = self
182-
.surface
183-
.get_current_texture()
184-
.expect("failed to acquire next swapchain texture");
180+
let surface_texture = match self.surface.get_current_texture() {
181+
CurrentSurfaceTexture::Success(success) => success,
182+
CurrentSurfaceTexture::Suboptimal(suboptimal) => {
183+
self.configure_surface();
184+
suboptimal
185+
}
186+
_ => return,
187+
};
188+
185189
let frame = surface_texture
186190
.texture
187191
.create_view(&wgpu::TextureViewDescriptor {

examples/tests_shared/src/browser/client_app_browser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::{
99
sync::Arc,
1010
};
1111

12-
pub trait Delegate: Send {
12+
pub trait Delegate: Send + Sync {
1313
fn on_before_command_line_processing(
1414
&self,
1515
_app: &Arc<ClientAppBrowser>,

0 commit comments

Comments
 (0)