diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-04 14:17:10 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-01-13 15:28:36 +0100 |
commit | 4092ffd245c51704faec97e6da70577fd92d1f94 (patch) | |
tree | 6054d28a33f8c951582a2bd914bf1b537a2d5528 | |
parent | cf479a2b4fd07abf73237fbd365e229787bf6630 (diff) | |
download | servo-4092ffd245c51704faec97e6da70577fd92d1f94.tar.gz servo-4092ffd245c51704faec97e6da70577fd92d1f94.zip |
webgl: Check shader compilation status on use_program.
-rw-r--r-- | components/script/dom/webglprogram.rs | 13 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 6 | ||||
-rw-r--r-- | components/script/dom/webglshader.rs | 4 |
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 { |