aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel <ddefisher@gmail.com>2016-05-25 14:57:34 -0400
committerDaniel <ddefisher@gmail.com>2016-05-29 17:08:10 -0400
commitc017438428acdb59d1b3127f0c3e249f2b2658b4 (patch)
treed48c30e2b9ce9e309d797cd2f3edc66091c9f2fd
parent2a2b88f42c55614f949f218b0444778e8e2bfc78 (diff)
downloadservo-c017438428acdb59d1b3127f0c3e249f2b2658b4.tar.gz
servo-c017438428acdb59d1b3127f0c3e249f2b2658b4.zip
Implement IsBuffer, IsFramebuffer and IsRenderbuffer for WebGLRenderingContext
-rw-r--r--components/script/dom/webglbuffer.rs8
-rw-r--r--components/script/dom/webglframebuffer.rs12
-rw-r--r--components/script/dom/webglrenderbuffer.rs11
-rw-r--r--components/script/dom/webglrenderingcontext.rs15
-rw-r--r--components/script/dom/webidls/WebGLRenderingContext.webidl6
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/more/conformance/quickCheckAPI-B2.html.ini2
6 files changed, 50 insertions, 4 deletions
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs
index 0fedc762f4c..66b287e347f 100644
--- a/components/script/dom/webglbuffer.rs
+++ b/components/script/dom/webglbuffer.rs
@@ -95,6 +95,14 @@ impl WebGLBuffer {
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteBuffer(self.id)));
}
}
+
+ pub fn is_deleted(&self) -> bool {
+ self.is_deleted.get()
+ }
+
+ pub fn target(&self) -> Option<u32> {
+ self.target.get()
+ }
}
impl Drop for WebGLBuffer {
diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs
index 9dc4d7c16be..8cdf2900214 100644
--- a/components/script/dom/webglframebuffer.rs
+++ b/components/script/dom/webglframebuffer.rs
@@ -17,6 +17,8 @@ use webrender_traits::{WebGLCommand, WebGLFramebufferBindingRequest};
pub struct WebGLFramebuffer {
webgl_object: WebGLObject,
id: u32,
+ /// target can only be gl::FRAMEBUFFER at the moment
+ target: Cell<Option<u32>>,
is_deleted: Cell<bool>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
renderer: IpcSender<CanvasMsg>,
@@ -27,6 +29,7 @@ impl WebGLFramebuffer {
WebGLFramebuffer {
webgl_object: WebGLObject::new_inherited(),
id: id,
+ target: Cell::new(None),
is_deleted: Cell::new(false),
renderer: renderer,
}
@@ -54,6 +57,7 @@ impl WebGLFramebuffer {
}
pub fn bind(&self, target: u32) {
+ self.target.set(Some(target));
let cmd = WebGLCommand::BindFramebuffer(target, WebGLFramebufferBindingRequest::Explicit(self.id));
self.renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
}
@@ -64,6 +68,14 @@ impl WebGLFramebuffer {
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteFramebuffer(self.id)));
}
}
+
+ pub fn is_deleted(&self) -> bool {
+ self.is_deleted.get()
+ }
+
+ pub fn target(&self) -> Option<u32> {
+ self.target.get()
+ }
}
impl Drop for WebGLFramebuffer {
diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs
index a63bd1c975a..dd4ef931661 100644
--- a/components/script/dom/webglrenderbuffer.rs
+++ b/components/script/dom/webglrenderbuffer.rs
@@ -17,6 +17,7 @@ use webrender_traits::WebGLCommand;
pub struct WebGLRenderbuffer {
webgl_object: WebGLObject,
id: u32,
+ ever_bound: Cell<bool>,
is_deleted: Cell<bool>,
#[ignore_heap_size_of = "Defined in ipc-channel"]
renderer: IpcSender<CanvasMsg>,
@@ -27,6 +28,7 @@ impl WebGLRenderbuffer {
WebGLRenderbuffer {
webgl_object: WebGLObject::new_inherited(),
id: id,
+ ever_bound: Cell::new(false),
is_deleted: Cell::new(false),
renderer: renderer,
}
@@ -54,6 +56,7 @@ impl WebGLRenderbuffer {
}
pub fn bind(&self, target: u32) {
+ self.ever_bound.set(true);
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, self.id))).unwrap();
}
@@ -63,4 +66,12 @@ impl WebGLRenderbuffer {
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteRenderbuffer(self.id)));
}
}
+
+ pub fn is_deleted(&self) -> bool {
+ self.is_deleted.get()
+ }
+
+ pub fn ever_bound(&self) -> bool {
+ self.ever_bound.get()
+ }
}
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 3e57bae5a6e..e4565f2d82a 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -1327,6 +1327,21 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
.unwrap()
}
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
+ fn IsBuffer(&self, buffer: Option<&WebGLBuffer>) -> bool {
+ buffer.map_or(false, |buf| buf.target().is_some() && !buf.is_deleted())
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6
+ fn IsFramebuffer(&self, frame_buffer: Option<&WebGLFramebuffer>) -> bool {
+ frame_buffer.map_or(false, |buf| buf.target().is_some() && !buf.is_deleted())
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7
+ fn IsRenderbuffer(&self, render_buffer: Option<&WebGLRenderbuffer>) -> bool {
+ render_buffer.map_or(false, |buf| buf.ever_bound() && !buf.is_deleted())
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn IsShader(&self, shader: Option<&WebGLShader>) -> bool {
shader.map_or(false, |s| !s.is_deleted() || s.is_attached())
diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl
index b534c2aeb61..3ed1c8cdb31 100644
--- a/components/script/dom/webidls/WebGLRenderingContext.webidl
+++ b/components/script/dom/webidls/WebGLRenderingContext.webidl
@@ -602,11 +602,11 @@ interface WebGLRenderingContextBase
//[WebGLHandlesContextLoss] GLsizeiptr getVertexAttribOffset(GLuint index, GLenum pname);
void hint(GLenum target, GLenum mode);
- //[WebGLHandlesContextLoss] GLboolean isBuffer(WebGLBuffer? buffer);
+ [WebGLHandlesContextLoss] GLboolean isBuffer(WebGLBuffer? buffer);
//[WebGLHandlesContextLoss] GLboolean isEnabled(GLenum cap);
- //[WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer);
+ [WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer);
//[WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program);
- //[WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer);
+ [WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer);
[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader);
[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture);
void lineWidth(GLfloat width);
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/more/conformance/quickCheckAPI-B2.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/more/conformance/quickCheckAPI-B2.html.ini
index 59b78ea14bd..87e009d770f 100644
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/more/conformance/quickCheckAPI-B2.html.ini
+++ b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/more/conformance/quickCheckAPI-B2.html.ini
@@ -1,5 +1,5 @@
[quickCheckAPI-B2.html]
type: testharness
[WebGL test #0: testValidArgs]
- expected: FAIL
+ expected: PASS