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 {