Auto merge of #20423 - servo:bytes, r=emilio

Use ByteBuf for the canvas messages

<!-- 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/20423)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-03-26 14:49:16 -04:00 committed by GitHub
commit 9c5bdd932e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 170 additions and 62 deletions

View file

@ -78,6 +78,7 @@ script_plugins = {path = "../script_plugins"}
script_traits = {path = "../script_traits"}
selectors = { path = "../selectors" }
serde = "1.0"
serde_bytes = "0.10"
servo_allocator = {path = "../allocator"}
servo_arc = {path = "../servo_arc"}
servo_atoms = {path = "../atoms"}

View file

@ -453,13 +453,13 @@ impl CanvasRenderingContext2D {
}
let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
self.ipc_renderer
.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(image_data,
image_size,
dest_rect,
source_rect,
smoothing_enabled)))
.unwrap();
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(
image_data.into(),
image_size,
dest_rect,
source_rect,
smoothing_enabled,
))).unwrap();
self.mark_as_dirty();
Ok(())
}
@ -1127,7 +1127,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
let sh = cmp::max(1, sh.to_u32().unwrap());
let sw = cmp::max(1, sw.to_u32().unwrap());
let (sender, receiver) = ipc::channel::<Vec<u8>>(self.global().time_profiler_chan().clone()).unwrap();
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
let dest_rect = Rect::new(Point2D::new(sx.to_i32().unwrap(), sy.to_i32().unwrap()),
Size2D::new(sw as i32, sh as i32));
let canvas_size = self.canvas.as_ref().map(|c| c.get_size()).unwrap_or(Size2D::zero());
@ -1135,7 +1135,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
self.ipc_renderer
.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender)))
.unwrap();
let mut data = receiver.recv().unwrap();
let mut data = Vec::from(receiver.recv().unwrap());
// Un-premultiply alpha
for chunk in data.chunks_mut(4) {
@ -1174,10 +1174,12 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
let dirty_rect = Rect::new(Point2D::new(*dirty_x, *dirty_y),
Size2D::new(*dirty_width, *dirty_height));
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data,
offset,
image_data_size,
dirty_rect));
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(
data.into(),
offset,
image_data_size,
dirty_rect,
));
self.ipc_renderer.send(msg).unwrap();
self.mark_as_dirty();
}

View file

@ -263,7 +263,7 @@ impl HTMLCanvasElement {
let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender));
context.get_ipc_renderer().send(msg).unwrap();
receiver.recv().unwrap()?
receiver.recv().unwrap()?.into()
},
Some(&CanvasContext::WebGL(_)) => {
// TODO: add a method in WebGLRenderingContext to get the pixels.

View file

@ -35,6 +35,7 @@ use ipc_channel::ipc::IpcSender;
use profile_traits::ipc;
use script_runtime::CommonScriptMsg;
use script_runtime::ScriptThreadEventCategory::WebVREvent;
use serde_bytes::ByteBuf;
use std::cell::Cell;
use std::mem;
use std::ops::Deref;
@ -68,7 +69,7 @@ pub struct VRDisplay {
// Compositor VRFrameData synchonization
frame_data_status: Cell<VRFrameDataStatus>,
#[ignore_malloc_size_of = "closures are hard"]
frame_data_receiver: DomRefCell<Option<WebGLReceiver<Result<Vec<u8>, ()>>>>,
frame_data_receiver: DomRefCell<Option<WebGLReceiver<Result<ByteBuf, ()>>>>,
running_display_raf: Cell<bool>,
paused: Cell<bool>,
stopped_on_pause: Cell<bool>,

View file

@ -93,7 +93,11 @@ impl WebGLBuffer {
}
}
self.capacity.set(data.len());
self.renderer.send(WebGLCommand::BufferData(target, data.to_vec(), usage)).unwrap();
self.renderer.send(WebGLCommand::BufferData(
target,
data.to_vec().into(),
usage,
)).unwrap();
Ok(())
}

View file

@ -1050,12 +1050,15 @@ impl WebGLRenderingContext {
let internal_format = self.extension_manager.get_effective_tex_internal_format(format, data_type);
// TODO(emilio): convert colorspace if requested
let msg = WebGLCommand::TexImage2D(target.as_gl_constant(), level as i32,
internal_format as i32,
width as i32, height as i32,
format,
data_type,
pixels);
let msg = WebGLCommand::TexImage2D(
target.as_gl_constant(),
level as i32,
internal_format as i32,
width as i32, height as i32,
format,
data_type,
pixels.into(),
);
self.send_command(msg);
@ -1102,11 +1105,17 @@ impl WebGLRenderingContext {
self.send_command(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32));
// TODO(emilio): convert colorspace if requested
let msg = WebGLCommand::TexSubImage2D(target.as_gl_constant(),
level as i32, xoffset, yoffset,
width as i32, height as i32,
format.as_gl_constant(),
data_type.as_gl_constant(), pixels);
let msg = WebGLCommand::TexSubImage2D(
target.as_gl_constant(),
level as i32,
xoffset,
yoffset,
width as i32,
height as i32,
format.as_gl_constant(),
data_type.as_gl_constant(),
pixels.into(),
);
self.send_command(msg);
}
@ -1182,7 +1191,7 @@ impl WebGLRenderingContext {
constants::UNSIGNED_BYTE,
sender,
));
Some(receiver.recv().unwrap())
Some(receiver.recv().unwrap().into())
}
}
@ -1759,7 +1768,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if (offset as usize) + data_vec.len() > bound_buffer.capacity() {
return self.webgl_error(InvalidValue);
}
self.send_command(WebGLCommand::BufferSubData(target, offset as isize, data_vec));
self.send_command(WebGLCommand::BufferSubData(
target,
offset as isize,
data_vec.into(),
));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8

View file

@ -81,6 +81,7 @@ extern crate script_layout_interface;
extern crate script_traits;
extern crate selectors;
extern crate serde;
extern crate serde_bytes;
extern crate servo_allocator;
extern crate servo_arc;
#[macro_use] extern crate servo_atoms;