diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 710b61fc162..408558d3031 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -304,10 +304,13 @@ impl WebGLRenderingContext { // If an attempt is made to call this function with no // WebGLTexture bound, an INVALID_OPERATION error is generated. - if texture.is_none() { - self.webgl_error(InvalidOperation); - return false; - } + let texture = match texture { + Some(texture) => texture, + None => { + self.webgl_error(InvalidOperation); + return false; + } + }; // GL_INVALID_ENUM is generated if data_type is not an accepted value. match data_type { @@ -372,6 +375,13 @@ impl WebGLRenderingContext { return false; } + // GL_INVALID_VALUE is generated if level is greater than zero and the + // texture and the texture is not power of two. + if level > 0 && !texture.is_power_of_two() { + self.webgl_error(InvalidValue); + return false; + } + // GL_INVALID_VALUE is generated if border is not 0. if border != 0 { self.webgl_error(InvalidValue); diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index 5bb7d5ff734..f39fa9b5789 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -227,6 +227,10 @@ impl WebGLTexture { } } + pub fn is_power_of_two(&self) -> bool { + self.image_info_at_face(0, 0).is_power_of_two() + } + pub fn populate_mip_chain(&self, first_level: u32, last_level: u32) -> WebGLResult<()> { let base_image_info = self.image_info_at_face(0, first_level); if !base_image_info.is_initialized() {