diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/webglprogram.rs | 10 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 10 | ||||
-rw-r--r-- | components/script/dom/webglshader.rs | 21 | ||||
-rw-r--r-- | components/script/dom/webgltexture.rs | 8 | ||||
-rw-r--r-- | components/script/dom/webidls/WebGLRenderingContext.webidl | 4 |
5 files changed, 51 insertions, 2 deletions
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 6cc122cf459..504a13ec339 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -68,6 +68,14 @@ impl WebGLProgram { if !self.is_deleted.get() { self.is_deleted.set(true); let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteProgram(self.id))); + + if let Some(shader) = self.fragment_shader.get() { + shader.decrement_attached_counter(); + } + + if let Some(shader) = self.vertex_shader.get() { + shader.decrement_attached_counter(); + } } } @@ -118,6 +126,7 @@ impl WebGLProgram { } shader_slot.set(Some(shader)); + shader.increment_attached_counter(); self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap(); @@ -144,6 +153,7 @@ impl WebGLProgram { } shader_slot.set(None); + shader.decrement_attached_counter(); self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap(); diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 36a8a4bb3b2..70b98ce06cd 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -1157,6 +1157,16 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { .unwrap() } + // 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()) + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn IsTexture(&self, texture: Option<&WebGLTexture>) -> bool { + texture.map_or(false, |tex| tex.target().is_some() && !tex.is_deleted()) + } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn LineWidth(&self, width: f32) { if width.is_nan() || width <= 0f32 { diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index eb930a69f13..c166fbcf46d 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -32,6 +32,7 @@ pub struct WebGLShader { source: DOMRefCell<Option<DOMString>>, info_log: DOMRefCell<Option<String>>, is_deleted: Cell<bool>, + attached_counter: Cell<u32>, compilation_status: Cell<ShaderCompilationStatus>, #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, @@ -55,6 +56,7 @@ impl WebGLShader { source: DOMRefCell::new(None), info_log: DOMRefCell::new(None), is_deleted: Cell::new(false), + attached_counter: Cell::new(0), compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled), renderer: renderer, } @@ -126,6 +128,7 @@ impl WebGLShader { /// Mark this shader as deleted (if it wasn't previously) /// and delete it as if calling glDeleteShader. + /// Currently does not check if shader is attached pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); @@ -133,6 +136,23 @@ impl WebGLShader { } } + pub fn is_deleted(&self) -> bool { + self.is_deleted.get() + } + + pub fn is_attached(&self) -> bool { + self.attached_counter.get() > 0 + } + + pub fn increment_attached_counter(&self) { + self.attached_counter.set(self.attached_counter.get() + 1); + } + + pub fn decrement_attached_counter(&self) { + assert!(self.attached_counter.get() > 0); + self.attached_counter.set(self.attached_counter.get() - 1); + } + /// glGetShaderInfoLog pub fn info_log(&self) -> Option<String> { self.info_log.borrow().clone() @@ -162,6 +182,7 @@ impl WebGLShader { impl Drop for WebGLShader { fn drop(&mut self) { + assert!(self.attached_counter.get() == 0); self.delete(); } } diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index e92435ce304..df636a1db59 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -176,6 +176,14 @@ impl WebGLTexture { } } + pub fn is_deleted(&self) -> bool { + self.is_deleted.get() + } + + pub fn target(&self) -> Option<u32> { + self.target.get() + } + /// We have to follow the conversion rules for GLES 2.0. See: /// https://www.khronos.org/webgl/public-mailing-list/archives/1008/msg00014.html /// diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl index 4b29660b190..f46da97fd65 100644 --- a/components/script/dom/webidls/WebGLRenderingContext.webidl +++ b/components/script/dom/webidls/WebGLRenderingContext.webidl @@ -605,8 +605,8 @@ interface WebGLRenderingContextBase //[WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer); //[WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program); //[WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer); - //[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader); - //[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture); + [WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader); + [WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture); void lineWidth(GLfloat width); void linkProgram(WebGLProgram? program); void pixelStorei(GLenum pname, GLint param); |