Revert "compositor: Unify the cross process and in-process API (#36443)" (#36533)

This reverts commit 4c55104b36.

This commit introduced an issue where messages from script to the
compositor no longer woke up the embedder. There is a larger issue
here, but this change exacerbated it.

Fixes #36528.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
Martin Robinson 2025-04-15 11:15:14 +02:00 committed by GitHub
parent f8b6b9f7b6
commit fe4306fc30
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 215 additions and 95 deletions

View file

@ -19,7 +19,8 @@ use bitflags::bitflags;
use compositing_traits::display_list::{CompositorDisplayListInfo, HitTestInfo, ScrollTree};
use compositing_traits::rendering_context::RenderingContext;
use compositing_traits::{
CompositionPipeline, CompositorMsg, ImageUpdate, RendererWebView, SendableFrameTree,
CompositionPipeline, CompositorMsg, CompositorReceiver, CrossProcessCompositorMessage,
ImageUpdate, RendererWebView, SendableFrameTree,
};
use constellation_traits::{AnimationTickType, EmbedderToConstellationMessage, PaintMetricEvent};
use crossbeam_channel::Sender;
@ -30,7 +31,7 @@ use embedder_traits::{
};
use euclid::{Point2D, Rect, Scale, Size2D, Transform3D};
use fnv::FnvHashMap;
use ipc_channel::ipc::{self, IpcReceiver, IpcSharedMemory};
use ipc_channel::ipc::{self, IpcSharedMemory};
use libc::c_void;
use log::{debug, info, trace, warn};
use pixels::{CorsStatus, Image, ImageFrame, PixelFormat};
@ -89,7 +90,7 @@ pub struct ServoRenderer {
shutdown_state: Rc<Cell<ShutdownState>>,
/// The port on which we receive messages.
compositor_receiver: IpcReceiver<CompositorMsg>,
compositor_receiver: CompositorReceiver,
/// The channel on which messages can be sent to the constellation.
pub(crate) constellation_sender: Sender<EmbedderToConstellationMessage>,
@ -466,8 +467,8 @@ impl IOCompositor {
.global
.borrow_mut()
.compositor_receiver
.try_recv()
.is_ok()
.try_recv_compositor_msg()
.is_some()
{}
// Tell the profiler, memory profiler, and scrolling timer to shut down.
@ -629,14 +630,33 @@ impl IOCompositor {
webview.dispatch_input_event(InputEvent::MouseMove(MouseMoveEvent { point }));
},
CompositorMsg::SendInitialTransaction(pipeline) => {
CompositorMsg::CrossProcess(cross_proces_message) => {
self.handle_cross_process_message(cross_proces_message);
},
}
}
/// Accept messages from content processes that need to be relayed to the WebRender
/// instance in the parent process.
#[cfg_attr(
feature = "tracing",
tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
)]
fn handle_cross_process_message(&mut self, msg: CrossProcessCompositorMessage) {
match msg {
CrossProcessCompositorMessage::SendInitialTransaction(pipeline) => {
let mut txn = Transaction::new();
txn.set_display_list(WebRenderEpoch(0), (pipeline, Default::default()));
self.generate_frame(&mut txn, RenderReasons::SCENE);
self.global.borrow_mut().send_transaction(txn);
},
CompositorMsg::SendScrollNode(webview_id, pipeline_id, point, external_scroll_id) => {
CrossProcessCompositorMessage::SendScrollNode(
webview_id,
pipeline_id,
point,
external_scroll_id,
) => {
let Some(webview) = self.webviews.get_mut(webview_id) else {
return;
};
@ -670,7 +690,7 @@ impl IOCompositor {
self.global.borrow_mut().send_transaction(txn);
},
CompositorMsg::SendDisplayList {
CrossProcessCompositorMessage::SendDisplayList {
webview_id,
display_list_descriptor,
display_list_receiver,
@ -759,7 +779,7 @@ impl IOCompositor {
self.global.borrow_mut().send_transaction(transaction);
},
CompositorMsg::HitTest(pipeline, point, flags, sender) => {
CrossProcessCompositorMessage::HitTest(pipeline, point, flags, sender) => {
// When a display list is sent to WebRender, it starts scene building in a
// separate thread and then that display list is available for hit testing.
// Without flushing scene building, any hit test we do might be done against
@ -785,11 +805,11 @@ impl IOCompositor {
let _ = sender.send(result);
},
CompositorMsg::GenerateImageKey(sender) => {
CrossProcessCompositorMessage::GenerateImageKey(sender) => {
let _ = sender.send(self.global.borrow().webrender_api.generate_image_key());
},
CompositorMsg::UpdateImages(updates) => {
CrossProcessCompositorMessage::UpdateImages(updates) => {
let mut txn = Transaction::new();
for update in updates {
match update {
@ -805,21 +825,26 @@ impl IOCompositor {
self.global.borrow_mut().send_transaction(txn);
},
CompositorMsg::AddFont(font_key, data, index) => {
CrossProcessCompositorMessage::AddFont(font_key, data, index) => {
self.add_font(font_key, index, data);
},
CompositorMsg::AddSystemFont(font_key, native_handle) => {
CrossProcessCompositorMessage::AddSystemFont(font_key, native_handle) => {
let mut transaction = Transaction::new();
transaction.add_native_font(font_key, native_handle);
self.global.borrow_mut().send_transaction(transaction);
},
CompositorMsg::AddFontInstance(font_instance_key, font_key, size, flags) => {
CrossProcessCompositorMessage::AddFontInstance(
font_instance_key,
font_key,
size,
flags,
) => {
self.add_font_instance(font_instance_key, font_key, size, flags);
},
CompositorMsg::RemoveFonts(keys, instance_keys) => {
CrossProcessCompositorMessage::RemoveFonts(keys, instance_keys) => {
let mut transaction = Transaction::new();
for instance in instance_keys.into_iter() {
@ -832,13 +857,13 @@ impl IOCompositor {
self.global.borrow_mut().send_transaction(transaction);
},
CompositorMsg::AddImage(key, desc, data) => {
CrossProcessCompositorMessage::AddImage(key, desc, data) => {
let mut txn = Transaction::new();
txn.add_image(key, desc, data.into(), None);
self.global.borrow_mut().send_transaction(txn);
},
CompositorMsg::GenerateFontKeys(
CrossProcessCompositorMessage::GenerateFontKeys(
number_of_font_keys,
number_of_font_instance_keys,
result_sender,
@ -856,7 +881,7 @@ impl IOCompositor {
.collect();
let _ = result_sender.send((font_keys, font_instance_keys));
},
CompositorMsg::GetClientWindowRect(webview_id, response_sender) => {
CrossProcessCompositorMessage::GetClientWindowRect(webview_id, response_sender) => {
let client_window_rect = self
.webviews
.get(webview_id)
@ -866,7 +891,7 @@ impl IOCompositor {
warn!("Sending response to get client window failed ({error:?}).");
}
},
CompositorMsg::GetScreenSize(webview_id, response_sender) => {
CrossProcessCompositorMessage::GetScreenSize(webview_id, response_sender) => {
let screen_size = self
.webviews
.get(webview_id)
@ -876,7 +901,7 @@ impl IOCompositor {
warn!("Sending response to get screen size failed ({error:?}).");
}
},
CompositorMsg::GetAvailableScreenSize(webview_id, response_sender) => {
CrossProcessCompositorMessage::GetAvailableScreenSize(webview_id, response_sender) => {
let available_screen_size = self
.webviews
.get(webview_id)
@ -910,14 +935,16 @@ impl IOCompositor {
}
let _ = sender.send(());
},
CompositorMsg::GenerateImageKey(sender) => {
CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GenerateImageKey(
sender,
)) => {
let _ = sender.send(self.global.borrow().webrender_api.generate_image_key());
},
CompositorMsg::GenerateFontKeys(
CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GenerateFontKeys(
number_of_font_keys,
number_of_font_instance_keys,
result_sender,
) => {
)) => {
let font_keys = (0..number_of_font_keys)
.map(|_| self.global.borrow().webrender_api.generate_font_key())
.collect();
@ -931,17 +958,26 @@ impl IOCompositor {
.collect();
let _ = result_sender.send((font_keys, font_instance_keys));
},
CompositorMsg::GetClientWindowRect(_, response_sender) => {
CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GetClientWindowRect(
_,
response_sender,
)) => {
if let Err(error) = response_sender.send(Default::default()) {
warn!("Sending response to get client window failed ({error:?}).");
}
},
CompositorMsg::GetScreenSize(_, response_sender) => {
CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GetScreenSize(
_,
response_sender,
)) => {
if let Err(error) = response_sender.send(Default::default()) {
warn!("Sending response to get client window failed ({error:?}).");
}
},
CompositorMsg::GetAvailableScreenSize(_, response_sender) => {
CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GetAvailableScreenSize(
_,
response_sender,
)) => {
if let Err(error) = response_sender.send(Default::default()) {
warn!("Sending response to get client window failed ({error:?}).");
}
@ -1564,7 +1600,12 @@ impl IOCompositor {
// Check for new messages coming from the other threads in the system.
let mut compositor_messages = vec![];
let mut found_recomposite_msg = false;
while let Ok(msg) = self.global.borrow_mut().compositor_receiver.try_recv() {
while let Some(msg) = self
.global
.borrow_mut()
.compositor_receiver
.try_recv_compositor_msg()
{
match msg {
CompositorMsg::NewWebRenderFrameReady(..) if found_recomposite_msg => {
// Only take one of duplicate NewWebRendeFrameReady messages, but do subtract

View file

@ -8,11 +8,10 @@ use std::cell::Cell;
use std::rc::Rc;
use compositing_traits::rendering_context::RenderingContext;
use compositing_traits::{CompositorMsg, CompositorProxy};
use compositing_traits::{CompositorProxy, CompositorReceiver};
use constellation_traits::EmbedderToConstellationMessage;
use crossbeam_channel::Sender;
use embedder_traits::ShutdownState;
use ipc_channel::ipc::IpcReceiver;
use profile_traits::{mem, time};
use webrender::RenderApi;
use webrender_api::DocumentId;
@ -33,7 +32,7 @@ pub struct InitialCompositorState {
/// A channel to the compositor.
pub sender: CompositorProxy,
/// A port on which messages inbound to the compositor can be received.
pub receiver: IpcReceiver<CompositorMsg>,
pub receiver: CompositorReceiver,
/// A channel to the constellation.
pub constellation_chan: Sender<EmbedderToConstellationMessage>,
/// A channel to the time profiler thread.

View file

@ -42,21 +42,7 @@ mod from_constellation {
Self::LoadComplete(..) => target!("LoadComplete"),
Self::WebDriverMouseButtonEvent(..) => target!("WebDriverMouseButtonEvent"),
Self::WebDriverMouseMoveEvent(..) => target!("WebDriverMouseMoveEvent"),
Self::SendInitialTransaction(..) => target!("SendInitialTransaction"),
Self::SendScrollNode(..) => target!("SendScrollNode"),
Self::SendDisplayList { .. } => target!("SendDisplayList"),
Self::HitTest(..) => target!("HitTest"),
Self::GenerateImageKey(..) => target!("GenerateImageKey"),
Self::AddImage(..) => target!("AddImage"),
Self::UpdateImages(..) => target!("UpdateImages"),
Self::GenerateFontKeys(..) => target!("GenerateFontKeys"),
Self::AddFont(..) => target!("AddFont"),
Self::AddSystemFont(..) => target!("AddSystemFont"),
Self::AddFontInstance(..) => target!("AddFontInstance"),
Self::RemoveFonts(..) => target!("RemoveFonts"),
Self::GetClientWindowRect(..) => target!("GetClientWindowRect"),
Self::GetScreenSize(..) => target!("GetScreenSize"),
Self::GetAvailableScreenSize(..) => target!("GetAvailableScreenSize"),
Self::CrossProcess(_) => target!("CrossProcess"),
}
}
}