From 89c43d202302ec20e0d3b31d7273fed848b9ee23 Mon Sep 17 00:00:00 2001 From: Nicolas Capens Date: Tue, 15 May 2018 16:31:10 -0400 Subject: [PATCH] Ignore glGenerateMipmap for unspecified or zero-sized textures. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit https://gitlab.khronos.org/opengl/API/issues/72 was resolved to treat these cases as a no-op and not generate an error. Bug chromium:825545 Change-Id: Ic4cfbc728156bb88a6dc70486ae57c3e12ea43ae Reviewed-on: https://swiftshader-review.googlesource.com/18870 Tested-by: Nicolas Capens Reviewed-by: Alexis Hétu --- src/OpenGL/libGLESv2/Texture.cpp | 35 +++++++++++++++++++++++++++++++---- src/OpenGL/libGLESv2/utilities.cpp | 5 +++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp index ec96373e6..82c68e4ff 100644 --- a/src/OpenGL/libGLESv2/Texture.cpp +++ b/src/OpenGL/libGLESv2/Texture.cpp @@ -769,7 +769,15 @@ bool Texture2D::isDepth(GLenum target, GLint level) const void Texture2D::generateMipmaps() { - ASSERT(image[mBaseLevel]); + if(!image[mBaseLevel]) + { + return; // Image unspecified. Not an error. + } + + if(image[mBaseLevel]->getWidth() == 0 || image[mBaseLevel]->getHeight() == 0) + { + return; // Zero dimension. Not an error. + } int maxsize = std::max(image[mBaseLevel]->getWidth(), image[mBaseLevel]->getHeight()); int p = log2(maxsize) + mBaseLevel; @@ -1321,7 +1329,10 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi void TextureCubeMap::generateMipmaps() { - ASSERT(isCubeComplete()); + if(!isCubeComplete()) + { + return error(GL_INVALID_OPERATION); + } int p = log2(image[0][mBaseLevel]->getWidth()) + mBaseLevel; int q = std::min(p, mMaxLevel); @@ -1739,7 +1750,15 @@ bool Texture3D::isDepth(GLenum target, GLint level) const void Texture3D::generateMipmaps() { - ASSERT(image[mBaseLevel]); + if(!image[mBaseLevel]) + { + return; // Image unspecified. Not an error. + } + + if(image[mBaseLevel]->getWidth() == 0 || image[mBaseLevel]->getHeight() == 0 || image[mBaseLevel]->getDepth() == 0) + { + return; // Zero dimension. Not an error. + } int maxsize = std::max(std::max(image[mBaseLevel]->getWidth(), image[mBaseLevel]->getHeight()), image[mBaseLevel]->getDepth()); int p = log2(maxsize) + mBaseLevel; @@ -1833,7 +1852,15 @@ GLenum Texture2DArray::getTarget() const void Texture2DArray::generateMipmaps() { - ASSERT(image[mBaseLevel]); + if(!image[mBaseLevel]) + { + return; // Image unspecified. Not an error. + } + + if(image[mBaseLevel]->getWidth() == 0 || image[mBaseLevel]->getHeight() == 0 || image[mBaseLevel]->getDepth() == 0) + { + return; // Zero dimension. Not an error. + } int depth = image[mBaseLevel]->getDepth(); int maxsize = std::max(image[mBaseLevel]->getWidth(), image[mBaseLevel]->getHeight()); diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp index fff4d7b74..b863f1dbe 100644 --- a/src/OpenGL/libGLESv2/utilities.cpp +++ b/src/OpenGL/libGLESv2/utilities.cpp @@ -1386,6 +1386,11 @@ namespace es2 bool IsMipmappable(GLint internalformat, GLint clientVersion) { + if(internalformat == GL_NONE) + { + return true; // Image unspecified. Not an error. + } + if(IsNonNormalizedInteger(internalformat)) { return false; -- 2.11.0