aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/webglbuffer.rs8
-rw-r--r--components/script/dom/webglframebuffer.rs8
-rw-r--r--components/script/dom/webglprogram.rs16
-rw-r--r--components/script/dom/webglrenderingcontext.rs34
-rw-r--r--components/script/dom/webglshader.rs2
-rw-r--r--components/script/dom/webgltexture.rs2
6 files changed, 47 insertions, 23 deletions
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs
index b9941026353..bf6d8618118 100644
--- a/components/script/dom/webglbuffer.rs
+++ b/components/script/dom/webglbuffer.rs
@@ -5,7 +5,7 @@
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
use dom::bindings::codegen::Bindings::WebGLBufferBinding;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::{Temporary, JSRef};
+use dom::bindings::js::Root;
use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
@@ -44,9 +44,9 @@ impl WebGLBuffer {
}
pub trait WebGLBufferHelpers {
- fn id(&self) -> u32;
- fn bind(&self, target: u32);
- fn delete(&self);
+ fn id(self) -> u32;
+ fn bind(self, target: u32);
+ fn delete(self);
}
impl<'a> WebGLBufferHelpers for &'a WebGLBuffer {
diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs
index cd23765dfff..bbf59529241 100644
--- a/components/script/dom/webglframebuffer.rs
+++ b/components/script/dom/webglframebuffer.rs
@@ -9,7 +9,7 @@ use dom::bindings::js::Root;
use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
-use canvas_traits::{CanvasMsg, CanvasWebGLMsg};
+use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLFramebufferBindingRequest};
use std::sync::mpsc::{channel, Sender};
use std::cell::Cell;
@@ -49,13 +49,15 @@ pub trait WebGLFramebufferHelpers {
fn delete(self);
}
-impl<'a> WebGLFramebufferHelpers for JSRef<'a, WebGLFramebuffer> {
+impl<'a> WebGLFramebufferHelpers for &'a WebGLFramebuffer {
fn id(self) -> u32 {
self.id
}
fn bind(self, target: u32) {
- self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BindFramebuffer(target, self.id))).unwrap();
+ self.renderer.send(
+ CanvasMsg::WebGL(
+ CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Explicit(self.id)))).unwrap();
}
fn delete(self) {
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs
index 63496f9bff6..35ac00689a8 100644
--- a/components/script/dom/webglprogram.rs
+++ b/components/script/dom/webglprogram.rs
@@ -5,9 +5,17 @@
// https://www.khronos.org/registry/webgl/specs/latest/1.0/webgl.idl
use dom::bindings::codegen::Bindings::WebGLProgramBinding;
use dom::bindings::global::GlobalRef;
-use dom::bindings::js::Root;
+use dom::bindings::js::{JS, MutNullableHeap, Root};
use dom::bindings::utils::reflect_dom_object;
use dom::webglobject::WebGLObject;
+use dom::webglshader::{WebGLShader, WebGLShaderHelpers};
+use dom::webglrenderingcontext::MAX_UNIFORM_AND_ATTRIBUTE_LEN;
+
+use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
+
+use canvas_traits::{CanvasMsg, CanvasWebGLMsg, WebGLResult, WebGLError};
+use std::sync::mpsc::{channel, Sender};
+use std::cell::Cell;
#[dom_struct]
pub struct WebGLProgram {
@@ -47,7 +55,7 @@ pub trait WebGLProgramHelpers {
fn delete(self);
fn link(self);
fn use_program(self);
- fn attach_shader(self, shader: JSRef<WebGLShader>) -> WebGLResult<()>;
+ fn attach_shader(self, shader: &WebGLShader) -> WebGLResult<()>;
fn get_attrib_location(self, name: String) -> WebGLResult<Option<i32>>;
fn get_uniform_location(self, name: String) -> WebGLResult<Option<i32>>;
}
@@ -72,7 +80,7 @@ impl<'a> WebGLProgramHelpers for &'a WebGLProgram {
}
/// glAttachShader
- fn attach_shader(self, shader: &'a WebGLShader) -> WebGLResult<()> {
+ fn attach_shader(self, shader: &WebGLShader) -> WebGLResult<()> {
let shader_slot = match shader.gl_type() {
constants::FRAGMENT_SHADER => &self.fragment_shader,
constants::VERTEX_SHADER => &self.vertex_shader,
@@ -85,7 +93,7 @@ impl<'a> WebGLProgramHelpers for &'a WebGLProgram {
return Err(WebGLError::InvalidOperation);
}
- shader_slot.set(Some(JS::from_rooted(shader)));
+ shader_slot.set(Some(JS::from_ref(shader)));
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::AttachShader(self.id, shader.id()))).unwrap();
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 42e748d51d6..23090a73cfb 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -3,10 +3,13 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use canvas::webgl_paint_task::WebGLPaintTask;
-use canvas_traits::{CanvasMsg, CanvasWebGLMsg, CanvasCommonMsg};
-use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding;
-use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{
- WebGLContextAttributes, WebGLRenderingContextMethods, WebGLRenderingContextConstants};
+use canvas_traits::
+ {CanvasMsg, CanvasWebGLMsg, CanvasCommonMsg, WebGLError,
+ WebGLShaderParameter, WebGLFramebufferBindingRequest};
+use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::
+ {self, WebGLContextAttributes, WebGLRenderingContextMethods};
+use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
+
use dom::bindings::global::{GlobalRef, GlobalField};
use dom::bindings::js::{JS, LayoutJS, Root};
use dom::bindings::utils::{Reflector, reflect_dom_object};
@@ -22,7 +25,7 @@ use dom::webgluniformlocation::{WebGLUniformLocation, WebGLUniformLocationHelper
use euclid::size::Size2D;
use js::jsapi::{JSContext, JSObject, RootedValue};
use js::jsapi::{JS_GetFloat32ArrayData, JS_GetObjectAsArrayBufferView};
-use js::jsval::{JSVal, UndefinedValue, NullValue, Int32Value};
+use js::jsval::{JSVal, UndefinedValue, NullValue, Int32Value, BooleanValue};
use std::mem;
use std::ptr;
use std::slice;
@@ -116,10 +119,10 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// TODO(ecoal95): Implement the missing parameters from the spec
let mut rval = RootedValue::new(cx, UndefinedValue());
match parameter {
- WebGLRenderingContextConstants::VERSION =>
+ constants::VERSION =>
"WebGL 1.0".to_jsval(cx, rval.handle_mut()),
- WebGLRenderingContextConstants::RENDERER |
- WebGLRenderingContextConstants::VENDOR =>
+ constants::RENDERER |
+ constants::VENDOR =>
"Mozilla/Servo".to_jsval(cx, rval.handle_mut()),
_ => rval.ptr = NullValue(),
}
@@ -199,6 +202,9 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
fn BindBuffer(self, target: u32, buffer: Option<&WebGLBuffer>) {
if let Some(buffer) = buffer {
buffer.bind(target)
+ } else {
+ // Unbind the current buffer
+ self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BindBuffer(target, 0))).unwrap()
}
}
@@ -206,6 +212,11 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
fn BindFramebuffer(self, target: u32, framebuffer: Option<&WebGLFramebuffer>) {
if let Some(framebuffer) = framebuffer {
framebuffer.bind(target)
+ } else {
+ // Bind the default framebuffer
+ self.renderer.send(
+ CanvasMsg::WebGL(
+ CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Default))).unwrap()
}
}
@@ -213,6 +224,9 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
fn BindRenderbuffer(self, target: u32, renderbuffer: Option<&WebGLRenderbuffer>) {
if let Some(renderbuffer) = renderbuffer {
renderbuffer.bind(target)
+ } else {
+ // Unbind the currently bound renderbuffer
+ self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::BindRenderbuffer(target, 0))).unwrap()
}
}
@@ -225,7 +239,7 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
#[allow(unsafe_code)]
- fn BufferData(self, cx: *mut JSContext, target: u32, data: Option<*mut JSObject>, usage: u32) {
+ fn BufferData(self, _cx: *mut JSContext, target: u32, data: Option<*mut JSObject>, usage: u32) {
let data = match data {
Some(data) => data,
None => return,
@@ -447,7 +461,7 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
fn VertexAttribPointer(self, attrib_id: u32, size: i32, data_type: u32,
normalized: bool, stride: i32, offset: i64) {
match data_type {
- WebGLRenderingContextConstants::FLOAT => {
+ constants::FLOAT => {
let msg = CanvasMsg::WebGL(
CanvasWebGLMsg::VertexAttribPointer2f(attrib_id, size, normalized, stride, offset));
self.renderer.send(msg).unwrap()
diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs
index 5750046e8fc..e3c4389365b 100644
--- a/components/script/dom/webglshader.rs
+++ b/components/script/dom/webglshader.rs
@@ -69,7 +69,7 @@ pub trait WebGLShaderHelpers {
fn set_source(self, src: String);
}
-impl<'a> WebGLShaderHelpers for JSRef<'a, WebGLShader> {
+impl<'a> WebGLShaderHelpers for &'a WebGLShader {
fn id(self) -> u32 {
self.id
}
diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs
index 6848e3a7f71..111c0ab07c3 100644
--- a/components/script/dom/webgltexture.rs
+++ b/components/script/dom/webgltexture.rs
@@ -50,7 +50,7 @@ pub trait WebGLTextureHelpers {
}
impl<'a> WebGLTextureHelpers for &'a WebGLTexture {
- fn id(&self) -> u32 {
+ fn id(self) -> u32 {
self.id
}