diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/webglbuffer.rs | 8 | ||||
-rw-r--r-- | components/script/dom/webglframebuffer.rs | 12 | ||||
-rw-r--r-- | components/script/dom/webglrenderbuffer.rs | 11 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 15 | ||||
-rw-r--r-- | components/script/dom/webidls/WebGLRenderingContext.webidl | 6 |
5 files changed, 49 insertions, 3 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 93522addf35..06c0095b1c9 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 540523323ac..70379e772d2 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -1331,6 +1331,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); |