mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
WebGLSender doesn't really implement Serializable
This commit is contained in:
parent
15be654868
commit
1b05ad4bb3
2 changed files with 38 additions and 2 deletions
|
@ -7,7 +7,7 @@ use gleam::gl;
|
||||||
use gleam::gl::GLsync;
|
use gleam::gl::GLsync;
|
||||||
use gleam::gl::GLuint;
|
use gleam::gl::GLuint;
|
||||||
use gleam::gl::Gl;
|
use gleam::gl::Gl;
|
||||||
use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSharedMemory};
|
use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSender, IpcSharedMemory};
|
||||||
use pixels::PixelFormat;
|
use pixels::PixelFormat;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -175,10 +175,25 @@ impl WebGLMsgSender {
|
||||||
pub fn send_dom_to_texture(&self, command: DOMToTextureCommand) -> WebGLSendResult {
|
pub fn send_dom_to_texture(&self, command: DOMToTextureCommand) -> WebGLSendResult {
|
||||||
self.sender.send(WebGLMsg::DOMToTextureCommand(command))
|
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]
|
#[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> {
|
fn lock(&self) -> Result<(GLuint, Size2D<i32>, GLsync), webxr_api::Error> {
|
||||||
let (sender, receiver) = webgl_channel().or(Err(webxr_api::Error::CommunicationError))?;
|
let (sender, receiver) = webgl_channel().or(Err(webxr_api::Error::CommunicationError))?;
|
||||||
self.sender
|
self.sender
|
||||||
|
|
|
@ -8,6 +8,7 @@ mod ipc;
|
||||||
mod mpsc;
|
mod mpsc;
|
||||||
|
|
||||||
use crate::webgl::WebGLMsg;
|
use crate::webgl::WebGLMsg;
|
||||||
|
use ipc_channel::ipc::IpcSender;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use servo_config::opts;
|
use servo_config::opts;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -93,6 +94,26 @@ impl WebGLChan {
|
||||||
pub fn send(&self, msg: WebGLMsg) -> WebGLSendResult {
|
pub fn send(&self, msg: WebGLMsg) -> WebGLSendResult {
|
||||||
self.0.send(msg)
|
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)]
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue