Move Servo IPC off UI thread
Root cause of the post-tab lag: the GPUI 16 ms timer was calling `WebSurfaceRuntime::ensure_tab` and `tick` on the UI thread, and each call did a synchronous `serde_json` write plus `read_line` against the Servo sidecar over stdin/stdout. With even one visible tab, every frame stalled on cross-process IPC. Introduce `web_surface_worker.rs` — a per-profile worker thread that owns the `ServoLiveClient`, drains a coalescing request queue (latest Ensure/Poll per tab wins, no unbounded growth), and ships results back through a `std::sync::mpsc` channel. `WebSurfaceRuntime` now submits work non-blockingly and drains responses in `tick`; the UI thread never blocks on the sidecar. Adjacent in-flight cleanup riding along: hardware IOSurface rendering-context completion (sidecar `live_protocol`, `hardware_rendering_context`, GPUI BGRA surface shader), CSS viewport size + device pixel ratio plumbing into `ServoLiveFrame`, and the Send opt-ins for `CVPixelBuffer`-bearing types so frames can cross the thread boundary.
This commit is contained in:
@@ -32,6 +32,7 @@ mod web_surface_permissions;
|
||||
mod web_surface_runtime;
|
||||
mod web_surface_state;
|
||||
mod web_surface_view;
|
||||
mod web_surface_worker;
|
||||
|
||||
#[cfg(test)]
|
||||
mod gpui_harness_tests;
|
||||
@@ -116,9 +117,8 @@ impl ElyShell {
|
||||
window: &mut Window,
|
||||
cx: &mut Context<Self>,
|
||||
) -> Self {
|
||||
let command_input = cx.new(|cx| {
|
||||
InputState::new(window, cx).placeholder("Search ELY or type a command…")
|
||||
});
|
||||
let command_input =
|
||||
cx.new(|cx| InputState::new(window, cx).placeholder("Search ELY or type a command…"));
|
||||
let plugin_search_input =
|
||||
cx.new(|cx| InputState::new(window, cx).placeholder("Search plugins…"));
|
||||
let translucency_slider = cx.new(|_cx| {
|
||||
@@ -129,14 +129,16 @@ impl ElyShell {
|
||||
.default_value(f32::from(DEFAULT_TRANSLUCENCY_PCT))
|
||||
});
|
||||
|
||||
let translucency_subscription =
|
||||
cx.subscribe(&translucency_slider, |shell: &mut Self, _state, event: &SliderEvent, cx| {
|
||||
let translucency_subscription = cx.subscribe(
|
||||
&translucency_slider,
|
||||
|shell: &mut Self, _state, event: &SliderEvent, cx| {
|
||||
let SliderEvent::Change(SliderValue::Single(value)) = event else {
|
||||
return;
|
||||
};
|
||||
let pct = value.clamp(0.0, 100.0).round() as u8;
|
||||
shell.set_translucency_pct(pct, cx);
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
let command_subscription = cx.subscribe_in(
|
||||
&command_input,
|
||||
|
||||
Reference in New Issue
Block a user