diff options
author | Martin Robinson <mrobinson@igalia.com> | 2024-10-09 10:30:24 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-09 17:30:24 +0000 |
commit | 9195344b75b4e5fd1cd86671b10df46a956f0fea (patch) | |
tree | 20ef541e886032195be6ae57403e4c05ff438c26 /components/script/dom/htmlmediaelement.rs | |
parent | 30cbf01280dc3aa03caeaba11f55808f7ba59cf3 (diff) | |
download | servo-9195344b75b4e5fd1cd86671b10df46a956f0fea.tar.gz servo-9195344b75b4e5fd1cd86671b10df46a956f0fea.zip |
compositor: Create a single cross-process compositor API (#33619) (#33660)
Instead of exposing many different kinds of messages to the compositor
that are routed through the constellation, expose a single message type
which can be sent across IPC channels. In addition, this IPC channel and
the route to the crossbeam channel with the compositor is created along
with the `CompositorProxy`, simplifying what needs to be passed around
during pipeline initialization.
Previously, some image updates (from video) were sent over IPC with a
special serialization routine and some were sent via crossbeam channels
(canvas). Now all updates go over the IPC channel `IpcSharedMemory` is
used to avoid serialization penalties. This should improve performance
and reduce copies for video, but add a memory copy overhead for canvas.
This will improve in the future when canvas renders directly into a
texture.
All-in-all this is a simplification which opens the path toward having a
standard compositor API and reduces the number of duplicate messages and
proxying that had to happen in libservo.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 72657e5e3eb..89b1eebac78 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -17,7 +17,7 @@ use headers::{ContentLength, ContentRange, HeaderMapExt}; use html5ever::{local_name, namespace_url, ns, LocalName, Prefix}; use http::header::{self, HeaderMap, HeaderValue}; use http::StatusCode; -use ipc_channel::ipc; +use ipc_channel::ipc::{self, IpcSharedMemory}; use ipc_channel::router::ROUTER; use js::jsapi::JSAutoRealm; use media::{glplayer_channel, GLPlayerMsg, GLPlayerMsgForward, WindowGLContext}; @@ -35,10 +35,10 @@ use servo_media::player::{PlaybackState, Player, PlayerError, PlayerEvent, SeekL use servo_media::{ClientContextId, ServoMedia, SupportsMediaType}; use servo_url::ServoUrl; use webrender_api::{ - ExternalImageData, ExternalImageId, ExternalImageType, ImageBufferKind, ImageData, - ImageDescriptor, ImageDescriptorFlags, ImageFormat, ImageKey, + ExternalImageData, ExternalImageId, ExternalImageType, ImageBufferKind, ImageDescriptor, + ImageDescriptorFlags, ImageFormat, ImageKey, }; -use webrender_traits::{ImageUpdate, WebRenderScriptApi}; +use webrender_traits::{CrossProcessCompositorApi, ImageUpdate, SerializableImageData}; use crate::document_loader::{LoadBlocker, LoadType}; use crate::dom::attr::Attr; @@ -157,7 +157,7 @@ impl FrameHolder { pub struct MediaFrameRenderer { player_id: Option<u64>, - api: WebRenderScriptApi, + compositor_api: CrossProcessCompositorApi, current_frame: Option<(ImageKey, i32, i32)>, old_frame: Option<ImageKey>, very_old_frame: Option<ImageKey>, @@ -166,10 +166,10 @@ pub struct MediaFrameRenderer { } impl MediaFrameRenderer { - fn new(render_api_sender: WebRenderScriptApi) -> Self { + fn new(compositor_api: CrossProcessCompositorApi) -> Self { Self { player_id: None, - api: render_api_sender, + compositor_api, current_frame: None, old_frame: None, very_old_frame: None, @@ -214,7 +214,7 @@ impl VideoFrameRenderer for MediaFrameRenderer { updates.push(ImageUpdate::UpdateImage( *image_key, descriptor, - ImageData::Raw(frame.get_data()), + SerializableImageData::Raw(IpcSharedMemory::from_bytes(&frame.get_data())), )); } @@ -229,7 +229,7 @@ impl VideoFrameRenderer for MediaFrameRenderer { Some((ref mut image_key, ref mut width, ref mut height)) => { self.old_frame = Some(*image_key); - let Some(new_image_key) = self.api.generate_image_key() else { + let Some(new_image_key) = self.compositor_api.generate_image_key() else { return; }; @@ -245,13 +245,13 @@ impl VideoFrameRenderer for MediaFrameRenderer { ImageBufferKind::Texture2D }; - ImageData::External(ExternalImageData { + SerializableImageData::External(ExternalImageData { id: ExternalImageId(self.player_id.unwrap()), channel_index: 0, image_type: ExternalImageType::TextureHandle(texture_target), }) } else { - ImageData::Raw(frame.get_data()) + SerializableImageData::Raw(IpcSharedMemory::from_bytes(&frame.get_data())) }; self.current_frame_holder @@ -261,7 +261,7 @@ impl VideoFrameRenderer for MediaFrameRenderer { updates.push(ImageUpdate::AddImage(new_image_key, descriptor, image_data)); }, None => { - let Some(image_key) = self.api.generate_image_key() else { + let Some(image_key) = self.compositor_api.generate_image_key() else { return; }; self.current_frame = Some((image_key, frame.get_width(), frame.get_height())); @@ -273,13 +273,13 @@ impl VideoFrameRenderer for MediaFrameRenderer { ImageBufferKind::Texture2D }; - ImageData::External(ExternalImageData { + SerializableImageData::External(ExternalImageData { id: ExternalImageId(self.player_id.unwrap()), channel_index: 0, image_type: ExternalImageType::TextureHandle(texture_target), }) } else { - ImageData::Raw(frame.get_data()) + SerializableImageData::Raw(IpcSharedMemory::from_bytes(&frame.get_data())) }; self.current_frame_holder = Some(FrameHolder::new(frame)); @@ -287,7 +287,7 @@ impl VideoFrameRenderer for MediaFrameRenderer { updates.push(ImageUpdate::AddImage(image_key, descriptor, image_data)); }, } - self.api.update_images(updates); + self.compositor_api.update_images(updates); } } @@ -446,7 +446,7 @@ impl HTMLMediaElement { in_flight_play_promises_queue: Default::default(), player: Default::default(), video_renderer: Arc::new(Mutex::new(MediaFrameRenderer::new( - document.window().get_webrender_api_sender(), + document.window().compositor_api().clone(), ))), audio_renderer: Default::default(), show_poster: Cell::new(true), |