aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-05-10 03:16:20 -0700
committerbors-servo <lbergstrom+bors@mozilla.com>2016-05-10 03:16:20 -0700
commitf45a99c9fe5a4b05dd0d27f129d53ed1f75ea8ff (patch)
treef94b9f09c72b39a1b9d13db1efa7dcbff2a467a0 /components/script/dom
parentf60598909a8ffd69fe1d87ee92aa94f1a26ef12e (diff)
parent8a5b0b897212b82b5d38d565355f2fdacd1bbe88 (diff)
downloadservo-f45a99c9fe5a4b05dd0d27f129d53ed1f75ea8ff.tar.gz
servo-f45a99c9fe5a4b05dd0d27f129d53ed1f75ea8ff.zip
Auto merge of #11072 - DDEFISHER:master, r=emilio
Implement IsShader fn and IsTexture fn for WebGLRenderingContext fixes #11064 <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/11072) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/webglprogram.rs10
-rw-r--r--components/script/dom/webglrenderingcontext.rs10
-rw-r--r--components/script/dom/webglshader.rs21
-rw-r--r--components/script/dom/webgltexture.rs8
-rw-r--r--components/script/dom/webidls/WebGLRenderingContext.webidl4
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);