aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <ecoal95@gmail.com>2016-01-04 14:17:10 +0100
committerEmilio Cobos Álvarez <ecoal95@gmail.com>2016-01-13 15:28:36 +0100
commit4092ffd245c51704faec97e6da70577fd92d1f94 (patch)
tree6054d28a33f8c951582a2bd914bf1b537a2d5528
parentcf479a2b4fd07abf73237fbd365e229787bf6630 (diff)
downloadservo-4092ffd245c51704faec97e6da70577fd92d1f94.tar.gz
servo-4092ffd245c51704faec97e6da70577fd92d1f94.zip
webgl: Check shader compilation status on use_program.
-rw-r--r--components/script/dom/webglprogram.rs13
-rw-r--r--components/script/dom/webglrenderingcontext.rs6
-rw-r--r--components/script/dom/webglshader.rs4
3 files changed, 20 insertions, 3 deletions
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs
index 272eeae72aa..42eb0a23581 100644
--- a/components/script/dom/webglprogram.rs
+++ b/components/script/dom/webglprogram.rs
@@ -73,8 +73,19 @@ impl WebGLProgram {
}
/// glUseProgram
- pub fn use_program(&self) {
+ pub fn use_program(&self) -> WebGLResult<()> {
+ match self.fragment_shader.get() {
+ Some(ref shader) if shader.successfully_compiled() => {},
+ _ => return Err(WebGLError::InvalidOperation),
+ }
+
+ match self.vertex_shader.get() {
+ Some(ref shader) if shader.successfully_compiled() => {},
+ _ => return Err(WebGLError::InvalidOperation),
+ }
+
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::UseProgram(self.id))).unwrap();
+ Ok(())
}
/// glAttachShader
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index b8feeb9b93c..2d51fc5c64d 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -1004,8 +1004,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn UseProgram(&self, program: Option<&WebGLProgram>) {
if let Some(program) = program {
- program.use_program();
- self.current_program.set(Some(program));
+ match program.use_program() {
+ Ok(()) => self.current_program.set(Some(program)),
+ Err(e) => self.webgl_error(e),
+ }
}
}
diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs
index 9fd35610a37..9c4548f1675 100644
--- a/components/script/dom/webglshader.rs
+++ b/components/script/dom/webglshader.rs
@@ -147,6 +147,10 @@ impl WebGLShader {
pub fn set_source(&self, source: DOMString) {
*self.source.borrow_mut() = Some(source);
}
+
+ pub fn successfully_compiled(&self) -> bool {
+ self.compilation_status.get() == ShaderCompilationStatus::Succeeded
+ }
}
impl Drop for WebGLShader {