From c807cab3001b1676a8f9c47811629f621027e8b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 19 Apr 2016 13:09:06 +0200 Subject: [PATCH] webgl: Validate that the texture should be power of two if the level is greater than 1 --- components/script/dom/webglrenderingcontext.rs | 18 ++++++++++++++---- components/script/dom/webgltexture.rs | 4 ++++ 2 files changed, 18 insertions(+), 4 deletions(-) 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() {