diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-07-11 01:07:13 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-11 01:07:13 -0400 |
commit | 305312e93b5cd2bc40d2c6341771eb86eac179a7 (patch) | |
tree | 6c4e4ffd988d8e0cd1fb5160311a3865fbe9af86 | |
parent | 67d38b429b28651e598230ef0889a452b11eba81 (diff) | |
parent | 1b05ad4bb37a44583f295304d7df1b40268b06ac (diff) | |
download | servo-305312e93b5cd2bc40d2c6341771eb86eac179a7.tar.gz servo-305312e93b5cd2bc40d2c6341771eb86eac179a7.zip |
Auto merge of #23746 - asajeffrey:webgl-lies-damn-lies-and-serialization, r=Manishearth
WebGLSender doesn't really implement Serializable
<!-- Please describe your changes on the following line: -->
Add an API which turns a `WebGLSender` into something that is actually serializable.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes do not require tests because this is fixing a panic
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23746)
<!-- Reviewable:end -->
-rw-r--r-- | components/canvas_traits/webgl.rs | 19 | ||||
-rw-r--r-- | components/canvas_traits/webgl_channel/mod.rs | 21 |
2 files changed, 38 insertions, 2 deletions
diff --git a/components/canvas_traits/webgl.rs b/components/canvas_traits/webgl.rs index 2df61282863..16b9d2c0b5e 100644 --- a/components/canvas_traits/webgl.rs +++ b/components/canvas_traits/webgl.rs @@ -7,7 +7,7 @@ use gleam::gl; use gleam::gl::GLsync; use gleam::gl::GLuint; use gleam::gl::Gl; -use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSharedMemory}; +use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSender, IpcSharedMemory}; use pixels::PixelFormat; use std::borrow::Cow; use std::fmt; @@ -175,10 +175,25 @@ impl WebGLMsgSender { pub fn send_dom_to_texture(&self, command: DOMToTextureCommand) -> WebGLSendResult { self.sender.send(WebGLMsg::DOMToTextureCommand(command)) } + + pub fn webxr_external_image_api(&self) -> impl webxr_api::WebGLExternalImageApi { + SerializableWebGLMsgSender { + ctx_id: self.ctx_id, + sender: self.sender.to_ipc(), + } + } +} + +// WegGLMsgSender isn't actually serializable, despite what it claims. +#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)] +struct SerializableWebGLMsgSender { + ctx_id: WebGLContextId, + #[ignore_malloc_size_of = "channels are hard"] + sender: IpcSender<WebGLMsg>, } #[typetag::serde] -impl webxr_api::WebGLExternalImageApi for WebGLMsgSender { +impl webxr_api::WebGLExternalImageApi for SerializableWebGLMsgSender { fn lock(&self) -> Result<(GLuint, Size2D<i32>, GLsync), webxr_api::Error> { let (sender, receiver) = webgl_channel().or(Err(webxr_api::Error::CommunicationError))?; self.sender diff --git a/components/canvas_traits/webgl_channel/mod.rs b/components/canvas_traits/webgl_channel/mod.rs index aa448b75867..c9b2137a287 100644 --- a/components/canvas_traits/webgl_channel/mod.rs +++ b/components/canvas_traits/webgl_channel/mod.rs @@ -8,6 +8,7 @@ mod ipc; mod mpsc; use crate::webgl::WebGLMsg; +use ipc_channel::ipc::IpcSender; use serde::{Deserialize, Serialize}; use servo_config::opts; use std::fmt; @@ -93,6 +94,26 @@ impl WebGLChan { pub fn send(&self, msg: WebGLMsg) -> WebGLSendResult { self.0.send(msg) } + + pub fn to_ipc(&self) -> IpcSender<WebGLMsg> { + match self.0 { + WebGLSender::Ipc(ref sender) => sender.clone(), + WebGLSender::Mpsc(ref mpsc_sender) => { + let (sender, receiver) = + ipc_channel::ipc::channel().expect("IPC Channel creation failed"); + let mpsc_sender = mpsc_sender.clone(); + ipc_channel::router::ROUTER.add_route( + receiver.to_opaque(), + Box::new(move |message| { + if let Ok(message) = message.to() { + let _ = mpsc_sender.send(message); + } + }), + ); + sender + }, + } + } } #[derive(Clone, Debug, Deserialize, Serialize)] |