Ignore glGenerateMipmap for unspecified or zero-sized textures.

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 <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index ec96373..82c68e4 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -769,7 +769,15 @@
 
 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::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 @@
 
 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 @@
 
 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 fff4d7b..b863f1d 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1386,6 +1386,11 @@
 
 	bool IsMipmappable(GLint internalformat, GLint clientVersion)
 	{
+		if(internalformat == GL_NONE)
+		{
+			return true;   // Image unspecified. Not an error.
+		}
+
 		if(IsNonNormalizedInteger(internalformat))
 		{
 			return false;