Skip to content

Commit 9a1665c

Browse files
Servo encapsulation and cleanup (#10108)
- Initialize WGPU manually - Improve code
1 parent 7e690eb commit 9a1665c

File tree

5 files changed

+160
-106
lines changed

5 files changed

+160
-106
lines changed

examples/servo/Cargo.lock

Lines changed: 24 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/servo/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ glow = "0.16.0"
3131
gleam = "0.15.1"
3232
image = "0.25.8"
3333
winit = "0.30.12"
34+
spin_on = "0.1.1"
3435
rustls = "0.23.34"
3536
euclid = "0.22.11"
3637
surfman = "0.10.0"

examples/servo/src/adapter.rs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,20 @@ pub struct SlintServoAdapter {
3535
pub struct SlintServoAdapterInner {
3636
scale_factor: f32,
3737
webview: Option<WebView>,
38-
rendering_adapter: Option<Box<dyn ServoRenderingAdapter>>,
38+
rendering_adapter: Option<Rc<Box<dyn ServoRenderingAdapter>>>,
3939
#[cfg(not(target_os = "android"))]
40-
device: Option<wgpu::Device>,
40+
device: wgpu::Device,
4141
#[cfg(not(target_os = "android"))]
42-
queue: Option<wgpu::Queue>,
42+
queue: wgpu::Queue,
4343
}
4444

4545
impl SlintServoAdapter {
4646
pub fn new(
4747
app: slint::Weak<MyApp>,
4848
waker_sender: Sender<()>,
4949
waker_receiver: Receiver<()>,
50+
#[cfg(not(target_os = "android"))] device: wgpu::Device,
51+
#[cfg(not(target_os = "android"))] queue: wgpu::Queue,
5052
) -> Self {
5153
Self {
5254
app,
@@ -58,9 +60,9 @@ impl SlintServoAdapter {
5860
scale_factor: 1.0,
5961
rendering_adapter: None,
6062
#[cfg(not(target_os = "android"))]
61-
device: None,
63+
device: device,
6264
#[cfg(not(target_os = "android"))]
63-
queue: None,
65+
queue: queue,
6466
}),
6567
}
6668
}
@@ -91,12 +93,12 @@ impl SlintServoAdapter {
9193

9294
#[cfg(not(target_os = "android"))]
9395
pub fn wgpu_device(&self) -> wgpu::Device {
94-
self.inner().device.as_ref().expect("Device not initialized yet").clone()
96+
self.inner().device.clone()
9597
}
9698

9799
#[cfg(not(target_os = "android"))]
98100
pub fn wgpu_queue(&self) -> wgpu::Queue {
99-
self.inner().queue.as_ref().expect("Queue not initialized yet").clone()
101+
self.inner().queue.clone()
100102
}
101103

102104
pub fn webview(&self) -> WebView {
@@ -108,7 +110,7 @@ impl SlintServoAdapter {
108110
servo: Servo,
109111
webview: WebView,
110112
scale_factor: f32,
111-
rendering_adapter: Box<dyn ServoRenderingAdapter>,
113+
rendering_adapter: Rc<Box<dyn ServoRenderingAdapter>>,
112114
) {
113115
*self.servo.borrow_mut() = Some(servo);
114116
let mut inner = self.inner_mut();
@@ -117,13 +119,6 @@ impl SlintServoAdapter {
117119
inner.rendering_adapter = Some(rendering_adapter);
118120
}
119121

120-
#[cfg(not(target_os = "android"))]
121-
pub fn set_wgpu_device_queue(&self, device: &wgpu::Device, queue: &wgpu::Queue) {
122-
let mut inner = self.inner_mut();
123-
inner.device = Some(device.clone());
124-
inner.queue = Some(queue.clone());
125-
}
126-
127122
/// Captures the current Servo framebuffer and updates the Slint UI with the rendered content.
128123
/// This bridges the rendering output from Servo to the Slint display surface.
129124
pub fn update_web_content_with_latest_frame(&self) {

examples/servo/src/lib.rs

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,65 +16,56 @@ mod gl_bindings {
1616
}
1717

1818
use slint::ComponentHandle;
19-
use smol::channel;
20-
use std::rc::Rc;
2119

22-
use crate::{
23-
adapter::{SlintServoAdapter, upgrade_adapter},
24-
on_events::on_app_callbacks,
25-
servo_util::{init_servo_webview, spin_servo_event_loop},
26-
};
20+
use crate::servo_util::init_servo;
2721

2822
slint::include_modules!();
2923

30-
#[cfg(not(target_os = "android"))]
31-
use slint::wgpu_27::{WGPUConfiguration, WGPUSettings, wgpu};
32-
3324
pub fn main() {
34-
let (waker_sender, waker_receiver) = channel::unbounded::<()>();
35-
3625
#[cfg(not(target_os = "android"))]
37-
{
38-
let mut wgpu_settings = WGPUSettings::default();
39-
wgpu_settings.device_required_features = wgpu::Features::PUSH_CONSTANTS;
40-
wgpu_settings.device_required_limits.max_push_constant_size = 16; // Maximum push size
26+
let (device, queue) = {
27+
let backends = wgpu::Backends::from_env().unwrap_or_default();
28+
29+
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
30+
backends,
31+
flags: Default::default(),
32+
backend_options: Default::default(),
33+
memory_budget_thresholds: Default::default(),
34+
});
35+
36+
let adapter = spin_on::spin_on(async {
37+
instance
38+
.request_adapter(&Default::default())
39+
.await
40+
.expect("Failed to find an appropriate WGPU adapter")
41+
});
42+
43+
let (device, queue) = spin_on::spin_on(async {
44+
adapter.request_device(&Default::default()).await.expect("Failed to create WGPU device")
45+
});
4146

4247
slint::BackendSelector::new()
43-
.require_wgpu_27(WGPUConfiguration::Automatic(wgpu_settings))
48+
.require_wgpu_27(slint::wgpu_27::WGPUConfiguration::Manual {
49+
instance,
50+
adapter,
51+
device: device.clone(),
52+
queue: queue.clone()
53+
})
4454
.select()
4555
.expect("Failed to create Slint backend with WGPU based renderer - ensure your system supports WGPU");
46-
}
47-
48-
let app = MyApp::new().expect("Failed to create Slint application - check UI resources");
4956

50-
let app_weak = app.as_weak();
57+
(device, queue)
58+
};
5159

52-
let adapter =
53-
Rc::new(SlintServoAdapter::new(app_weak, waker_sender.clone(), waker_receiver.clone()));
60+
let app = MyApp::new().expect("Failed to create Slint application - check UI resources");
5461

55-
let adapter_weak = Rc::downgrade(&adapter);
62+
let url = "https://slint.dev";
5663

5764
#[cfg(not(target_os = "android"))]
58-
app.window()
59-
.set_rendering_notifier(move |rendering_state, graphics_api| match rendering_state {
60-
slint::RenderingState::RenderingSetup => {
61-
if let slint::GraphicsAPI::WGPU27 { device, queue, .. } = graphics_api {
62-
let adpater = upgrade_adapter(&adapter_weak);
63-
adpater.set_wgpu_device_queue(device, queue);
64-
}
65-
}
66-
slint::RenderingState::BeforeRendering => {}
67-
slint::RenderingState::AfterRendering => {}
68-
slint::RenderingState::RenderingTeardown => {}
69-
_ => {}
70-
})
71-
.expect("Failed to set rendering notifier - WGPU integration may not be available");
72-
73-
init_servo_webview(adapter.clone(), "https://slint.dev".into());
74-
75-
spin_servo_event_loop(adapter.clone());
65+
let _adapter = init_servo(app.clone_strong(), url.into(), device, queue);
7666

77-
on_app_callbacks(adapter.clone());
67+
#[cfg(target_os = "android")]
68+
let _adapter = init_servo(app.clone_strong(), url.into());
7869

7970
app.run().expect("Application failed to run - check for runtime errors");
8071
}

0 commit comments

Comments
 (0)