diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-22 11:25:29 -0700 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-22 11:25:29 -0700 |
commit | f1defb446e8cd4e36231acae77f11c72c74964b0 (patch) | |
tree | fdf0d92dbc5d74c5c2efad7ebfaa504408a68489 /components/script/dom/webglprogram.rs | |
parent | d926b5d3762a101d5280266f806f2b979f73b695 (diff) | |
parent | 9fff9d45d1108fcb2a594feb091e0f64d2cab7e4 (diff) | |
download | servo-f1defb446e8cd4e36231acae77f11c72c74964b0.tar.gz servo-f1defb446e8cd4e36231acae77f11c72c74964b0.zip |
Auto merge of #10443 - emilio:webgl-teximage2d-overload, r=jdm
webgl: Implement the pending texImage2D overload, and add more validation
This is a large-ish refactor of the Texture2D code, but it should be
easier to read and of course more correct.
I tried to annotate every error condition with a spec paragraph.
I made just a reftest to ensure this works as intended, since I expect #10373 to land pretty soon.
<!-- 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/10443)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/webglprogram.rs')
-rw-r--r-- | components/script/dom/webglprogram.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 0458e2ae2ca..6cc122cf459 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -23,6 +23,7 @@ pub struct WebGLProgram { webgl_object: WebGLObject, id: u32, is_deleted: Cell<bool>, + linked: Cell<bool>, fragment_shader: MutNullableHeap<JS<WebGLShader>>, vertex_shader: MutNullableHeap<JS<WebGLShader>>, #[ignore_heap_size_of = "Defined in ipc-channel"] @@ -35,6 +36,7 @@ impl WebGLProgram { webgl_object: WebGLObject::new_inherited(), id: id, is_deleted: Cell::new(false), + linked: Cell::new(false), fragment_shader: Default::default(), vertex_shader: Default::default(), renderer: renderer, @@ -71,19 +73,27 @@ impl WebGLProgram { /// glLinkProgram pub fn link(&self) { - self.renderer.send(CanvasMsg::WebGL(WebGLCommand::LinkProgram(self.id))).unwrap(); - } + self.linked.set(false); - /// glUseProgram - pub fn use_program(&self) -> WebGLResult<()> { match self.fragment_shader.get() { Some(ref shader) if shader.successfully_compiled() => {}, - _ => return Err(WebGLError::InvalidOperation), + _ => return, } match self.vertex_shader.get() { Some(ref shader) if shader.successfully_compiled() => {}, - _ => return Err(WebGLError::InvalidOperation), + _ => return, + } + + self.linked.set(true); + + self.renderer.send(CanvasMsg::WebGL(WebGLCommand::LinkProgram(self.id))).unwrap(); + } + + /// glUseProgram + pub fn use_program(&self) -> WebGLResult<()> { + if !self.linked.get() { + return Err(WebGLError::InvalidOperation); } self.renderer.send(CanvasMsg::WebGL(WebGLCommand::UseProgram(self.id))).unwrap(); |