mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Revert "Auto merge of #17891 - MortimerGoro:webgl_move, r=glennw,emilio"
This reverts commit90f55ea458
, reversing changes made to2e60b27a21
.
This commit is contained in:
parent
ee94e2b7c0
commit
cfe22e3979
54 changed files with 1426 additions and 3154 deletions
|
@ -30,11 +30,8 @@
|
|||
//! `JSTraceable` to a datatype.
|
||||
|
||||
use app_units::Au;
|
||||
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 canvas_traits::{CanvasGradientStop, LinearGradientStyle, RadialGradientStyle};
|
||||
use canvas_traits::{CompositionOrBlending, LineCapStyle, LineJoinStyle, RepetitionStyle};
|
||||
use cssparser::RGBA;
|
||||
use devtools_traits::{CSSError, TimelineMarkerType, WorkerId};
|
||||
use dom::abstractworker::SharedRt;
|
||||
|
@ -108,7 +105,8 @@ use style::stylesheets::keyframes_rule::Keyframe;
|
|||
use style::values::specified::Length;
|
||||
use time::Duration;
|
||||
use uuid::Uuid;
|
||||
use webrender_api::ImageKey;
|
||||
use webrender_api::{WebGLBufferId, WebGLError, WebGLFramebufferId, WebGLProgramId};
|
||||
use webrender_api::{WebGLRenderbufferId, WebGLShaderId, WebGLTextureId, WebGLVertexArrayId};
|
||||
use webvr_traits::WebVRGamepadHand;
|
||||
|
||||
/// A trait to allow tracing (only) DOM objects.
|
||||
|
@ -393,13 +391,8 @@ 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);
|
||||
|
@ -473,20 +466,6 @@ 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) {
|
||||
|
|
|
@ -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::canvas::{CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle};
|
||||
use canvas_traits::{CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle};
|
||||
use cssparser::{Parser, ParserInput, RGBA};
|
||||
use cssparser::Color as CSSColor;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
|
|
|
@ -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::canvas::{FillOrStrokeStyle, RepetitionStyle, SurfaceStyle};
|
||||
use canvas_traits::{FillOrStrokeStyle, RepetitionStyle, SurfaceStyle};
|
||||
use dom::bindings::codegen::Bindings::CanvasPatternBinding;
|
||||
use dom::bindings::js::Root;
|
||||
use dom::bindings::reflector::{Reflector, reflect_dom_object};
|
||||
|
|
|
@ -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::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 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 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::Recreate(size))
|
||||
.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size)))
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
|
@ -173,6 +173,10 @@ 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);
|
||||
|
@ -1388,7 +1392,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
|
||||
impl Drop for CanvasRenderingContext2D {
|
||||
fn drop(&mut self) {
|
||||
if let Err(err) = self.ipc_renderer.send(CanvasMsg::Close) {
|
||||
if let Err(err) = self.ipc_renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)) {
|
||||
warn!("Could not close canvas: {}", err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use base64;
|
||||
use canvas_traits::canvas::{CanvasMsg, FromScriptMsg};
|
||||
use canvas_traits::{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;
|
||||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use js::error::throw_type_error;
|
||||
use js::jsapi::{HandleValue, JSContext};
|
||||
use offscreen_gl_context::GLContextAttributes;
|
||||
use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource};
|
||||
use script_layout_interface::HTMLCanvasData;
|
||||
use std::iter::repeat;
|
||||
use style::attr::{AttrValue, LengthOrPercentageOrAuto};
|
||||
|
||||
|
@ -106,22 +106,21 @@ impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
|
|||
fn data(&self) -> HTMLCanvasData {
|
||||
unsafe {
|
||||
let canvas = &*self.unsafe_get();
|
||||
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 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 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 {
|
||||
source: source,
|
||||
ipc_renderer: ipc_renderer,
|
||||
width: width_attr.map_or(DEFAULT_WIDTH, |val| val.as_uint()),
|
||||
height: height_attr.map_or(DEFAULT_HEIGHT, |val| val.as_uint()),
|
||||
}
|
||||
|
@ -151,6 +150,15 @@ 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);
|
||||
|
@ -213,26 +221,22 @@ impl HTMLCanvasElement {
|
|||
return None
|
||||
}
|
||||
|
||||
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();
|
||||
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();
|
||||
|
||||
match receiver.recv().unwrap() {
|
||||
Some(pixels) => pixels,
|
||||
None => {
|
||||
return None;
|
||||
}
|
||||
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;
|
||||
}
|
||||
},
|
||||
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))
|
||||
|
|
|
@ -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::canvas::CanvasImageData;
|
||||
use canvas_traits::canvas::CanvasMsg;
|
||||
use canvas_traits::canvas::FromLayoutMsg;
|
||||
use canvas_traits::CanvasData;
|
||||
use canvas_traits::CanvasMsg;
|
||||
use canvas_traits::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<CanvasImageData>) {
|
||||
pub fn send_data(&self, sender: IpcSender<CanvasData>) {
|
||||
let msg = CanvasMsg::FromLayout(FromLayoutMsg::SendData(sender));
|
||||
let _ = self.context.get_ipc_renderer().send(msg);
|
||||
let _ = self.context.ipc_renderer().send(msg);
|
||||
}
|
||||
|
||||
pub fn take_missing_image_urls(&self) -> Vec<ServoUrl> {
|
||||
|
|
|
@ -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::CanvasData;
|
||||
use dom::bindings::callback::CallbackContainer;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::PaintWorkletGlobalScopeBinding;
|
||||
|
@ -297,7 +298,7 @@ impl PaintWorkletGlobalScope {
|
|||
let (sender, receiver) = ipc::channel().expect("IPC channel creation.");
|
||||
rendering_context.send_data(sender);
|
||||
let image_key = match receiver.recv() {
|
||||
Ok(data) => Some(data.image_key),
|
||||
Ok(CanvasData::Image(data)) => Some(data.image_key),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
|
|
|
@ -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::webgl::{webgl_channel, WebGLReceiver, WebVRCommand};
|
||||
use canvas_traits::CanvasMsg;
|
||||
use core::ops::Deref;
|
||||
use dom::bindings::callback::ExceptionHandling;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
|
@ -32,7 +32,8 @@ use dom::vrpose::VRPose;
|
|||
use dom::vrstageparameters::VRStageParameters;
|
||||
use dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use dom_struct::dom_struct;
|
||||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use ipc_channel::ipc;
|
||||
use ipc_channel::ipc::{IpcSender, IpcReceiver};
|
||||
use js::jsapi::JSContext;
|
||||
use script_runtime::CommonScriptMsg;
|
||||
use script_runtime::ScriptThreadEventCategory::WebVREvent;
|
||||
|
@ -42,6 +43,7 @@ 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]
|
||||
|
@ -69,7 +71,7 @@ pub struct VRDisplay {
|
|||
// Compositor VRFrameData synchonization
|
||||
frame_data_status: Cell<VRFrameDataStatus>,
|
||||
#[ignore_heap_size_of = "channels are hard"]
|
||||
frame_data_receiver: DOMRefCell<Option<WebGLReceiver<Result<Vec<u8>, ()>>>>,
|
||||
frame_data_receiver: DOMRefCell<Option<IpcReceiver<Result<Vec<u8>, ()>>>>,
|
||||
running_display_raf: Cell<bool>,
|
||||
paused: Cell<bool>,
|
||||
stopped_on_pause: Cell<bool>,
|
||||
|
@ -384,10 +386,11 @@ impl VRDisplayMethods for VRDisplay {
|
|||
return;
|
||||
}
|
||||
|
||||
let display_id = self.display.borrow().display_id;
|
||||
let api_sender = self.layer_ctx.get().unwrap().ipc_renderer();
|
||||
let display_id = self.display.borrow().display_id as u64;
|
||||
let layer = self.layer.borrow();
|
||||
let msg = WebVRCommand::SubmitFrame(display_id, layer.left_bounds, layer.right_bounds);
|
||||
self.layer_ctx.get().unwrap().send_vr_command(msg);
|
||||
let msg = VRCompositorCommand::SubmitFrame(display_id, layer.left_bounds, layer.right_bounds);
|
||||
api_sender.send(CanvasMsg::WebVR(msg)).unwrap();
|
||||
}
|
||||
|
||||
// https://w3c.github.io/webvr/spec/1.1/#dom-vrdisplay-getlayers
|
||||
|
@ -486,11 +489,11 @@ impl VRDisplay {
|
|||
|
||||
fn init_present(&self) {
|
||||
self.presenting.set(true);
|
||||
let (sync_sender, sync_receiver) = webgl_channel().unwrap();
|
||||
let (sync_sender, sync_receiver) = ipc::channel().unwrap();
|
||||
*self.frame_data_receiver.borrow_mut() = Some(sync_receiver);
|
||||
|
||||
let display_id = self.display.borrow().display_id;
|
||||
let api_sender = self.layer_ctx.get().unwrap().webgl_sender();
|
||||
let display_id = self.display.borrow().display_id as u64;
|
||||
let api_sender = self.layer_ctx.get().unwrap().ipc_renderer();
|
||||
let js_sender = self.global().script_chan();
|
||||
let address = Trusted::new(&*self);
|
||||
let near_init = self.depth_near.get();
|
||||
|
@ -508,7 +511,7 @@ impl VRDisplay {
|
|||
let mut far = far_init;
|
||||
|
||||
// Initialize compositor
|
||||
api_sender.send_vr(WebVRCommand::Create(display_id)).unwrap();
|
||||
api_sender.send(CanvasMsg::WebVR(VRCompositorCommand::Create(display_id))).unwrap();
|
||||
loop {
|
||||
// Run RAF callbacks on JavaScript thread
|
||||
let msg = box NotifyDisplayRAF {
|
||||
|
@ -518,8 +521,8 @@ impl VRDisplay {
|
|||
js_sender.send(CommonScriptMsg::RunnableMsg(WebVREvent, msg)).unwrap();
|
||||
|
||||
// Run Sync Poses in parallell on Render thread
|
||||
let msg = WebVRCommand::SyncPoses(display_id, near, far, sync_sender.clone());
|
||||
api_sender.send_vr(msg).unwrap();
|
||||
let msg = VRCompositorCommand::SyncPoses(display_id, near, far, sync_sender.clone());
|
||||
api_sender.send(CanvasMsg::WebVR(msg)).unwrap();
|
||||
|
||||
// Wait until both SyncPoses & RAF ends
|
||||
if let Ok(depth) = raf_receiver.recv().unwrap() {
|
||||
|
@ -538,9 +541,10 @@ impl VRDisplay {
|
|||
self.presenting.set(false);
|
||||
*self.frame_data_receiver.borrow_mut() = None;
|
||||
|
||||
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();
|
||||
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();
|
||||
}
|
||||
|
||||
// Only called when the JSContext is destroyed while presenting.
|
||||
|
@ -623,7 +627,7 @@ impl Runnable for NotifyDisplayRAF {
|
|||
}
|
||||
|
||||
|
||||
// WebVR Spec: If the number of values in the leftBounds/rightBounds arrays
|
||||
// WebVR Spect: 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 {
|
||||
|
|
|
@ -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::webgl::{webgl_channel, WebGLCommand, WebGLError};
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::codegen::Bindings::OESVertexArrayObjectBinding::{self, OESVertexArrayObjectMethods};
|
||||
use dom::bindings::codegen::Bindings::OESVertexArrayObjectBinding::OESVertexArrayObjectConstants;
|
||||
use dom::bindings::js::{JS, MutNullableJS, Root};
|
||||
|
@ -15,6 +15,7 @@ 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 {
|
||||
|
@ -47,8 +48,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) = webgl_channel().unwrap();
|
||||
self.ctx.send_command(WebGLCommand::CreateVertexArray(sender));
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::CreateVertexArray(sender)));
|
||||
|
||||
let result = receiver.recv().unwrap();
|
||||
result.map(|vao_id| WebGLVertexArrayObjectOES::new(&self.global(), vao_id))
|
||||
|
@ -65,7 +66,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_command(WebGLCommand::BindVertexArray(None));
|
||||
self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::BindVertexArray(None)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,7 +80,7 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
|
|||
}
|
||||
|
||||
// Delete the vao
|
||||
self.ctx.send_command(WebGLCommand::DeleteVertexArray(vao.id()));
|
||||
self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::DeleteVertexArray(vao.id())));
|
||||
vao.set_deleted();
|
||||
}
|
||||
}
|
||||
|
@ -113,7 +114,7 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
|
|||
return;
|
||||
}
|
||||
|
||||
self.ctx.send_command(WebGLCommand::BindVertexArray(Some(vao.id())));
|
||||
self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::BindVertexArray(Some(vao.id()))));
|
||||
vao.set_ever_bound();
|
||||
self.bound_vao.set(Some(&vao));
|
||||
|
||||
|
@ -123,7 +124,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_command(WebGLCommand::BindVertexArray(None));
|
||||
self.ctx.send_renderer_message(CanvasMsg::WebGL(WebGLCommand::BindVertexArray(None)));
|
||||
self.bound_vao.set(None);
|
||||
self.ctx.set_bound_attrib_buffers(iter::empty());
|
||||
}
|
||||
|
|
|
@ -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::webgl::WebGLVertexArrayId;
|
||||
use core::cell::Ref;
|
||||
use core::iter::FromIterator;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
|
@ -16,6 +15,7 @@ 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 {
|
||||
|
|
|
@ -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::webgl::WebGLError;
|
||||
use core::iter::FromIterator;
|
||||
use core::nonzero::NonZero;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
|
@ -20,6 +19,7 @@ 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.
|
||||
|
|
|
@ -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)]
|
||||
|
|
|
@ -3,8 +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::webgl::{WebGLBufferId, WebGLCommand, WebGLError, WebGLMsgSender, WebGLResult, WebGLVertexArrayId};
|
||||
use canvas_traits::webgl::webgl_channel;
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::WebGLBufferBinding;
|
||||
use dom::bindings::js::Root;
|
||||
|
@ -12,9 +11,11 @@ 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 {
|
||||
|
@ -28,11 +29,11 @@ pub struct WebGLBuffer {
|
|||
vao_references: DOMRefCell<Option<HashSet<WebGLVertexArrayId>>>,
|
||||
pending_delete: Cell<bool>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
}
|
||||
|
||||
impl WebGLBuffer {
|
||||
fn new_inherited(renderer: WebGLMsgSender,
|
||||
fn new_inherited(renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLBufferId)
|
||||
-> WebGLBuffer {
|
||||
WebGLBuffer {
|
||||
|
@ -47,17 +48,17 @@ impl WebGLBuffer {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
|
||||
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
|
||||
-> Option<Root<WebGLBuffer>> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
renderer.send(WebGLCommand::CreateBuffer(sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
renderer.send(CanvasMsg::WebGL(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: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLBufferId)
|
||||
-> Root<WebGLBuffer> {
|
||||
reflect_dom_object(box WebGLBuffer::new_inherited(renderer, id),
|
||||
|
@ -80,7 +81,7 @@ impl WebGLBuffer {
|
|||
} else {
|
||||
self.target.set(Some(target));
|
||||
}
|
||||
let msg = WebGLCommand::BindBuffer(target, Some(self.id));
|
||||
let msg = CanvasMsg::WebGL(WebGLCommand::BindBuffer(target, Some(self.id)));
|
||||
self.renderer.send(msg).unwrap();
|
||||
|
||||
Ok(())
|
||||
|
@ -93,7 +94,9 @@ impl WebGLBuffer {
|
|||
}
|
||||
}
|
||||
self.capacity.set(data.len());
|
||||
self.renderer.send(WebGLCommand::BufferData(target, data.to_vec(), usage)).unwrap();
|
||||
self.renderer
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::BufferData(target, data.to_vec(), usage)))
|
||||
.unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -105,7 +108,7 @@ impl WebGLBuffer {
|
|||
pub fn delete(&self) {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
let _ = self.renderer.send(WebGLCommand::DeleteBuffer(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteBuffer(self.id)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,7 +144,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(WebGLCommand::DeleteBuffer(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteBuffer(self.id)));
|
||||
self.is_deleted.set(true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,9 +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::webgl::{WebGLCommand, WebGLFramebufferBindingRequest, WebGLFramebufferId};
|
||||
use canvas_traits::webgl::{WebGLMsgSender, WebGLResult, WebGLError};
|
||||
use canvas_traits::webgl::webgl_channel;
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::WebGLFramebufferBinding;
|
||||
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
|
||||
|
@ -16,7 +14,10 @@ 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)]
|
||||
|
@ -35,7 +36,7 @@ pub struct WebGLFramebuffer {
|
|||
size: Cell<Option<(i32, i32)>>,
|
||||
status: Cell<u32>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
|
||||
// The attachment points for textures and renderbuffers on this
|
||||
// FBO.
|
||||
|
@ -46,7 +47,7 @@ pub struct WebGLFramebuffer {
|
|||
}
|
||||
|
||||
impl WebGLFramebuffer {
|
||||
fn new_inherited(renderer: WebGLMsgSender,
|
||||
fn new_inherited(renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLFramebufferId)
|
||||
-> WebGLFramebuffer {
|
||||
WebGLFramebuffer {
|
||||
|
@ -64,17 +65,17 @@ impl WebGLFramebuffer {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
|
||||
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
|
||||
-> Option<Root<WebGLFramebuffer>> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
renderer.send(WebGLCommand::CreateFramebuffer(sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
renderer.send(CanvasMsg::WebGL(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: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLFramebufferId)
|
||||
-> Root<WebGLFramebuffer> {
|
||||
reflect_dom_object(box WebGLFramebuffer::new_inherited(renderer, id),
|
||||
|
@ -97,13 +98,13 @@ impl WebGLFramebuffer {
|
|||
|
||||
self.target.set(Some(target));
|
||||
let cmd = WebGLCommand::BindFramebuffer(target, WebGLFramebufferBindingRequest::Explicit(self.id));
|
||||
self.renderer.send(cmd).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
|
||||
}
|
||||
|
||||
pub fn delete(&self) {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
let _ = self.renderer.send(WebGLCommand::DeleteFramebuffer(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteFramebuffer(self.id)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,10 +205,10 @@ impl WebGLFramebuffer {
|
|||
}
|
||||
};
|
||||
|
||||
self.renderer.send(WebGLCommand::FramebufferRenderbuffer(constants::FRAMEBUFFER,
|
||||
attachment,
|
||||
constants::RENDERBUFFER,
|
||||
rb_id)).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::FramebufferRenderbuffer(constants::FRAMEBUFFER,
|
||||
attachment,
|
||||
constants::RENDERBUFFER,
|
||||
rb_id))).unwrap();
|
||||
|
||||
self.update_status();
|
||||
Ok(())
|
||||
|
@ -280,11 +281,11 @@ impl WebGLFramebuffer {
|
|||
}
|
||||
};
|
||||
|
||||
self.renderer.send(WebGLCommand::FramebufferTexture2D(constants::FRAMEBUFFER,
|
||||
attachment,
|
||||
textarget,
|
||||
tex_id,
|
||||
level)).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::FramebufferTexture2D(constants::FRAMEBUFFER,
|
||||
attachment,
|
||||
textarget,
|
||||
tex_id,
|
||||
level))).unwrap();
|
||||
|
||||
self.update_status();
|
||||
Ok(())
|
||||
|
|
|
@ -3,8 +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::webgl::{WebGLCommand, WebGLError, WebGLMsgSender, WebGLParameter, WebGLProgramId, WebGLResult};
|
||||
use canvas_traits::webgl::webgl_channel;
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::codegen::Bindings::WebGLProgramBinding;
|
||||
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
|
||||
use dom::bindings::js::{MutNullableJS, Root};
|
||||
|
@ -16,7 +15,10 @@ 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 {
|
||||
|
@ -28,11 +30,11 @@ pub struct WebGLProgram {
|
|||
fragment_shader: MutNullableJS<WebGLShader>,
|
||||
vertex_shader: MutNullableJS<WebGLShader>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
}
|
||||
|
||||
impl WebGLProgram {
|
||||
fn new_inherited(renderer: WebGLMsgSender,
|
||||
fn new_inherited(renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLProgramId)
|
||||
-> WebGLProgram {
|
||||
WebGLProgram {
|
||||
|
@ -47,17 +49,17 @@ impl WebGLProgram {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
|
||||
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
|
||||
-> Option<Root<WebGLProgram>> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
renderer.send(WebGLCommand::CreateProgram(sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
renderer.send(CanvasMsg::WebGL(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: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLProgramId)
|
||||
-> Root<WebGLProgram> {
|
||||
reflect_dom_object(box WebGLProgram::new_inherited(renderer, id),
|
||||
|
@ -76,7 +78,7 @@ impl WebGLProgram {
|
|||
pub fn delete(&self) {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
let _ = self.renderer.send(WebGLCommand::DeleteProgram(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteProgram(self.id)));
|
||||
|
||||
if let Some(shader) = self.fragment_shader.get() {
|
||||
shader.decrement_attached_counter();
|
||||
|
@ -115,7 +117,7 @@ impl WebGLProgram {
|
|||
}
|
||||
|
||||
self.linked.set(true);
|
||||
self.renderer.send(WebGLCommand::LinkProgram(self.id)).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::LinkProgram(self.id))).unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -128,7 +130,7 @@ impl WebGLProgram {
|
|||
return Err(WebGLError::InvalidOperation);
|
||||
}
|
||||
|
||||
self.renderer.send(WebGLCommand::UseProgram(self.id)).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::UseProgram(self.id))).unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -137,7 +139,7 @@ impl WebGLProgram {
|
|||
if self.is_deleted() {
|
||||
return Err(WebGLError::InvalidOperation);
|
||||
}
|
||||
self.renderer.send(WebGLCommand::ValidateProgram(self.id)).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::ValidateProgram(self.id))).unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -164,7 +166,7 @@ impl WebGLProgram {
|
|||
shader_slot.set(Some(shader));
|
||||
shader.increment_attached_counter();
|
||||
|
||||
self.renderer.send(WebGLCommand::AttachShader(self.id, shader.id())).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -194,7 +196,7 @@ impl WebGLProgram {
|
|||
shader_slot.set(None);
|
||||
shader.decrement_attached_counter();
|
||||
|
||||
self.renderer.send(WebGLCommand::DetachShader(self.id, shader.id())).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -214,7 +216,7 @@ impl WebGLProgram {
|
|||
}
|
||||
|
||||
self.renderer
|
||||
.send(WebGLCommand::BindAttribLocation(self.id, index, String::from(name)))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::BindAttribLocation(self.id, index, String::from(name))))
|
||||
.unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
@ -223,9 +225,9 @@ impl WebGLProgram {
|
|||
if self.is_deleted() {
|
||||
return Err(WebGLError::InvalidValue);
|
||||
}
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer
|
||||
.send(WebGLCommand::GetActiveUniform(self.id, index, sender))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::GetActiveUniform(self.id, index, sender)))
|
||||
.unwrap();
|
||||
|
||||
receiver.recv().unwrap().map(|(size, ty, name)|
|
||||
|
@ -237,9 +239,9 @@ impl WebGLProgram {
|
|||
if self.is_deleted() {
|
||||
return Err(WebGLError::InvalidValue);
|
||||
}
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer
|
||||
.send(WebGLCommand::GetActiveAttrib(self.id, index, sender))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::GetActiveAttrib(self.id, index, sender)))
|
||||
.unwrap();
|
||||
|
||||
receiver.recv().unwrap().map(|(size, ty, name)|
|
||||
|
@ -264,9 +266,9 @@ impl WebGLProgram {
|
|||
return Ok(None);
|
||||
}
|
||||
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer
|
||||
.send(WebGLCommand::GetAttribLocation(self.id, String::from(name), sender))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::GetAttribLocation(self.id, String::from(name), sender)))
|
||||
.unwrap();
|
||||
Ok(receiver.recv().unwrap())
|
||||
}
|
||||
|
@ -285,9 +287,9 @@ impl WebGLProgram {
|
|||
return Ok(None);
|
||||
}
|
||||
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer
|
||||
.send(WebGLCommand::GetUniformLocation(self.id, String::from(name), sender))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::GetUniformLocation(self.id, String::from(name), sender)))
|
||||
.unwrap();
|
||||
Ok(receiver.recv().unwrap())
|
||||
}
|
||||
|
@ -306,15 +308,15 @@ impl WebGLProgram {
|
|||
return Ok("One or more shaders failed to compile".to_string());
|
||||
}
|
||||
}
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
self.renderer.send(WebGLCommand::GetProgramInfoLog(self.id, sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetProgramInfoLog(self.id, sender))).unwrap();
|
||||
Ok(receiver.recv().unwrap())
|
||||
}
|
||||
|
||||
/// glGetProgramParameter
|
||||
pub fn parameter(&self, param_id: u32) -> WebGLResult<WebGLParameter> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
self.renderer.send(WebGLCommand::GetProgramParameter(self.id, param_id, sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetProgramParameter(self.id, param_id, sender))).unwrap();
|
||||
receiver.recv().unwrap()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLRenderbufferId, WebGLResult};
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::codegen::Bindings::WebGLRenderbufferBinding;
|
||||
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
|
||||
use dom::bindings::js::Root;
|
||||
|
@ -11,7 +11,10 @@ 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 {
|
||||
|
@ -22,11 +25,11 @@ pub struct WebGLRenderbuffer {
|
|||
size: Cell<Option<(i32, i32)>>,
|
||||
internal_format: Cell<Option<u32>>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
}
|
||||
|
||||
impl WebGLRenderbuffer {
|
||||
fn new_inherited(renderer: WebGLMsgSender,
|
||||
fn new_inherited(renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLRenderbufferId)
|
||||
-> WebGLRenderbuffer {
|
||||
WebGLRenderbuffer {
|
||||
|
@ -40,17 +43,17 @@ impl WebGLRenderbuffer {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
|
||||
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
|
||||
-> Option<Root<WebGLRenderbuffer>> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
renderer.send(WebGLCommand::CreateRenderbuffer(sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
renderer.send(CanvasMsg::WebGL(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: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLRenderbufferId)
|
||||
-> Root<WebGLRenderbuffer> {
|
||||
reflect_dom_object(box WebGLRenderbuffer::new_inherited(renderer, id),
|
||||
|
@ -71,14 +74,14 @@ impl WebGLRenderbuffer {
|
|||
|
||||
pub fn bind(&self, target: u32) {
|
||||
self.ever_bound.set(true);
|
||||
let msg = WebGLCommand::BindRenderbuffer(target, Some(self.id));
|
||||
let msg = CanvasMsg::WebGL(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(WebGLCommand::DeleteRenderbuffer(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteRenderbuffer(self.id)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -107,7 +110,8 @@ impl WebGLRenderbuffer {
|
|||
|
||||
// FIXME: Invalidate completeness after the call
|
||||
|
||||
let msg = WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER, internal_format, width, height);
|
||||
let msg = CanvasMsg::WebGL(WebGLCommand::RenderbufferStorage(constants::RENDERBUFFER,
|
||||
internal_format, width, height));
|
||||
self.renderer.send(msg).unwrap();
|
||||
|
||||
self.size.set(Some((width, height)));
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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::webgl::{webgl_channel, WebGLCommand, WebGLMsgSender, WebGLParameter, WebGLResult, WebGLShaderId};
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::WebGLShaderBinding;
|
||||
use dom::bindings::js::Root;
|
||||
|
@ -13,8 +13,11 @@ 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 {
|
||||
|
@ -34,7 +37,7 @@ pub struct WebGLShader {
|
|||
attached_counter: Cell<u32>,
|
||||
compilation_status: Cell<ShaderCompilationStatus>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "android"))]
|
||||
|
@ -46,7 +49,7 @@ const SHADER_OUTPUT_FORMAT: Output = Output::Essl;
|
|||
static GLSLANG_INITIALIZATION: Once = ONCE_INIT;
|
||||
|
||||
impl WebGLShader {
|
||||
fn new_inherited(renderer: WebGLMsgSender,
|
||||
fn new_inherited(renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLShaderId,
|
||||
shader_type: u32)
|
||||
-> WebGLShader {
|
||||
|
@ -65,18 +68,18 @@ impl WebGLShader {
|
|||
}
|
||||
|
||||
pub fn maybe_new(window: &Window,
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
shader_type: u32)
|
||||
-> Option<Root<WebGLShader>> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
renderer.send(WebGLCommand::CreateShader(shader_type, sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
renderer.send(CanvasMsg::WebGL(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: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLShaderId,
|
||||
shader_type: u32)
|
||||
-> Root<WebGLShader> {
|
||||
|
@ -115,7 +118,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(msg).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(msg)).unwrap();
|
||||
self.compilation_status.set(ShaderCompilationStatus::Succeeded);
|
||||
},
|
||||
Err(error) => {
|
||||
|
@ -139,7 +142,7 @@ impl WebGLShader {
|
|||
pub fn delete(&self) {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
let _ = self.renderer.send(WebGLCommand::DeleteShader(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteShader(self.id)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,8 +170,8 @@ impl WebGLShader {
|
|||
|
||||
/// glGetParameter
|
||||
pub fn parameter(&self, param_id: u32) -> WebGLResult<WebGLParameter> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
self.renderer.send(WebGLCommand::GetShaderParameter(self.id, param_id, sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderParameter(self.id, param_id, sender))).unwrap();
|
||||
receiver.recv().unwrap()
|
||||
}
|
||||
|
||||
|
|
|
@ -3,8 +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::webgl::{webgl_channel, WebGLCommand, WebGLError, WebGLMsgSender, WebGLResult, WebGLTextureId};
|
||||
use canvas_traits::CanvasMsg;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
|
||||
use dom::bindings::codegen::Bindings::WebGLTextureBinding;
|
||||
|
@ -14,8 +13,11 @@ 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),
|
||||
|
@ -44,11 +46,11 @@ pub struct WebGLTexture {
|
|||
min_filter: Cell<Option<u32>>,
|
||||
mag_filter: Cell<Option<u32>>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
}
|
||||
|
||||
impl WebGLTexture {
|
||||
fn new_inherited(renderer: WebGLMsgSender,
|
||||
fn new_inherited(renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLTextureId)
|
||||
-> WebGLTexture {
|
||||
WebGLTexture {
|
||||
|
@ -65,17 +67,17 @@ impl WebGLTexture {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn maybe_new(window: &Window, renderer: WebGLMsgSender)
|
||||
pub fn maybe_new(window: &Window, renderer: IpcSender<CanvasMsg>)
|
||||
-> Option<Root<WebGLTexture>> {
|
||||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
renderer.send(WebGLCommand::CreateTexture(sender)).unwrap();
|
||||
let (sender, receiver) = webrender_api::channel::msg_channel().unwrap();
|
||||
renderer.send(CanvasMsg::WebGL(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: WebGLMsgSender,
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
id: WebGLTextureId)
|
||||
-> Root<WebGLTexture> {
|
||||
reflect_dom_object(box WebGLTexture::new_inherited(renderer, id),
|
||||
|
@ -111,7 +113,7 @@ impl WebGLTexture {
|
|||
self.target.set(Some(target));
|
||||
}
|
||||
|
||||
let msg = WebGLCommand::BindTexture(target, Some(self.id));
|
||||
let msg = CanvasMsg::WebGL(WebGLCommand::BindTexture(target, Some(self.id)));
|
||||
self.renderer.send(msg).unwrap();
|
||||
|
||||
Ok(())
|
||||
|
@ -166,7 +168,7 @@ impl WebGLTexture {
|
|||
return Err(WebGLError::InvalidOperation);
|
||||
}
|
||||
|
||||
self.renderer.send(WebGLCommand::GenerateMipmap(target)).unwrap();
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::GenerateMipmap(target))).unwrap();
|
||||
|
||||
if self.base_mipmap_level + base_image_info.get_max_mimap_levels() == 0 {
|
||||
return Err(WebGLError::InvalidOperation);
|
||||
|
@ -179,7 +181,7 @@ impl WebGLTexture {
|
|||
pub fn delete(&self) {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
let _ = self.renderer.send(WebGLCommand::DeleteTexture(self.id));
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteTexture(self.id)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,7 +216,7 @@ impl WebGLTexture {
|
|||
constants::LINEAR_MIPMAP_LINEAR => {
|
||||
self.min_filter.set(Some(int_value as u32));
|
||||
self.renderer
|
||||
.send(WebGLCommand::TexParameteri(target, name, int_value))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::TexParameteri(target, name, int_value)))
|
||||
.unwrap();
|
||||
Ok(())
|
||||
},
|
||||
|
@ -228,7 +230,7 @@ impl WebGLTexture {
|
|||
constants::LINEAR => {
|
||||
self.mag_filter.set(Some(int_value as u32));
|
||||
self.renderer
|
||||
.send(WebGLCommand::TexParameteri(target, name, int_value))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::TexParameteri(target, name, int_value)))
|
||||
.unwrap();
|
||||
Ok(())
|
||||
},
|
||||
|
@ -243,7 +245,7 @@ impl WebGLTexture {
|
|||
constants::MIRRORED_REPEAT |
|
||||
constants::REPEAT => {
|
||||
self.renderer
|
||||
.send(WebGLCommand::TexParameteri(target, name, int_value))
|
||||
.send(CanvasMsg::WebGL(WebGLCommand::TexParameteri(target, name, int_value)))
|
||||
.unwrap();
|
||||
Ok(())
|
||||
},
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
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;
|
||||
|
@ -265,11 +264,7 @@ pub struct Window {
|
|||
|
||||
/// A handle for communicating messages to the webvr thread, if available.
|
||||
#[ignore_heap_size_of = "channels are hard"]
|
||||
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>>,
|
||||
webvr_thread: Option<IpcSender<WebVRMsg>>,
|
||||
|
||||
/// A map for storing the previous permission state read results.
|
||||
permission_state_invocation_results: DOMRefCell<HashMap<String, PermissionState>>,
|
||||
|
@ -385,12 +380,8 @@ 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_chan.clone()
|
||||
self.webvr_thread.clone()
|
||||
}
|
||||
|
||||
fn new_paint_worklet(&self) -> Root<Worklet> {
|
||||
|
@ -1809,8 +1800,7 @@ impl Window {
|
|||
origin: MutableOrigin,
|
||||
navigation_start: u64,
|
||||
navigation_start_precise: f64,
|
||||
webgl_chan: WebGLChan,
|
||||
webvr_chan: Option<IpcSender<WebVRMsg>>)
|
||||
webvr_thread: Option<IpcSender<WebVRMsg>>)
|
||||
-> Root<Window> {
|
||||
let layout_rpc: Box<LayoutRPC + Send> = {
|
||||
let (rpc_send, rpc_recv) = channel();
|
||||
|
@ -1876,8 +1866,7 @@ impl Window {
|
|||
scroll_offsets: DOMRefCell::new(HashMap::new()),
|
||||
media_query_lists: WeakMediaQueryListVec::new(),
|
||||
test_runner: Default::default(),
|
||||
webgl_chan: webgl_chan,
|
||||
webvr_chan: webvr_chan,
|
||||
webvr_thread: webvr_thread,
|
||||
permission_state_invocation_results: DOMRefCell::new(HashMap::new()),
|
||||
pending_layout_images: DOMRefCell::new(HashMap::new()),
|
||||
unminified_js_dir: DOMRefCell::new(None),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue