aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlmediaelement.rs
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2024-10-09 10:30:24 -0700
committerGitHub <noreply@github.com>2024-10-09 17:30:24 +0000
commit9195344b75b4e5fd1cd86671b10df46a956f0fea (patch)
tree20ef541e886032195be6ae57403e4c05ff438c26 /components/script/dom/htmlmediaelement.rs
parent30cbf01280dc3aa03caeaba11f55808f7ba59cf3 (diff)
downloadservo-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.rs32
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),