aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2017-08-16 23:23:18 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2017-08-16 23:23:18 +0200
commit676f2c8acf6fec8ad77d4daa51bef5bdcae101c5 (patch)
treed212209744e3b10a315dc79da754a70d7543e428 /components/script
parent4d10d39e8fe841c5fe2ac58da2daaa13c10c140e (diff)
downloadservo-676f2c8acf6fec8ad77d4daa51bef5bdcae101c5.tar.gz
servo-676f2c8acf6fec8ad77d4daa51bef5bdcae101c5.zip
Revert "Auto merge of #18114 - emilio:revert-webgl-refactor, r=nox"
This reverts commit 4d10d39e8fe841c5fe2ac58da2daaa13c10c140e, reversing changes made to ee94e2b7c0bd327abe8f9545b2a1f792f67a2bdd.
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/trace.rs29
-rw-r--r--components/script/dom/canvasgradient.rs2
-rw-r--r--components/script/dom/canvaspattern.rs2
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs16
-rw-r--r--components/script/dom/htmlcanvaselement.rs66
-rw-r--r--components/script/dom/paintrenderingcontext2d.rs10
-rw-r--r--components/script/dom/paintworkletglobalscope.rs3
-rw-r--r--components/script/dom/vrdisplay.rs36
-rw-r--r--components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs15
-rw-r--r--components/script/dom/webgl_extensions/ext/webglvertexarrayobjectoes.rs2
-rw-r--r--components/script/dom/webgl_extensions/extensions.rs2
-rw-r--r--components/script/dom/webgl_validations/tex_image_2d.rs2
-rw-r--r--components/script/dom/webglbuffer.rs29
-rw-r--r--components/script/dom/webglframebuffer.rs41
-rw-r--r--components/script/dom/webglprogram.rs56
-rw-r--r--components/script/dom/webglrenderbuffer.rs24
-rw-r--r--components/script/dom/webglrenderingcontext.rs448
-rw-r--r--components/script/dom/webglshader.rs25
-rw-r--r--components/script/dom/webgltexture.rs30
-rw-r--r--components/script/dom/webgluniformlocation.rs2
-rw-r--r--components/script/dom/window.rs19
-rw-r--r--components/script/script_thread.rs12
22 files changed, 394 insertions, 477 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 81017cd344e..4168fb4effa 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -30,8 +30,11 @@
//! `JSTraceable` to a datatype.
use app_units::Au;
-use canvas_traits::{CanvasGradientStop, LinearGradientStyle, RadialGradientStyle};
-use canvas_traits::{CompositionOrBlending, LineCapStyle, LineJoinStyle, RepetitionStyle};
+use canvas_traits::canvas::{CanvasGradientStop, LinearGradientStyle, RadialGradientStyle};
+use canvas_traits::canvas::{CompositionOrBlending, LineCapStyle, LineJoinStyle, RepetitionStyle};
+use canvas_traits::webgl::{WebGLBufferId, WebGLFramebufferId, WebGLProgramId, WebGLRenderbufferId};
+use canvas_traits::webgl::{WebGLChan, WebGLContextShareMode, WebGLError, WebGLPipeline, WebGLMsgSender};
+use canvas_traits::webgl::{WebGLReceiver, WebGLSender, WebGLShaderId, WebGLTextureId, WebGLVertexArrayId};
use cssparser::RGBA;
use devtools_traits::{CSSError, TimelineMarkerType, WorkerId};
use dom::abstractworker::SharedRt;
@@ -105,8 +108,7 @@ use style::stylesheets::keyframes_rule::Keyframe;
use style::values::specified::Length;
use time::Duration;
use uuid::Uuid;
-use webrender_api::{WebGLBufferId, WebGLError, WebGLFramebufferId, WebGLProgramId};
-use webrender_api::{WebGLRenderbufferId, WebGLShaderId, WebGLTextureId, WebGLVertexArrayId};
+use webrender_api::ImageKey;
use webvr_traits::WebVRGamepadHand;
/// A trait to allow tracing (only) DOM objects.
@@ -391,8 +393,13 @@ unsafe_no_jsmanaged_fields!(OpaqueStyleAndLayoutData);
unsafe_no_jsmanaged_fields!(PathBuf);
unsafe_no_jsmanaged_fields!(CSSErrorReporter);
unsafe_no_jsmanaged_fields!(DrawAPaintImageResult);
+unsafe_no_jsmanaged_fields!(ImageKey);
unsafe_no_jsmanaged_fields!(WebGLBufferId);
+unsafe_no_jsmanaged_fields!(WebGLChan);
+unsafe_no_jsmanaged_fields!(WebGLContextShareMode);
unsafe_no_jsmanaged_fields!(WebGLFramebufferId);
+unsafe_no_jsmanaged_fields!(WebGLMsgSender);
+unsafe_no_jsmanaged_fields!(WebGLPipeline);
unsafe_no_jsmanaged_fields!(WebGLProgramId);
unsafe_no_jsmanaged_fields!(WebGLRenderbufferId);
unsafe_no_jsmanaged_fields!(WebGLShaderId);
@@ -466,6 +473,20 @@ unsafe impl<T: Send> JSTraceable for Sender<T> {
}
}
+unsafe impl<T: Send> JSTraceable for WebGLReceiver<T> where T: for<'de> Deserialize<'de> + Serialize {
+ #[inline]
+ unsafe fn trace(&self, _: *mut JSTracer) {
+ // Do nothing
+ }
+}
+
+unsafe impl<T: Send> JSTraceable for WebGLSender<T> where T: for<'de> Deserialize<'de> + Serialize {
+ #[inline]
+ unsafe fn trace(&self, _: *mut JSTracer) {
+ // Do nothing
+ }
+}
+
unsafe impl JSTraceable for Transform2D<f32> {
#[inline]
unsafe fn trace(&self, _trc: *mut JSTracer) {
diff --git a/components/script/dom/canvasgradient.rs b/components/script/dom/canvasgradient.rs
index 64df591f760..3a0707ab5eb 100644
--- a/components/script/dom/canvasgradient.rs
+++ b/components/script/dom/canvasgradient.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::{CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle};
+use canvas_traits::canvas::{CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle};
use cssparser::{Parser, ParserInput, RGBA};
use cssparser::Color as CSSColor;
use dom::bindings::cell::DOMRefCell;
diff --git a/components/script/dom/canvaspattern.rs b/components/script/dom/canvaspattern.rs
index 5d9dd5cb767..46bcbedcef0 100644
--- a/components/script/dom/canvaspattern.rs
+++ b/components/script/dom/canvaspattern.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::{FillOrStrokeStyle, RepetitionStyle, SurfaceStyle};
+use canvas_traits::canvas::{FillOrStrokeStyle, RepetitionStyle, SurfaceStyle};
use dom::bindings::codegen::Bindings::CanvasPatternBinding;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflector, reflect_dom_object};
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 55d2ef3ceb4..d4fcfae4ab8 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -2,10 +2,10 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::{Canvas2dMsg, CanvasCommonMsg, CanvasMsg};
-use canvas_traits::{CompositionOrBlending, FillOrStrokeStyle, FillRule};
-use canvas_traits::{LineCapStyle, LineJoinStyle, LinearGradientStyle};
-use canvas_traits::{RadialGradientStyle, RepetitionStyle, byte_swap_and_premultiply};
+use canvas_traits::canvas::{Canvas2dMsg, CanvasMsg};
+use canvas_traits::canvas::{CompositionOrBlending, FillOrStrokeStyle, FillRule};
+use canvas_traits::canvas::{LineCapStyle, LineJoinStyle, LinearGradientStyle};
+use canvas_traits::canvas::{RadialGradientStyle, RepetitionStyle, byte_swap_and_premultiply};
use cssparser::{Parser, ParserInput, RGBA};
use cssparser::Color as CSSColor;
use dom::bindings::cell::DOMRefCell;
@@ -163,7 +163,7 @@ impl CanvasRenderingContext2D {
pub fn set_bitmap_dimensions(&self, size: Size2D<i32>) {
self.reset_to_initial_state();
self.ipc_renderer
- .send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size)))
+ .send(CanvasMsg::Recreate(size))
.unwrap();
}
@@ -173,10 +173,6 @@ impl CanvasRenderingContext2D {
*self.state.borrow_mut() = CanvasContextState::new();
}
- pub fn ipc_renderer(&self) -> IpcSender<CanvasMsg> {
- self.ipc_renderer.clone()
- }
-
fn mark_as_dirty(&self) {
if let Some(ref canvas) = self.canvas {
canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
@@ -1392,7 +1388,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
impl Drop for CanvasRenderingContext2D {
fn drop(&mut self) {
- if let Err(err) = self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)) {
+ if let Err(err) = self.ipc_renderer.send(CanvasMsg::Close) {
warn!("Could not close canvas: {}", err)
}
}
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index a95ff766171..3d89c08b230 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use base64;
-use canvas_traits::{CanvasMsg, FromScriptMsg};
+use canvas_traits::canvas::{CanvasMsg, FromScriptMsg};
use dom::attr::Attr;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods;
@@ -30,11 +30,11 @@ use euclid::Size2D;
use html5ever::{LocalName, Prefix};
use image::ColorType;
use image::png::PNGEncoder;
-use ipc_channel::ipc::{self, IpcSender};
+use ipc_channel::ipc;
use js::error::throw_type_error;
use js::jsapi::{HandleValue, JSContext};
use offscreen_gl_context::GLContextAttributes;
-use script_layout_interface::HTMLCanvasData;
+use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource};
use std::iter::repeat;
use style::attr::{AttrValue, LengthOrPercentageOrAuto};
@@ -106,21 +106,22 @@ impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
fn data(&self) -> HTMLCanvasData {
unsafe {
let canvas = &*self.unsafe_get();
- let ipc_renderer = canvas.context.borrow_for_layout().as_ref().map(|context| {
- match *context {
- CanvasContext::Context2d(ref context) => {
- context.to_layout().get_ipc_renderer()
- },
- CanvasContext::WebGL(ref context) => {
- context.to_layout().get_ipc_renderer()
- },
+ let source = match canvas.context.borrow_for_layout().as_ref() {
+ Some(&CanvasContext::Context2d(ref context)) => {
+ HTMLCanvasDataSource::Image(Some(context.to_layout().get_ipc_renderer()))
+ },
+ Some(&CanvasContext::WebGL(ref context)) => {
+ context.to_layout().canvas_data_source()
+ },
+ None => {
+ HTMLCanvasDataSource::Image(None)
}
- });
+ };
let width_attr = canvas.upcast::<Element>().get_attr_for_layout(&ns!(), &local_name!("width"));
let height_attr = canvas.upcast::<Element>().get_attr_for_layout(&ns!(), &local_name!("height"));
HTMLCanvasData {
- ipc_renderer: ipc_renderer,
+ source: source,
width: width_attr.map_or(DEFAULT_WIDTH, |val| val.as_uint()),
height: height_attr.map_or(DEFAULT_HEIGHT, |val| val.as_uint()),
}
@@ -150,15 +151,6 @@ impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
impl HTMLCanvasElement {
- pub fn ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>> {
- self.context.borrow().as_ref().map(|context| {
- match *context {
- CanvasContext::Context2d(ref context) => context.ipc_renderer(),
- CanvasContext::WebGL(ref context) => context.ipc_renderer(),
- }
- })
- }
-
pub fn get_or_init_2d_context(&self) -> Option<Root<CanvasRenderingContext2D>> {
if self.context.borrow().is_none() {
let window = window_from_node(self);
@@ -221,22 +213,26 @@ impl HTMLCanvasElement {
return None
}
- let data = if let Some(renderer) = self.ipc_renderer() {
- let (sender, receiver) = ipc::channel().unwrap();
- let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender));
- renderer.send(msg).unwrap();
+ let data = match self.context.borrow().as_ref() {
+ Some(&CanvasContext::Context2d(ref context)) => {
+ let (sender, receiver) = ipc::channel().unwrap();
+ let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender));
+ context.get_ipc_renderer().send(msg).unwrap();
- match receiver.recv().unwrap() {
- Some(pixels) => pixels,
- None => {
- // TODO(emilio, #14109): Not sure if WebGL canvas is
- // required for 2d spec, but I think it's not, if so, make
- // this return a readback from the GL context.
- return None;
+ match receiver.recv().unwrap() {
+ Some(pixels) => pixels,
+ None => {
+ return None;
+ }
}
+ },
+ Some(&CanvasContext::WebGL(_)) => {
+ // TODO: add a method in WebGLRenderingContext to get the pixels.
+ return None;
+ },
+ None => {
+ repeat(0xffu8).take((size.height as usize) * (size.width as usize) * 4).collect()
}
- } else {
- repeat(0xffu8).take((size.height as usize) * (size.width as usize) * 4).collect()
};
Some((data, size))
diff --git a/components/script/dom/paintrenderingcontext2d.rs b/components/script/dom/paintrenderingcontext2d.rs
index c3aa9e4c98b..c6b62b50e15 100644
--- a/components/script/dom/paintrenderingcontext2d.rs
+++ b/components/script/dom/paintrenderingcontext2d.rs
@@ -2,9 +2,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::CanvasData;
-use canvas_traits::CanvasMsg;
-use canvas_traits::FromLayoutMsg;
+use canvas_traits::canvas::CanvasImageData;
+use canvas_traits::canvas::CanvasMsg;
+use canvas_traits::canvas::FromLayoutMsg;
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasFillRule;
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasLineCap;
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasLineJoin;
@@ -58,9 +58,9 @@ impl PaintRenderingContext2D {
PaintRenderingContext2DBinding::Wrap)
}
- pub fn send_data(&self, sender: IpcSender<CanvasData>) {
+ pub fn send_data(&self, sender: IpcSender<CanvasImageData>) {
let msg = CanvasMsg::FromLayout(FromLayoutMsg::SendData(sender));
- let _ = self.context.ipc_renderer().send(msg);
+ let _ = self.context.get_ipc_renderer().send(msg);
}
pub fn take_missing_image_urls(&self) -> Vec<ServoUrl> {
diff --git a/components/script/dom/paintworkletglobalscope.rs b/components/script/dom/paintworkletglobalscope.rs
index b0a43cbf25d..607c432c78a 100644
--- a/components/script/dom/paintworkletglobalscope.rs
+++ b/components/script/dom/paintworkletglobalscope.rs
@@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::CanvasData;
use dom::bindings::callback::CallbackContainer;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::PaintWorkletGlobalScopeBinding;
@@ -298,7 +297,7 @@ impl PaintWorkletGlobalScope {
let (sender, receiver) = ipc::channel().expect("IPC channel creation.");
rendering_context.send_data(sender);
let image_key = match receiver.recv() {
- Ok(CanvasData::Image(data)) => Some(data.image_key),
+ Ok(data) => Some(data.image_key),
_ => None,
};
diff --git a/components/script/dom/vrdisplay.rs b/components/script/dom/vrdisplay.rs
index 54f06fb928f..a36bd27ad29 100644
--- a/components/script/dom/vrdisplay.rs
+++ b/components/script/dom/vrdisplay.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{webgl_channel, WebGLReceiver, WebVRCommand};
use core::ops::Deref;
use dom::bindings::callback::ExceptionHandling;
use dom::bindings::cell::DOMRefCell;
@@ -32,8 +32,7 @@ use dom::vrpose::VRPose;
use dom::vrstageparameters::VRStageParameters;
use dom::webglrenderingcontext::WebGLRenderingContext;
use dom_struct::dom_struct;
-use ipc_channel::ipc;
-use ipc_channel::ipc::{IpcSender, IpcReceiver};
+use ipc_channel::ipc::{self, IpcSender};
use js::jsapi::JSContext;
use script_runtime::CommonScriptMsg;
use script_runtime::ScriptThreadEventCategory::WebVREvent;
@@ -43,7 +42,6 @@ use std::mem;
use std::rc::Rc;
use std::sync::mpsc;
use std::thread;
-use webrender_api::VRCompositorCommand;
use webvr_traits::{WebVRDisplayData, WebVRDisplayEvent, WebVRFrameData, WebVRLayer, WebVRMsg};
#[dom_struct]
@@ -71,7 +69,7 @@ pub struct VRDisplay {
// Compositor VRFrameData synchonization
frame_data_status: Cell<VRFrameDataStatus>,
#[ignore_heap_size_of = "channels are hard"]
- frame_data_receiver: DOMRefCell<Option<IpcReceiver<Result<Vec<u8>, ()>>>>,
+ frame_data_receiver: DOMRefCell<Option<WebGLReceiver<Result<Vec<u8>, ()>>>>,
running_display_raf: Cell<bool>,
paused: Cell<bool>,
stopped_on_pause: Cell<bool>,
@@ -386,11 +384,10 @@ impl VRDisplayMethods for VRDisplay {
return;
}
- let api_sender = self.layer_ctx.get().unwrap().ipc_renderer();
- let display_id = self.display.borrow().display_id as u64;
+ let display_id = self.display.borrow().display_id;
let layer = self.layer.borrow();
- let msg = VRCompositorCommand::SubmitFrame(display_id, layer.left_bounds, layer.right_bounds);
- api_sender.send(CanvasMsg::WebVR(msg)).unwrap();
+ let msg = WebVRCommand::SubmitFrame(display_id, layer.left_bounds, layer.right_bounds);
+ self.layer_ctx.get().unwrap().send_vr_command(msg);
}
// https://w3c.github.io/webvr/spec/1.1/#dom-vrdisplay-getlayers
@@ -489,11 +486,11 @@ impl VRDisplay {
fn init_present(&self) {
self.presenting.set(true);
- let (sync_sender, sync_receiver) = ipc::channel().unwrap();
+ let (sync_sender, sync_receiver) = webgl_channel().unwrap();
*self.frame_data_receiver.borrow_mut() = Some(sync_receiver);
- let display_id = self.display.borrow().display_id as u64;
- let api_sender = self.layer_ctx.get().unwrap().ipc_renderer();
+ let display_id = self.display.borrow().display_id;
+ let api_sender = self.layer_ctx.get().unwrap().webgl_sender();
let js_sender = self.global().script_chan();
let address = Trusted::new(&*self);
let near_init = self.depth_near.get();
@@ -511,7 +508,7 @@ impl VRDisplay {
let mut far = far_init;
// Initialize compositor
- api_sender.send(CanvasMsg::WebVR(VRCompositorCommand::Create(display_id))).unwrap();
+ api_sender.send_vr(WebVRCommand::Create(display_id)).unwrap();
loop {
// Run RAF callbacks on JavaScript thread
let msg = box NotifyDisplayRAF {
@@ -521,8 +518,8 @@ impl VRDisplay {
js_sender.send(CommonScriptMsg::RunnableMsg(WebVREvent, msg)).unwrap();
// Run Sync Poses in parallell on Render thread
- let msg = VRCompositorCommand::SyncPoses(display_id, near, far, sync_sender.clone());
- api_sender.send(CanvasMsg::WebVR(msg)).unwrap();
+ let msg = WebVRCommand::SyncPoses(display_id, near, far, sync_sender.clone());
+ api_sender.send_vr(msg).unwrap();
// Wait until both SyncPoses & RAF ends
if let Ok(depth) = raf_receiver.recv().unwrap() {
@@ -541,10 +538,9 @@ impl VRDisplay {
self.presenting.set(false);
*self.frame_data_receiver.borrow_mut() = None;
- let api_sender = self.layer_ctx.get().unwrap().ipc_renderer();
- let display_id = self.display.borrow().display_id as u64;
- let msg = VRCompositorCommand::Release(display_id);
- api_sender.send(CanvasMsg::WebVR(msg)).unwrap();
+ let api_sender = self.layer_ctx.get().unwrap().webgl_sender();
+ let display_id = self.display.borrow().display_id;
+ api_sender.send_vr(WebVRCommand::Release(display_id)).unwrap();
}
// Only called when the JSContext is destroyed while presenting.
@@ -627,7 +623,7 @@ impl Runnable for NotifyDisplayRAF {
}
-// WebVR Spect: If the number of values in the leftBounds/rightBounds arrays
+// WebVR Spec: If the number of values in the leftBounds/rightBounds arrays
// is not 0 or 4 for any of the passed layers the promise is rejected
fn parse_bounds(src: &Option<Vec<Finite<f32>>>, dst: &mut [f32; 4]) -> Result<(), &'static str> {
match *src {
diff --git a/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs b/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs
index 097742f5441..48385a3d50f 100644
--- a/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs
+++ b/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError};
use dom::bindings::codegen::Bindings::OESVertexArrayObjectBinding::{self, OESVertexArrayObjectMethods};
use dom::bindings::codegen::Bindings::OESVertexArrayObjectBinding::OESVertexArrayObjectConstants;
use dom::bindings::js::{JS, MutNullableJS, Root};
@@ -15,7 +15,6 @@ use js::jsapi::JSContext;
use js::jsval::{JSVal, NullValue};
use std::iter;
use super::{WebGLExtension, WebGLExtensions};
-use webrender_api::{self, WebGLCommand, WebGLError};
#[dom_struct]
pub struct OESVertexArrayObject {
@@ -48,8 +47,8 @@ impl OESVertexArrayObject {
impl OESVertexArrayObjectMethods for OESVertexArrayObject {
// https://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/
fn CreateVertexArrayOES(&self) -> Option<Root<WebGLVertexArrayObjectOES>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::CreateVertexArray(sender)));
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.ctx.send_command(WebGLCommand::CreateVertexArray(sender));
let result = receiver.recv().unwrap();
result.map(|vao_id| WebGLVertexArrayObjectOES::new(&self.global(), vao_id))
@@ -66,7 +65,7 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
if let Some(bound_vao) = self.bound_vao.get() {
if bound_vao.id() == vao.id() {
self.bound_vao.set(None);
- self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::BindVertexArray(None)));
+ self.ctx.send_command(WebGLCommand::BindVertexArray(None));
}
}
@@ -80,7 +79,7 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
}
// Delete the vao
- self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::DeleteVertexArray(vao.id())));
+ self.ctx.send_command(WebGLCommand::DeleteVertexArray(vao.id()));
vao.set_deleted();
}
}
@@ -114,7 +113,7 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
return;
}
- self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::BindVertexArray(Some(vao.id()))));
+ self.ctx.send_command(WebGLCommand::BindVertexArray(Some(vao.id())));
vao.set_ever_bound();
self.bound_vao.set(Some(&vao));
@@ -124,7 +123,7 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
let element_array = vao.bound_buffer_element_array();
self.ctx.set_bound_buffer_element_array(element_array.as_ref().map(|buffer| &**buffer));
} else {
- self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::BindVertexArray(None)));
+ self.ctx.send_command(WebGLCommand::BindVertexArray(None));
self.bound_vao.set(None);
self.ctx.set_bound_attrib_buffers(iter::empty());
}
diff --git a/components/script/dom/webgl_extensions/ext/webglvertexarrayobjectoes.rs b/components/script/dom/webgl_extensions/ext/webglvertexarrayobjectoes.rs
index e44b7c9bc42..2fe109cafa6 100644
--- a/components/script/dom/webgl_extensions/ext/webglvertexarrayobjectoes.rs
+++ b/components/script/dom/webgl_extensions/ext/webglvertexarrayobjectoes.rs
@@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+use canvas_traits::webgl::WebGLVertexArrayId;
use core::cell::Ref;
use core::iter::FromIterator;
use dom::bindings::cell::DOMRefCell;
@@ -15,7 +16,6 @@ use dom::webglobject::WebGLObject;
use dom_struct::dom_struct;
use std::cell::Cell;
use std::collections::HashMap;
-use webrender_api::WebGLVertexArrayId;
#[dom_struct]
pub struct WebGLVertexArrayObjectOES {
diff --git a/components/script/dom/webgl_extensions/extensions.rs b/components/script/dom/webgl_extensions/extensions.rs
index 28c32dede64..2a780b129ff 100644
--- a/components/script/dom/webgl_extensions/extensions.rs
+++ b/components/script/dom/webgl_extensions/extensions.rs
@@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+use canvas_traits::webgl::WebGLError;
use core::iter::FromIterator;
use core::nonzero::NonZero;
use dom::bindings::cell::DOMRefCell;
@@ -19,7 +20,6 @@ use std::cell::Ref;
use std::collections::{HashMap, HashSet};
use super::{ext, WebGLExtension};
use super::wrapper::{WebGLExtensionWrapper, TypedWebGLExtensionWrapper};
-use webrender_api::WebGLError;
// Data types that are implemented for texImage2D and texSubImage2D in WebGLRenderingContext
// but must trigger a InvalidValue error until the related WebGL Extensions are enabled.
diff --git a/components/script/dom/webgl_validations/tex_image_2d.rs b/components/script/dom/webgl_validations/tex_image_2d.rs
index 41b2795bc14..cd5320453c7 100644
--- a/components/script/dom/webgl_validations/tex_image_2d.rs
+++ b/components/script/dom/webgl_validations/tex_image_2d.rs
@@ -2,13 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+use canvas_traits::webgl::WebGLError::*;
use dom::bindings::js::Root;
use dom::webglrenderingcontext::WebGLRenderingContext;
use dom::webgltexture::WebGLTexture;
use std::{self, fmt};
use super::WebGLValidator;
use super::types::{TexImageTarget, TexDataType, TexFormat};
-use webrender_api::WebGLError::*;
/// The errors that the texImage* family of functions can generate.
#[derive(Debug)]
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs
index 448956a9b90..96db4466d56 100644
--- a/components/script/dom/webglbuffer.rs
+++ b/components/script/dom/webglbuffer.rs
@@ -3,7 +3,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{WebGLBufferId, WebGLCommand, WebGLError, WebGLMsgSender, WebGLResult, WebGLVertexArrayId};
+use canvas_traits::webgl::webgl_channel;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::WebGLBufferBinding;
use dom::bindings::js::Root;
@@ -11,11 +12,9 @@ use dom::bindings::reflector::reflect_dom_object;
use dom::webglobject::WebGLObject;
use dom::window::Window;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use std::collections::HashSet;
-use webrender_api;
-use webrender_api::{WebGLBufferId, WebGLCommand, WebGLError, WebGLResult, WebGLVertexArrayId};
+
#[dom_struct]
pub struct WebGLBuffer {
@@ -29,11 +28,11 @@ pub struct WebGLBuffer {
vao_references: DOMRefCell<Option<HashSet<WebGLVertexArrayId>>>,
pending_delete: Cell<bool>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
}
impl WebGLBuffer {
- fn new_inherited(renderer: IpcSender<CanvasMsg>,
+ fn new_inherited(renderer: WebGLMsgSender,
id: WebGLBufferId)
-> WebGLBuffer {
WebGLBuffer {
@@ -48,17 +47,17 @@ impl WebGLBuffer {
}
}
- pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
+ pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
-> Option<Root<WebGLBuffer>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateBuffer(sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ renderer.send(WebGLCommand::CreateBuffer(sender)).unwrap();
let result = receiver.recv().unwrap();
result.map(|buffer_id| WebGLBuffer::new(window, renderer, buffer_id))
}
pub fn new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
id: WebGLBufferId)
-> Root<WebGLBuffer> {
reflect_dom_object(box WebGLBuffer::new_inherited(renderer, id),
@@ -81,7 +80,7 @@ impl WebGLBuffer {
} else {
self.target.set(Some(target));
}
- let msg = CanvasMsg::WebGL(WebGLCommand::BindBuffer(target, Some(self.id)));
+ let msg = WebGLCommand::BindBuffer(target, Some(self.id));
self.renderer.send(msg).unwrap();
Ok(())
@@ -94,9 +93,7 @@ impl WebGLBuffer {
}
}
self.capacity.set(data.len());
- self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BufferData(target, data.to_vec(), usage)))
- .unwrap();
+ self.renderer.send(WebGLCommand::BufferData(target, data.to_vec(), usage)).unwrap();
Ok(())
}
@@ -108,7 +105,7 @@ impl WebGLBuffer {
pub fn delete(&self) {
if !self.is_deleted.get() {
self.is_deleted.set(true);
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteBuffer(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteBuffer(self.id));
}
}
@@ -144,7 +141,7 @@ impl WebGLBuffer {
if let Some(ref mut vao_refs) = *self.vao_references.borrow_mut() {
if vao_refs.take(&id).is_some() && self.pending_delete.get() {
// WebGL spec: The deleted buffers should no longer be valid when the VAOs are deleted
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteBuffer(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteBuffer(self.id));
self.is_deleted.set(true);
}
}
diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs
index bb486c80c38..7a6b1090064 100644
--- a/components/script/dom/webglframebuffer.rs
+++ b/components/script/dom/webglframebuffer.rs
@@ -3,7 +3,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{WebGLCommand, WebGLFramebufferBindingRequest, WebGLFramebufferId};
+use canvas_traits::webgl::{WebGLMsgSender, WebGLResult, WebGLError};
+use canvas_traits::webgl::webgl_channel;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::WebGLFramebufferBinding;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
@@ -14,10 +16,7 @@ use dom::webglrenderbuffer::WebGLRenderbuffer;
use dom::webgltexture::WebGLTexture;
use dom::window::Window;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
-use webrender_api;
-use webrender_api::{WebGLCommand, WebGLFramebufferBindingRequest, WebGLFramebufferId, WebGLResult, WebGLError};
#[must_root]
#[derive(JSTraceable, Clone, HeapSizeOf)]
@@ -36,7 +35,7 @@ pub struct WebGLFramebuffer {
size: Cell<Option<(i32, i32)>>,
status: Cell<u32>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
// The attachment points for textures and renderbuffers on this
// FBO.
@@ -47,7 +46,7 @@ pub struct WebGLFramebuffer {
}
impl WebGLFramebuffer {
- fn new_inherited(renderer: IpcSender<CanvasMsg>,
+ fn new_inherited(renderer: WebGLMsgSender,
id: WebGLFramebufferId)
-> WebGLFramebuffer {
WebGLFramebuffer {
@@ -65,17 +64,17 @@ impl WebGLFramebuffer {
}
}
- pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
+ pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
-> Option<Root<WebGLFramebuffer>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateFramebuffer(sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ renderer.send(WebGLCommand::CreateFramebuffer(sender)).unwrap();
let result = receiver.recv().unwrap();
result.map(|fb_id| WebGLFramebuffer::new(window, renderer, fb_id))
}
pub fn new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
id: WebGLFramebufferId)
-> Root<WebGLFramebuffer> {
reflect_dom_object(box WebGLFramebuffer::new_inherited(renderer, id),
@@ -98,13 +97,13 @@ impl WebGLFramebuffer {
self.target.set(Some(target));
let cmd = WebGLCommand::BindFramebuffer(target, WebGLFramebufferBindingRequest::Explicit(self.id));
- self.renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
+ self.renderer.send(cmd).unwrap();
}
pub fn delete(&self) {
if !self.is_deleted.get() {
self.is_deleted.set(true);
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteFramebuffer(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteFramebuffer(self.id));
}
}
@@ -205,10 +204,10 @@ impl WebGLFramebuffer {
}
};
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::FramebufferRenderbuffer(constants::FRAMEBUFFER,
- attachment,
- constants::RENDERBUFFER,
- rb_id))).unwrap();
+ self.renderer.send(WebGLCommand::FramebufferRenderbuffer(constants::FRAMEBUFFER,
+ attachment,
+ constants::RENDERBUFFER,
+ rb_id)).unwrap();
self.update_status();
Ok(())
@@ -281,11 +280,11 @@ impl WebGLFramebuffer {
}
};
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::FramebufferTexture2D(constants::FRAMEBUFFER,
- attachment,
- textarget,
- tex_id,
- level))).unwrap();
+ self.renderer.send(WebGLCommand::FramebufferTexture2D(constants::FRAMEBUFFER,
+ attachment,
+ textarget,
+ tex_id,
+ level)).unwrap();
self.update_status();
Ok(())
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs
index c76a2f3da18..6c298bb83fb 100644
--- a/components/script/dom/webglprogram.rs
+++ b/components/script/dom/webglprogram.rs
@@ -3,7 +3,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{WebGLCommand, WebGLError, WebGLMsgSender, WebGLParameter, WebGLProgramId, WebGLResult};
+use canvas_traits::webgl::webgl_channel;
use dom::bindings::codegen::Bindings::WebGLProgramBinding;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use dom::bindings::js::{MutNullableJS, Root};
@@ -15,10 +16,7 @@ use dom::webglrenderingcontext::MAX_UNIFORM_AND_ATTRIBUTE_LEN;
use dom::webglshader::WebGLShader;
use dom::window::Window;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
-use webrender_api;
-use webrender_api::{WebGLCommand, WebGLError, WebGLParameter, WebGLProgramId, WebGLResult};
#[dom_struct]
pub struct WebGLProgram {
@@ -30,11 +28,11 @@ pub struct WebGLProgram {
fragment_shader: MutNullableJS<WebGLShader>,
vertex_shader: MutNullableJS<WebGLShader>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
}
impl WebGLProgram {
- fn new_inherited(renderer: IpcSender<CanvasMsg>,
+ fn new_inherited(renderer: WebGLMsgSender,
id: WebGLProgramId)
-> WebGLProgram {
WebGLProgram {
@@ -49,17 +47,17 @@ impl WebGLProgram {
}
}
- pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
+ pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
-> Option<Root<WebGLProgram>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateProgram(sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ renderer.send(WebGLCommand::CreateProgram(sender)).unwrap();
let result = receiver.recv().unwrap();
result.map(|program_id| WebGLProgram::new(window, renderer, program_id))
}
pub fn new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
id: WebGLProgramId)
-> Root<WebGLProgram> {
reflect_dom_object(box WebGLProgram::new_inherited(renderer, id),
@@ -78,7 +76,7 @@ impl WebGLProgram {
pub fn delete(&self) {
if !self.is_deleted.get() {
self.is_deleted.set(true);
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteProgram(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteProgram(self.id));
if let Some(shader) = self.fragment_shader.get() {
shader.decrement_attached_counter();
@@ -117,7 +115,7 @@ impl WebGLProgram {
}
self.linked.set(true);
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::LinkProgram(self.id))).unwrap();
+ self.renderer.send(WebGLCommand::LinkProgram(self.id)).unwrap();
Ok(())
}
@@ -130,7 +128,7 @@ impl WebGLProgram {
return Err(WebGLError::InvalidOperation);
}
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::UseProgram(self.id))).unwrap();
+ self.renderer.send(WebGLCommand::UseProgram(self.id)).unwrap();
Ok(())
}
@@ -139,7 +137,7 @@ impl WebGLProgram {
if self.is_deleted() {
return Err(WebGLError::InvalidOperation);
}
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::ValidateProgram(self.id))).unwrap();
+ self.renderer.send(WebGLCommand::ValidateProgram(self.id)).unwrap();
Ok(())
}
@@ -166,7 +164,7 @@ impl WebGLProgram {
shader_slot.set(Some(shader));
shader.increment_attached_counter();
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap();
+ self.renderer.send(WebGLCommand::AttachShader(self.id, shader.id())).unwrap();
Ok(())
}
@@ -196,7 +194,7 @@ impl WebGLProgram {
shader_slot.set(None);
shader.decrement_attached_counter();
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap();
+ self.renderer.send(WebGLCommand::DetachShader(self.id, shader.id())).unwrap();
Ok(())
}
@@ -216,7 +214,7 @@ impl WebGLProgram {
}
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BindAttribLocation(self.id, index, String::from(name))))
+ .send(WebGLCommand::BindAttribLocation(self.id, index, String::from(name)))
.unwrap();
Ok(())
}
@@ -225,9 +223,9 @@ impl WebGLProgram {
if self.is_deleted() {
return Err(WebGLError::InvalidValue);
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetActiveUniform(self.id, index, sender)))
+ .send(WebGLCommand::GetActiveUniform(self.id, index, sender))
.unwrap();
receiver.recv().unwrap().map(|(size, ty, name)|
@@ -239,9 +237,9 @@ impl WebGLProgram {
if self.is_deleted() {
return Err(WebGLError::InvalidValue);
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetActiveAttrib(self.id, index, sender)))
+ .send(WebGLCommand::GetActiveAttrib(self.id, index, sender))
.unwrap();
receiver.recv().unwrap().map(|(size, ty, name)|
@@ -266,9 +264,9 @@ impl WebGLProgram {
return Ok(None);
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetAttribLocation(self.id, String::from(name), sender)))
+ .send(WebGLCommand::GetAttribLocation(self.id, String::from(name), sender))
.unwrap();
Ok(receiver.recv().unwrap())
}
@@ -287,9 +285,9 @@ impl WebGLProgram {
return Ok(None);
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetUniformLocation(self.id, String::from(name), sender)))
+ .send(WebGLCommand::GetUniformLocation(self.id, String::from(name), sender))
.unwrap();
Ok(receiver.recv().unwrap())
}
@@ -308,15 +306,15 @@ impl WebGLProgram {
return Ok("One or more shaders failed to compile".to_string());
}
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetProgramInfoLog(self.id, sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.renderer.send(WebGLCommand::GetProgramInfoLog(self.id, sender)).unwrap();
Ok(receiver.recv().unwrap())
}
/// glGetProgramParameter
pub fn parameter(&self, param_id: u32) -> WebGLResult<WebGLParameter> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetProgramParameter(self.id, param_id, sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.renderer.send(WebGLCommand::GetProgramParameter(self.id, param_id, sender)).unwrap();
receiver.recv().unwrap()
}
}
diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs
index 03589365c43..9a855651cc9 100644
--- a/components/script/dom/webglrenderbuffer.rs
+++ b/components/script/dom/webglrenderbuffer.rs
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult};
use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use dom::bindings::js::Root;
@@ -11,10 +11,7 @@ use dom::bindings::reflector::reflect_dom_object;
use dom::webglobject::WebGLObject;
use dom::window::Window;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
-use webrender_api;
-use webrender_api::{WebGLCommand, WebGLRenderbufferId, WebGLResult, WebGLError};
#[dom_struct]
pub struct WebGLRenderbuffer {
@@ -25,11 +22,11 @@ pub struct WebGLRenderbuffer {
size: Cell<Option<(i32, i32)>>,
internal_format: Cell<Option<u32>>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
}
impl WebGLRenderbuffer {
- fn new_inherited(renderer: IpcSender<CanvasMsg>,
+ fn new_inherited(renderer: WebGLMsgSender,
id: WebGLRenderbufferId)
-> WebGLRenderbuffer {
WebGLRenderbuffer {
@@ -43,17 +40,17 @@ impl WebGLRenderbuffer {
}
}
- pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
+ pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
-> Option<Root<WebGLRenderbuffer>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateRenderbuffer(sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap();
let result = receiver.recv().unwrap();
result.map(|renderbuffer_id| WebGLRenderbuffer::new(window, renderer, renderbuffer_id))
}
pub fn new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
id: WebGLRenderbufferId)
-> Root<WebGLRenderbuffer> {
reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id),
@@ -74,14 +71,14 @@ impl WebGLRenderbuffer {
pub fn bind(&self, target: u32) {
self.ever_bound.set(true);
- let msg = CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, Some(self.id)));
+ let msg = WebGLCommand::BindRenderbuffer(target, Some(self.id));
self.renderer.send(msg).unwrap();
}
pub fn delete(&self) {
if !self.is_deleted.get() {
self.is_deleted.set(true);
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteRenderbuffer(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteRenderbuffer(self.id));
}
}
@@ -110,8 +107,7 @@ impl WebGLRenderbuffer {
// FIXME: Invalidate completeness after the call
- let msg = CanvasMsg::WebGL(WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER,
- internal_format, width, height));
+ let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height);
self.renderer.send(msg).unwrap();
self.size.set(Some((width, height)));
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 20fe133e02c..c45362b4fe2 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -3,7 +3,11 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
-use canvas_traits::{CanvasCommonMsg, CanvasMsg, byte_swap, multiply_u8_pixel};
+use canvas_traits::canvas::{byte_swap, multiply_u8_pixel};
+use canvas_traits::webgl::{WebGLContextShareMode, WebGLCommand, WebGLError};
+use canvas_traits::webgl::{WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender, WebGLParameter, WebVRCommand};
+use canvas_traits::webgl::WebGLError::*;
+use canvas_traits::webgl::webgl_channel;
use core::cell::Ref;
use core::iter::FromIterator;
use core::nonzero::NonZero;
@@ -19,7 +23,6 @@ use dom::bindings::js::{JS, LayoutJS, MutNullableJS, Root};
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
use dom::bindings::str::DOMString;
use dom::event::{Event, EventBubbles, EventCancelable};
-use dom::globalscope::GlobalScope;
use dom::htmlcanvaselement::HTMLCanvasElement;
use dom::htmlcanvaselement::utils as canvas_utils;
use dom::node::{Node, NodeDamage, window_from_node};
@@ -42,7 +45,6 @@ use dom::window::Window;
use dom_struct::dom_struct;
use euclid::Size2D;
use half::f16;
-use ipc_channel::ipc::{self, IpcSender};
use js::conversions::ConversionBehavior;
use js::jsapi::{JSContext, JSObject, Type, Rooted};
use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UndefinedValue};
@@ -50,13 +52,11 @@ use js::typedarray::{TypedArray, TypedArrayElement, Float32, Int32};
use net_traits::image::base::PixelFormat;
use net_traits::image_cache::ImageResponse;
use offscreen_gl_context::{GLContextAttributes, GLLimits};
-use script_traits::ScriptMsg;
+use script_layout_interface::HTMLCanvasDataSource;
use servo_config::prefs::PREFS;
use std::cell::Cell;
use std::collections::HashMap;
use webrender_api;
-use webrender_api::{WebGLCommand, WebGLError, WebGLFramebufferBindingRequest, WebGLParameter};
-use webrender_api::WebGLError::*;
type ImagePixelResult = Result<(Vec<u8>, Size2D<i32>, bool), ()>;
pub const MAX_UNIFORM_AND_ATTRIBUTE_LEN: usize = 256;
@@ -92,9 +92,7 @@ macro_rules! handle_object_deletion {
}
if let Some(command) = $unbind_command {
- $self_.ipc_renderer
- .send(CanvasMsg::WebGL(command))
- .unwrap();
+ $self_.send_command(command);
}
}
};
@@ -135,12 +133,15 @@ bitflags! {
#[dom_struct]
pub struct WebGLRenderingContext {
reflector_: Reflector,
- #[ignore_heap_size_of = "Defined in ipc-channel"]
- ipc_renderer: IpcSender<CanvasMsg>,
+ #[ignore_heap_size_of = "Channels are hard"]
+ webgl_sender: WebGLMsgSender,
+ #[ignore_heap_size_of = "Defined in webrender"]
+ webrender_image: Cell<Option<webrender_api::ImageKey>>,
+ share_mode: WebGLContextShareMode,
#[ignore_heap_size_of = "Defined in offscreen_gl_context"]
limits: GLLimits,
canvas: JS<HTMLCanvasElement>,
- #[ignore_heap_size_of = "Defined in webrender_api"]
+ #[ignore_heap_size_of = "Defined in canvas_traits"]
last_error: Cell<Option<WebGLError>>,
texture_unpacking_settings: Cell<TextureUnpacking>,
texture_unpacking_alignment: Cell<u32>,
@@ -158,7 +159,7 @@ pub struct WebGLRenderingContext {
current_scissor: Cell<(i32, i32, i32, i32)>,
#[ignore_heap_size_of = "Because it's small"]
current_clear_color: Cell<(f32, f32, f32, f32)>,
- extension_manager: WebGLExtensions
+ extension_manager: WebGLExtensions,
}
impl WebGLRenderingContext {
@@ -171,17 +172,19 @@ impl WebGLRenderingContext {
return Err("WebGL context creation error forced by pref `webgl.testing.context_creation_error`".into());
}
- let (sender, receiver) = ipc::channel().unwrap();
- let script_to_constellation_chan = window.upcast::<GlobalScope>().script_to_constellation_chan();
- script_to_constellation_chan.send(ScriptMsg::CreateWebGLPaintThread(size, attrs, sender))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ let webgl_chan = window.webgl_chan();
+ webgl_chan.send(WebGLMsg::CreateContext(size, attrs, sender))
+ .unwrap();
let result = receiver.recv().unwrap();
- result.map(|(ipc_renderer, context_limits)| {
+ result.map(|ctx_data| {
WebGLRenderingContext {
reflector_: Reflector::new(),
- ipc_renderer: ipc_renderer,
- limits: context_limits,
+ webgl_sender: ctx_data.sender,
+ webrender_image: Cell::new(None),
+ share_mode: ctx_data.share_mode,
+ limits: ctx_data.limits,
canvas: JS::from_ref(canvas),
last_error: Cell::new(None),
texture_unpacking_settings: Cell::new(CONVERT_COLORSPACE),
@@ -253,31 +256,43 @@ impl WebGLRenderingContext {
}
pub fn recreate(&self, size: Size2D<i32>) {
- self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.webgl_sender.send_resize(size, sender).unwrap();
+
+ if let Err(msg) = receiver.recv().unwrap() {
+ error!("Error resizing WebGLContext: {}", msg);
+ return;
+ };
+
+ // Reset webrender_image because resize creates a new image_key.
+ // The new image key is set in the next handle_layout() method.
+ self.webrender_image.set(None);
// ClearColor needs to be restored because after a resize the GLContext is recreated
// and the framebuffer is cleared using the default black transparent color.
let color = self.current_clear_color.get();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::ClearColor(color.0, color.1, color.2, color.3)))
- .unwrap();
+ self.send_command(WebGLCommand::ClearColor(color.0, color.1, color.2, color.3));
// WebGL Spec: Scissor rect must not change if the canvas is resized.
// See: webgl/conformance-1.0.3/conformance/rendering/gl-scissor-canvas-dimensions.html
// NativeContext handling library changes the scissor after a resize, so we need to reset the
// default scissor when the canvas was created or the last scissor that the user set.
let rect = self.current_scissor.get();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Scissor(rect.0, rect.1, rect.2, rect.3)))
- .unwrap()
+ self.send_command(WebGLCommand::Scissor(rect.0, rect.1, rect.2, rect.3));
+ }
+
+ pub fn webgl_sender(&self) -> WebGLMsgSender {
+ self.webgl_sender.clone()
}
- pub fn ipc_renderer(&self) -> IpcSender<CanvasMsg> {
- self.ipc_renderer.clone()
+ #[inline]
+ pub fn send_command(&self, command: WebGLCommand) {
+ self.webgl_sender.send(command).unwrap();
}
- pub fn send_renderer_message(&self, msg: CanvasMsg) {
- self.ipc_renderer.send(msg).unwrap();
+ #[inline]
+ pub fn send_vr_command(&self, command: WebVRCommand) {
+ self.webgl_sender.send_vr(command).unwrap();
}
pub fn get_extension_manager<'a>(&'a self) -> &'a WebGLExtensions {
@@ -370,9 +385,7 @@ impl WebGLRenderingContext {
self.current_vertex_attrib_0.set((x, y, z, w))
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::VertexAttrib(indx, x, y, z, w)))
- .unwrap();
+ self.send_command(WebGLCommand::VertexAttrib(indx, x, y, z, w));
}
fn get_current_framebuffer_size(&self) -> Option<(i32, i32)> {
@@ -705,8 +718,8 @@ impl WebGLRenderingContext {
// WebGLContext (probably via GetPixels()).
ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement::HTMLCanvasElement(canvas) => {
if let Some((mut data, size)) = canvas.fetch_all_data() {
- byte_swap(&mut data);
// Pixels got from Canvas have already alpha premultiplied
+ byte_swap(&mut data);
(data, size, true)
} else {
return Err(());
@@ -945,9 +958,7 @@ impl WebGLRenderingContext {
// GL_UNPACK_ALIGNMENT, while for textures from images or
// canvas (produced by rgba8_image_to_tex_image_data()), it
// will be 1.
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32)))
- .unwrap();
+ self.send_command(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32));
let format = internal_format.as_gl_constant();
let data_type = data_type.as_gl_constant();
@@ -961,9 +972,7 @@ impl WebGLRenderingContext {
data_type,
pixels);
- self.ipc_renderer
- .send(CanvasMsg::WebGL(msg))
- .unwrap();
+ self.send_command(msg);
if let Some(fb) = self.bound_framebuffer.get() {
fb.invalidate_texture(&*texture);
@@ -1005,9 +1014,7 @@ impl WebGLRenderingContext {
// GL_UNPACK_ALIGNMENT, while for textures from images or
// canvas (produced by rgba8_image_to_tex_image_data()), it
// will be 1.
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32)))
- .unwrap();
+ 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(),
@@ -1016,9 +1023,7 @@ impl WebGLRenderingContext {
format.as_gl_constant(),
data_type.as_gl_constant(), pixels);
- self.ipc_renderer
- .send(CanvasMsg::WebGL(msg))
- .unwrap()
+ self.send_command(msg);
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14
@@ -1035,17 +1040,38 @@ impl WebGLRenderingContext {
}
fn get_gl_extensions(&self) -> String {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetExtensions(sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetExtensions(sender));
receiver.recv().unwrap()
}
+
+ fn layout_handle(&self) -> webrender_api::ImageKey {
+ match self.share_mode {
+ WebGLContextShareMode::SharedTexture => {
+ // WR using ExternalTexture requires a single update message.
+ self.webrender_image.get().unwrap_or_else(|| {
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.webgl_sender.send_update_wr_image(sender).unwrap();
+ let image_key = receiver.recv().unwrap();
+ self.webrender_image.set(Some(image_key));
+
+ image_key
+ })
+ },
+ WebGLContextShareMode::Readback => {
+ // WR using Readback requires to update WR image every frame
+ // in order to send the new raw pixels.
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.webgl_sender.send_update_wr_image(sender).unwrap();
+ receiver.recv().unwrap()
+ }
+ }
+ }
}
impl Drop for WebGLRenderingContext {
fn drop(&mut self) {
- self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
+ self.webgl_sender.send_remove().unwrap();
}
}
@@ -1101,45 +1127,36 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
fn Flush(&self) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Flush))
- .unwrap();
+ self.send_command(WebGLCommand::Flush);
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
fn Finish(&self) {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Finish(sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::Finish(sender));
receiver.recv().unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
fn DrawingBufferWidth(&self) -> i32 {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DrawingBufferWidth(sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::DrawingBufferWidth(sender));
receiver.recv().unwrap()
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
fn DrawingBufferHeight(&self) -> i32 {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DrawingBufferHeight(sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::DrawingBufferHeight(sender));
receiver.recv().unwrap()
}
#[allow(unsafe_code)]
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
unsafe fn GetBufferParameter(&self, _cx: *mut JSContext, target: u32, parameter: u32) -> JSVal {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetBufferParameter(target, parameter, sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetBufferParameter(target, parameter, sender));
+
match handle_potential_webgl_error!(self, receiver.recv().unwrap(), WebGLParameter::Invalid) {
WebGLParameter::Int(val) => Int32Value(val),
WebGLParameter::Bool(_) => panic!("Buffer parameter should not be bool"),
@@ -1205,10 +1222,9 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
}
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetParameter(parameter, sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetParameter(parameter, sender));
+
match handle_potential_webgl_error!(self, receiver.recv().unwrap(), WebGLParameter::Invalid) {
WebGLParameter::Int(val) => Int32Value(val),
WebGLParameter::Bool(val) => BooleanValue(val),
@@ -1243,13 +1259,13 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.2
fn GetContextAttributes(&self) -> Option<WebGLContextAttributes> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
// If the send does not succeed, assume context lost
- if let Err(_) = self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::GetContextAttributes(sender))) {
+ if self.webgl_sender.send(WebGLCommand::GetContextAttributes(sender)).is_err() {
return None;
}
+
let attrs = receiver.recv().unwrap();
Some(WebGLContextAttributes {
@@ -1285,12 +1301,12 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ActiveTexture(&self, texture: u32) {
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::ActiveTexture(texture))).unwrap();
+ self.send_command(WebGLCommand::ActiveTexture(texture));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn BlendColor(&self, r: f32, g: f32, b: f32, a: f32) {
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::BlendColor(r, g, b, a))).unwrap();
+ self.send_command(WebGLCommand::BlendColor(r, g, b, a));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
@@ -1299,7 +1315,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidEnum);
}
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::BlendEquation(mode))).unwrap();
+ self.send_command(WebGLCommand::BlendEquation(mode));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
@@ -1308,9 +1324,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidEnum);
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BlendEquationSeparate(mode_rgb, mode_alpha)))
- .unwrap();
+ self.send_command(WebGLCommand::BlendEquationSeparate(mode_rgb, mode_alpha));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
@@ -1327,9 +1341,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidOperation);
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BlendFunc(src_factor, dest_factor)))
- .unwrap();
+ self.send_command(WebGLCommand::BlendFunc(src_factor, dest_factor));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
@@ -1346,8 +1358,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidOperation);
}
- self.ipc_renderer.send(
- CanvasMsg::WebGL(WebGLCommand::BlendFuncSeparate(src_rgb, dest_rgb, src_alpha, dest_alpha))).unwrap();
+ self.send_command(WebGLCommand::BlendFuncSeparate(src_rgb, dest_rgb, src_alpha, dest_alpha));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
@@ -1393,9 +1404,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} else {
slot.set(None);
// Unbind the current buffer
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BindBuffer(target, None)))
- .unwrap()
+ self.send_command(WebGLCommand::BindBuffer(target, None));
}
}
@@ -1420,7 +1429,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} else {
// Bind the default framebuffer
let cmd = WebGLCommand::BindFramebuffer(target, WebGLFramebufferBindingRequest::Default);
- self.ipc_renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
+ self.send_command(cmd);
self.bound_framebuffer.set(framebuffer);
}
}
@@ -1442,9 +1451,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
_ => {
self.bound_renderbuffer.set(None);
// Unbind the currently bound renderbuffer
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None)))
- .unwrap()
+ self.send_command(WebGLCommand::BindRenderbuffer(target, None));
}
}
}
@@ -1465,9 +1472,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
} else {
slot.set(None);
// Unbind the currently bound texture
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BindTexture(target, None)))
- .unwrap()
+ self.send_command(WebGLCommand::BindTexture(target, None));
}
}
@@ -1585,9 +1590,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if (offset as usize) + data_vec.len() > bound_buffer.capacity() {
return Ok(self.webgl_error(InvalidValue));
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BufferSubData(target, offset as isize, data_vec)))
- .unwrap();
+ self.send_command(WebGLCommand::BufferSubData(target, offset as isize, data_vec));
Ok(())
}
@@ -1670,7 +1673,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
width as i32, height as i32,
border as i32);
- self.ipc_renderer.send(CanvasMsg::WebGL(msg)).unwrap()
+ self.send_command(msg);
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
@@ -1714,7 +1717,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
x, y,
width as i32, height as i32);
- self.ipc_renderer.send(CanvasMsg::WebGL(msg)).unwrap();
+ self.send_command(msg);
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11
@@ -1723,46 +1726,36 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return;
}
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::Clear(mask))).unwrap();
+ self.send_command(WebGLCommand::Clear(mask));
self.mark_as_dirty();
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ClearColor(&self, red: f32, green: f32, blue: f32, alpha: f32) {
self.current_clear_color.set((red, green, blue, alpha));
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::ClearColor(red, green, blue, alpha)))
- .unwrap()
+ self.send_command(WebGLCommand::ClearColor(red, green, blue, alpha));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ClearDepth(&self, depth: f32) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::ClearDepth(depth as f64)))
- .unwrap()
+ self.send_command(WebGLCommand::ClearDepth(depth as f64))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ClearStencil(&self, stencil: i32) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::ClearStencil(stencil)))
- .unwrap()
+ self.send_command(WebGLCommand::ClearStencil(stencil))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn ColorMask(&self, r: bool, g: bool, b: bool, a: bool) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::ColorMask(r, g, b, a)))
- .unwrap()
+ self.send_command(WebGLCommand::ColorMask(r, g, b, a))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn CullFace(&self, mode: u32) {
match mode {
constants::FRONT | constants::BACK | constants::FRONT_AND_BACK =>
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::CullFace(mode)))
- .unwrap(),
+ self.send_command(WebGLCommand::CullFace(mode)),
_ => self.webgl_error(InvalidEnum),
}
}
@@ -1771,9 +1764,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
fn FrontFace(&self, mode: u32) {
match mode {
constants::CW | constants::CCW =>
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::FrontFace(mode)))
- .unwrap(),
+ self.send_command(WebGLCommand::FrontFace(mode)),
_ => self.webgl_error(InvalidEnum),
}
}
@@ -1784,18 +1775,14 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
constants::EQUAL | constants::LEQUAL |
constants::GREATER | constants::NOTEQUAL |
constants::GEQUAL | constants::ALWAYS =>
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DepthFunc(func)))
- .unwrap(),
+ self.send_command(WebGLCommand::DepthFunc(func)),
_ => self.webgl_error(InvalidEnum),
}
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn DepthMask(&self, flag: bool) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DepthMask(flag)))
- .unwrap()
+ self.send_command(WebGLCommand::DepthMask(flag))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
@@ -1809,26 +1796,20 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidOperation);
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DepthRange(near as f64, far as f64)))
- .unwrap()
+ self.send_command(WebGLCommand::DepthRange(near as f64, far as f64))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn Enable(&self, cap: u32) {
if self.validate_feature_enum(cap) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Enable(cap)))
- .unwrap();
+ self.send_command(WebGLCommand::Enable(cap));
}
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn Disable(&self, cap: u32) {
if self.validate_feature_enum(cap) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Disable(cap)))
- .unwrap()
+ self.send_command(WebGLCommand::Disable(cap));
}
}
@@ -1843,27 +1824,27 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// generated objects, either here or in the webgl thread
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
fn CreateBuffer(&self) -> Option<Root<WebGLBuffer>> {
- WebGLBuffer::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
+ WebGLBuffer::maybe_new(self.global().as_window(), self.webgl_sender.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6
fn CreateFramebuffer(&self) -> Option<Root<WebGLFramebuffer>> {
- WebGLFramebuffer::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
+ WebGLFramebuffer::maybe_new(self.global().as_window(), self.webgl_sender.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7
fn CreateRenderbuffer(&self) -> Option<Root<WebGLRenderbuffer>> {
- WebGLRenderbuffer::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
+ WebGLRenderbuffer::maybe_new(self.global().as_window(), self.webgl_sender.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
fn CreateTexture(&self) -> Option<Root<WebGLTexture>> {
- WebGLTexture::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
+ WebGLTexture::maybe_new(self.global().as_window(), self.webgl_sender.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn CreateProgram(&self) -> Option<Root<WebGLProgram>> {
- WebGLProgram::maybe_new(self.global().as_window(), self.ipc_renderer.clone())
+ WebGLProgram::maybe_new(self.global().as_window(), self.webgl_sender.clone())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
@@ -1875,7 +1856,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return None;
}
}
- WebGLShader::maybe_new(self.global().as_window(), self.ipc_renderer.clone(), shader_type)
+ WebGLShader::maybe_new(self.global().as_window(), self.webgl_sender.clone(), shader_type)
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
@@ -1999,9 +1980,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return;
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DrawArrays(mode, first, count)))
- .unwrap();
+ self.send_command(WebGLCommand::DrawArrays(mode, first, count));
self.mark_as_dirty();
},
_ => self.webgl_error(InvalidEnum),
@@ -2065,9 +2044,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
constants::LINE_LOOP | constants::LINES |
constants::TRIANGLE_STRIP | constants::TRIANGLE_FAN |
constants::TRIANGLES => {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DrawElements(mode, count, type_, offset)))
- .unwrap();
+ self.send_command(WebGLCommand::DrawElements(mode, count, type_, offset));
self.mark_as_dirty();
},
_ => self.webgl_error(InvalidEnum),
@@ -2080,9 +2057,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidValue);
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::EnableVertexAttribArray(attrib_id)))
- .unwrap()
+ self.send_command(WebGLCommand::EnableVertexAttribArray(attrib_id));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
@@ -2091,9 +2066,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidValue);
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::DisableVertexAttribArray(attrib_id)))
- .unwrap()
+ self.send_command(WebGLCommand::DisableVertexAttribArray(attrib_id));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
@@ -2223,11 +2196,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
shader_type: u32,
precision_type: u32)
-> Option<Root<WebGLShaderPrecisionFormat>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderPrecisionFormat(shader_type,
- precision_type,
- sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetShaderPrecisionFormat(shader_type,
+ precision_type,
+ sender));
+
match receiver.recv().unwrap() {
Ok((range_min, range_max, precision)) => {
Some(WebGLShaderPrecisionFormat::new(self.global().as_window(), range_min, range_max, precision))
@@ -2268,8 +2241,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return jsval.get();
}
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::GetVertexAttrib(index, pname, sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetVertexAttrib(index, pname, sender));
match handle_potential_webgl_error!(self, receiver.recv().unwrap(), WebGLParameter::Invalid) {
WebGLParameter::Int(val) => Int32Value(val),
@@ -2287,8 +2260,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
fn GetVertexAttribOffset(&self, index: u32, pname: u32) -> i64 {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::GetVertexAttribOffset(index, pname, sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::GetVertexAttribOffset(index, pname, sender));
handle_potential_webgl_error!(self, receiver.recv().unwrap(), 0) as i64
}
@@ -2307,9 +2280,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
_ => return self.webgl_error(InvalidEnum),
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Hint(target, mode)))
- .unwrap()
+ self.send_command(WebGLCommand::Hint(target, mode));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
@@ -2321,10 +2292,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn IsEnabled(&self, cap: u32) -> bool {
if self.validate_feature_enum(cap) {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::IsEnabled(cap, sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::IsEnabled(cap, sender));
return receiver.recv().unwrap();
}
@@ -2362,9 +2331,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidValue);
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::LineWidth(width)))
- .unwrap()
+ self.send_command(WebGLCommand::LineWidth(width))
}
// NOTE: Usage of this function could affect rendering while we keep using
@@ -2420,9 +2387,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn PolygonOffset(&self, factor: f32, units: f32) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::PolygonOffset(factor, units)))
- .unwrap()
+ self.send_command(WebGLCommand::PolygonOffset(factor, units))
}
#[allow(unsafe_code)]
@@ -2522,10 +2487,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
_ => return Ok(self.webgl_error(InvalidOperation)),
};
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::ReadPixels(x, y, width, height, format, pixel_type, sender)))
- .unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.send_command(WebGLCommand::ReadPixels(x, y, width, height, format, pixel_type, sender));
let result = receiver.recv().unwrap();
@@ -2541,7 +2504,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn SampleCoverage(&self, value: f32, invert: bool) {
- self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::SampleCoverage(value, invert))).unwrap();
+ self.send_command(WebGLCommand::SampleCoverage(value, invert));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4
@@ -2551,9 +2514,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
}
self.current_scissor.set((x, y, width, height));
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Scissor(x, y, width, height)))
- .unwrap()
+ self.send_command(WebGLCommand::Scissor(x, y, width, height));
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
@@ -2561,9 +2522,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
match func {
constants::NEVER | constants::LESS | constants::EQUAL | constants::LEQUAL |
constants::GREATER | constants::NOTEQUAL | constants::GEQUAL | constants::ALWAYS =>
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::StencilFunc(func, ref_, mask)))
- .unwrap(),
+ self.send_command(WebGLCommand::StencilFunc(func, ref_, mask)),
_ => self.webgl_error(InvalidEnum),
}
}
@@ -2578,27 +2537,21 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
match func {
constants::NEVER | constants::LESS | constants::EQUAL | constants::LEQUAL |
constants::GREATER | constants::NOTEQUAL | constants::GEQUAL | constants::ALWAYS =>
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::StencilFuncSeparate(face, func, ref_, mask)))
- .unwrap(),
+ self.send_command(WebGLCommand::StencilFuncSeparate(face, func, ref_, mask)),
_ => self.webgl_error(InvalidEnum),
}
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn StencilMask(&self, mask: u32) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::StencilMask(mask)))
- .unwrap()
+ self.send_command(WebGLCommand::StencilMask(mask))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn StencilMaskSeparate(&self, face: u32, mask: u32) {
match face {
constants::FRONT | constants::BACK | constants::FRONT_AND_BACK =>
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::StencilMaskSeparate(face, mask)))
- .unwrap(),
+ self.send_command(WebGLCommand::StencilMaskSeparate(face, mask)),
_ => return self.webgl_error(InvalidEnum),
}
}
@@ -2607,9 +2560,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
fn StencilOp(&self, fail: u32, zfail: u32, zpass: u32) {
if self.validate_stencil_actions(fail) && self.validate_stencil_actions(zfail) &&
self.validate_stencil_actions(zpass) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::StencilOp(fail, zfail, zpass)))
- .unwrap()
+ self.send_command(WebGLCommand::StencilOp(fail, zfail, zpass));
} else {
self.webgl_error(InvalidEnum)
}
@@ -2624,9 +2575,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_stencil_actions(fail) && self.validate_stencil_actions(zfail) &&
self.validate_stencil_actions(zpass) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::StencilOpSeparate(face, fail, zfail, zpass)))
- .unwrap()
+ self.send_command(WebGLCommand::StencilOpSeparate(face, fail, zfail, zpass))
} else {
self.webgl_error(InvalidEnum)
}
@@ -2658,9 +2607,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
uniform: Option<&WebGLUniformLocation>,
val: f32) {
if self.validate_uniform_parameters(uniform, UniformSetterType::Float, &[val]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform1f(uniform.unwrap().id(), val)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform1f(uniform.unwrap().id(), val))
}
}
@@ -2669,9 +2616,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
uniform: Option<&WebGLUniformLocation>,
val: i32) {
if self.validate_uniform_parameters(uniform, UniformSetterType::Int, &[val]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform1i(uniform.unwrap().id(), val)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform1i(uniform.unwrap().id(), val))
}
}
@@ -2685,9 +2630,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
let data_vec = typed_array_or_sequence_to_vec::<Int32>(cx, data, ConversionBehavior::Default)?;
if self.validate_uniform_parameters(uniform, UniformSetterType::Int, &data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform1iv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform1iv(uniform.unwrap().id(), data_vec))
}
Ok(())
@@ -2703,9 +2646,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
let data_vec = typed_array_or_sequence_to_vec::<Float32>(cx, data, ())?;
if self.validate_uniform_parameters(uniform, UniformSetterType::Float, &data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform1fv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform1fv(uniform.unwrap().id(), data_vec));
}
Ok(())
@@ -2716,9 +2657,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
uniform: Option<&WebGLUniformLocation>,
x: f32, y: f32) {
if self.validate_uniform_parameters(uniform, UniformSetterType::FloatVec2, &[x, y]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform2f(uniform.unwrap().id(), x, y)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform2f(uniform.unwrap().id(), x, y));
}
}
@@ -2734,9 +2673,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatVec2,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform2fv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform2fv(uniform.unwrap().id(), data_vec));
}
Ok(())
@@ -2749,9 +2686,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::IntVec2,
&[x, y]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform2i(uniform.unwrap().id(), x, y)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform2i(uniform.unwrap().id(), x, y));
}
}
@@ -2767,9 +2702,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::IntVec2,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform2iv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform2iv(uniform.unwrap().id(), data_vec));
}
Ok(())
@@ -2782,9 +2715,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatVec3,
&[x, y, z]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform3f(uniform.unwrap().id(), x, y, z)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform3f(uniform.unwrap().id(), x, y, z));
}
}
@@ -2800,9 +2731,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatVec3,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform3fv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform3fv(uniform.unwrap().id(), data_vec))
}
Ok(())
@@ -2815,9 +2744,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::IntVec3,
&[x, y, z]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform3i(uniform.unwrap().id(), x, y, z)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform3i(uniform.unwrap().id(), x, y, z))
}
}
@@ -2833,9 +2760,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::IntVec3,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform3iv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform3iv(uniform.unwrap().id(), data_vec))
}
Ok(())
@@ -2848,9 +2773,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::IntVec4,
&[x, y, z, w]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform4i(uniform.unwrap().id(), x, y, z, w)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform4i(uniform.unwrap().id(), x, y, z, w))
}
}
@@ -2867,9 +2790,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::IntVec4,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform4iv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform4iv(uniform.unwrap().id(), data_vec))
}
Ok(())
@@ -2882,9 +2803,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatVec4,
&[x, y, z, w]) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform4f(uniform.unwrap().id(), x, y, z, w)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform4f(uniform.unwrap().id(), x, y, z, w))
}
}
@@ -2900,9 +2819,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatVec4,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Uniform4fv(uniform.unwrap().id(), data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::Uniform4fv(uniform.unwrap().id(), data_vec))
}
Ok(())
@@ -2920,9 +2837,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatMat2,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::UniformMatrix2fv(uniform.unwrap().id(), transpose, data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::UniformMatrix2fv(uniform.unwrap().id(), transpose, data_vec));
}
Ok(())
@@ -2940,9 +2855,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatMat3,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::UniformMatrix3fv(uniform.unwrap().id(), transpose, data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::UniformMatrix3fv(uniform.unwrap().id(), transpose, data_vec));
}
Ok(())
@@ -2960,9 +2873,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if self.validate_uniform_parameters(uniform,
UniformSetterType::FloatMat4,
&data_vec) {
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::UniformMatrix4fv(uniform.unwrap().id(), transpose, data_vec)))
- .unwrap()
+ self.send_command(WebGLCommand::UniformMatrix4fv(uniform.unwrap().id(), transpose, data_vec));
}
Ok(())
@@ -3098,9 +3009,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
self.bound_attrib_buffers.borrow_mut().insert(attrib_id, JS::from_ref(&*buffer_array));
- let msg = CanvasMsg::WebGL(
- WebGLCommand::VertexAttribPointer(attrib_id, size, data_type, normalized, stride, offset as u32));
- self.ipc_renderer.send(msg).unwrap()
+ let msg = WebGLCommand::VertexAttribPointer(attrib_id, size, data_type, normalized, stride, offset as u32);
+ self.send_command(msg);
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4
@@ -3109,9 +3019,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidValue)
}
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::Viewport(x, y, width, height)))
- .unwrap()
+ self.send_command(WebGLCommand::Viewport(x, y, width, height))
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
@@ -3456,13 +3364,13 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
pub trait LayoutCanvasWebGLRenderingContextHelpers {
#[allow(unsafe_code)]
- unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg>;
+ unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource;
}
impl LayoutCanvasWebGLRenderingContextHelpers for LayoutJS<WebGLRenderingContext> {
#[allow(unsafe_code)]
- unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg> {
- (*self.unsafe_get()).ipc_renderer.clone()
+ unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource {
+ HTMLCanvasDataSource::WebGL((*self.unsafe_get()).layout_handle())
}
}
diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs
index edd9cf7bdb3..cf6fc55072d 100644
--- a/components/script/dom/webglshader.rs
+++ b/components/script/dom/webglshader.rs
@@ -4,7 +4,7 @@
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
use angle::hl::{BuiltInResources, Output, ShaderValidator};
-use canvas_traits::CanvasMsg;
+use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId};
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::WebGLShaderBinding;
use dom::bindings::js::Root;
@@ -13,11 +13,8 @@ use dom::bindings::str::DOMString;
use dom::webglobject::WebGLObject;
use dom::window::Window;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use std::sync::{ONCE_INIT, Once};
-use webrender_api;
-use webrender_api::{WebGLCommand, WebGLParameter, WebGLResult, WebGLShaderId};
#[derive(Clone, Copy, PartialEq, Debug, JSTraceable, HeapSizeOf)]
pub enum ShaderCompilationStatus {
@@ -37,7 +34,7 @@ pub struct WebGLShader {
attached_counter: Cell<u32>,
compilation_status: Cell<ShaderCompilationStatus>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
}
#[cfg(not(target_os = "android"))]
@@ -49,7 +46,7 @@ const SHADER_OUTPUT_FORMAT: Output = Output::Essl;
static GLSLANG_INITIALIZATION: Once = ONCE_INIT;
impl WebGLShader {
- fn new_inherited(renderer: IpcSender<CanvasMsg>,
+ fn new_inherited(renderer: WebGLMsgSender,
id: WebGLShaderId,
shader_type: u32)
-> WebGLShader {
@@ -68,18 +65,18 @@ impl WebGLShader {
}
pub fn maybe_new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
shader_type: u32)
-> Option<Root<WebGLShader>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateShader(shader_type, sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap();
let result = receiver.recv().unwrap();
result.map(|shader_id| WebGLShader::new(window, renderer, shader_id, shader_type))
}
pub fn new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
id: WebGLShaderId,
shader_type: u32)
-> Root<WebGLShader> {
@@ -118,7 +115,7 @@ impl WebGLShader {
// will succeed.
// It could be interesting to retrieve the info log from the paint thread though
let msg = WebGLCommand::CompileShader(self.id, translated_source);
- self.renderer.send(CanvasMsg::WebGL(msg)).unwrap();
+ self.renderer.send(msg).unwrap();
self.compilation_status.set(ShaderCompilationStatus::Succeeded);
},
Err(error) => {
@@ -142,7 +139,7 @@ impl WebGLShader {
pub fn delete(&self) {
if !self.is_deleted.get() {
self.is_deleted.set(true);
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteShader(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteShader(self.id));
}
}
@@ -170,8 +167,8 @@ impl WebGLShader {
/// glGetParameter
pub fn parameter(&self, param_id: u32) -> WebGLResult<WebGLParameter> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderParameter(self.id, param_id, sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap();
receiver.recv().unwrap()
}
diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs
index 88d5faaf5c8..048af5d10e0 100644
--- a/components/script/dom/webgltexture.rs
+++ b/components/script/dom/webgltexture.rs
@@ -3,7 +3,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
-use canvas_traits::CanvasMsg;
+
+use canvas_traits::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLResult, WebGLTextureId};
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use dom::bindings::codegen::Bindings::WebGLTextureBinding;
@@ -13,11 +14,8 @@ use dom::webgl_validations::types::{TexImageTarget, TexFormat, TexDataType};
use dom::webglobject::WebGLObject;
use dom::window::Window;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
use std::cell::Cell;
use std::cmp;
-use webrender_api;
-use webrender_api::{WebGLCommand, WebGLError, WebGLResult, WebGLTextureId};
pub enum TexParameterValue {
Float(f32),
@@ -46,11 +44,11 @@ pub struct WebGLTexture {
min_filter: Cell<Option<u32>>,
mag_filter: Cell<Option<u32>>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
}
impl WebGLTexture {
- fn new_inherited(renderer: IpcSender<CanvasMsg>,
+ fn new_inherited(renderer: WebGLMsgSender,
id: WebGLTextureId)
-> WebGLTexture {
WebGLTexture {
@@ -67,17 +65,17 @@ impl WebGLTexture {
}
}
- pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
+ pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
-> Option<Root<WebGLTexture>> {
- let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
- renderer.send(CanvasMsg::WebGL(WebGLCommand::CreateTexture(sender))).unwrap();
+ let (sender, receiver) = webgl_channel().unwrap();
+ renderer.send(WebGLCommand::CreateTexture(sender)).unwrap();
let result = receiver.recv().unwrap();
result.map(|texture_id| WebGLTexture::new(window, renderer, texture_id))
}
pub fn new(window: &Window,
- renderer: IpcSender<CanvasMsg>,
+ renderer: WebGLMsgSender,
id: WebGLTextureId)
-> Root<WebGLTexture> {
reflect_dom_object(box WebGLTexture::new_inherited(renderer, id),
@@ -113,7 +111,7 @@ impl WebGLTexture {
self.target.set(Some(target));
}
- let msg = CanvasMsg::WebGL(WebGLCommand::BindTexture(target, Some(self.id)));
+ let msg = WebGLCommand::BindTexture(target, Some(self.id));
self.renderer.send(msg).unwrap();
Ok(())
@@ -168,7 +166,7 @@ impl WebGLTexture {
return Err(WebGLError::InvalidOperation);
}
- self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GenerateMipmap(target))).unwrap();
+ self.renderer.send(WebGLCommand::GenerateMipmap(target)).unwrap();
if self.base_mipmap_level + base_image_info.get_max_mimap_levels() == 0 {
return Err(WebGLError::InvalidOperation);
@@ -181,7 +179,7 @@ impl WebGLTexture {
pub fn delete(&self) {
if !self.is_deleted.get() {
self.is_deleted.set(true);
- let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteTexture(self.id)));
+ let _ = self.renderer.send(WebGLCommand::DeleteTexture(self.id));
}
}
@@ -216,7 +214,7 @@ impl WebGLTexture {
constants::LINEAR_MIPMAP_LINEAR => {
self.min_filter.set(Some(int_value as u32));
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::TexParameteri(target, name, int_value)))
+ .send(WebGLCommand::TexParameteri(target, name, int_value))
.unwrap();
Ok(())
},
@@ -230,7 +228,7 @@ impl WebGLTexture {
constants::LINEAR => {
self.mag_filter.set(Some(int_value as u32));
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::TexParameteri(target, name, int_value)))
+ .send(WebGLCommand::TexParameteri(target, name, int_value))
.unwrap();
Ok(())
},
@@ -245,7 +243,7 @@ impl WebGLTexture {
constants::MIRRORED_REPEAT |
constants::REPEAT => {
self.renderer
- .send(CanvasMsg::WebGL(WebGLCommand::TexParameteri(target, name, int_value)))
+ .send(WebGLCommand::TexParameteri(target, name, int_value))
.unwrap();
Ok(())
},
diff --git a/components/script/dom/webgluniformlocation.rs b/components/script/dom/webgluniformlocation.rs
index 228808303c4..47292adeb18 100644
--- a/components/script/dom/webgluniformlocation.rs
+++ b/components/script/dom/webgluniformlocation.rs
@@ -3,12 +3,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
+use canvas_traits::webgl::WebGLProgramId;
use dom::bindings::codegen::Bindings::WebGLUniformLocationBinding;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::window::Window;
use dom_struct::dom_struct;
-use webrender_api::WebGLProgramId;
#[dom_struct]
pub struct WebGLUniformLocation {
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 90693a2ccbf..2da650ee1ee 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -5,6 +5,7 @@
use app_units::Au;
use base64;
use bluetooth_traits::BluetoothRequest;
+use canvas_traits::webgl::WebGLChan;
use cssparser::{Parser, ParserInput};
use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarkerType};
use dom::bindings::cell::DOMRefCell;
@@ -264,7 +265,11 @@ pub struct Window {
/// A handle for communicating messages to the webvr thread, if available.
#[ignore_heap_size_of = "channels are hard"]
- webvr_thread: Option<IpcSender<WebVRMsg>>,
+ webgl_chan: WebGLChan,
+
+ /// A handle for communicating messages to the webvr thread, if available.
+ #[ignore_heap_size_of = "channels are hard"]
+ webvr_chan: Option<IpcSender<WebVRMsg>>,
/// A map for storing the previous permission state read results.
permission_state_invocation_results: DOMRefCell<HashMap<String, PermissionState>>,
@@ -380,8 +385,12 @@ impl Window {
self.current_viewport.clone().get()
}
+ pub fn webgl_chan(&self) -> WebGLChan {
+ self.webgl_chan.clone()
+ }
+
pub fn webvr_thread(&self) -> Option<IpcSender<WebVRMsg>> {
- self.webvr_thread.clone()
+ self.webvr_chan.clone()
}
fn new_paint_worklet(&self) -> Root<Worklet> {
@@ -1800,7 +1809,8 @@ impl Window {
origin: MutableOrigin,
navigation_start: u64,
navigation_start_precise: f64,
- webvr_thread: Option<IpcSender<WebVRMsg>>)
+ webgl_chan: WebGLChan,
+ webvr_chan: Option<IpcSender<WebVRMsg>>)
-> Root<Window> {
let layout_rpc: Box<LayoutRPC + Send> = {
let (rpc_send, rpc_recv) = channel();
@@ -1866,7 +1876,8 @@ impl Window {
scroll_offsets: DOMRefCell::new(HashMap::new()),
media_query_lists: WeakMediaQueryListVec::new(),
test_runner: Default::default(),
- webvr_thread: webvr_thread,
+ webgl_chan: webgl_chan,
+ webvr_chan: webvr_chan,
permission_state_invocation_results: DOMRefCell::new(HashMap::new()),
pending_layout_images: DOMRefCell::new(HashMap::new()),
unminified_js_dir: DOMRefCell::new(None),
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index ea8038897ac..4a05002637a 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -18,6 +18,7 @@
//! loop.
use bluetooth_traits::BluetoothRequest;
+use canvas_traits::webgl::WebGLPipeline;
use devtools;
use devtools_traits::{DevtoolScriptControlMsg, DevtoolsPageInfo};
use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
@@ -508,8 +509,11 @@ pub struct ScriptThread {
/// The unit of related similar-origin browsing contexts' list of MutationObserver objects
mutation_observers: DOMRefCell<Vec<JS<MutationObserver>>>,
+ /// A handle to the webgl thread
+ webgl_chan: WebGLPipeline,
+
/// A handle to the webvr thread, if available
- webvr_thread: Option<IpcSender<WebVRMsg>>,
+ webvr_chan: Option<IpcSender<WebVRMsg>>,
/// The worklet thread pool
worklet_thread_pool: DOMRefCell<Option<Rc<WorkletThreadPool>>>,
@@ -881,7 +885,8 @@ impl ScriptThread {
layout_to_constellation_chan: state.layout_to_constellation_chan,
- webvr_thread: state.webvr_thread,
+ webgl_chan: state.webgl_chan,
+ webvr_chan: state.webvr_chan,
worklet_thread_pool: Default::default(),
@@ -2028,7 +2033,8 @@ impl ScriptThread {
origin,
incomplete.navigation_start,
incomplete.navigation_start_precise,
- self.webvr_thread.clone());
+ self.webgl_chan.channel(),
+ self.webvr_chan.clone());
// Initialize the browsing context for the window.
let window_proxy = self.local_window_proxy(&window,