Fix mipmap generation on undefined cube texture

Cube textures must be cube complete to generate mipmaps, but when the
base level is undefined the glGenerateMipmap command must be silently
ignored. This was previously leading to a null dereference.

Bug chromium:924022
Bug https://gitlab.khronos.org/opengl/API/issues/72

Change-Id: I5d6e8533118e554efa12045fc376126c7b00f263
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/27491
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index a58563e..86ebabb 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -2108,35 +2108,11 @@
 
 	if(context)
 	{
-		es2::Texture *texture = nullptr;
+		es2::Texture *texture = context->getTargetTexture(target);
 
-		switch(target)
+		if(!texture)
 		{
-		case GL_TEXTURE_2D:
-			texture = context->getTexture2D();
-			break;
-		case GL_TEXTURE_CUBE_MAP:
-			{
-				TextureCubeMap *cube = context->getTextureCubeMap();
-				texture = cube;
-
-				if(!cube->isCubeComplete())
-				{
-					return error(GL_INVALID_OPERATION);
-				}
-			}
-			break;
-		case GL_TEXTURE_2D_ARRAY:
-			texture = context->getTexture2DArray();
-			break;
-		case GL_TEXTURE_3D:
-			texture = context->getTexture3D();
-			break;
-		case GL_TEXTURE_RECTANGLE_ARB:
-			texture = context->getTexture2DRect();
-			break;
-		default:
-			return error(GL_INVALID_ENUM);
+			return;
 		}
 
 		if(!IsMipmappable(texture->getFormat(target, texture->getBaseLevel())))
@@ -2144,6 +2120,23 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
+		if(target == GL_TEXTURE_CUBE_MAP)
+		{
+			TextureCubeMap *cube = context->getTextureCubeMap();
+
+			if(!cube->isCubeComplete())
+			{
+				return error(GL_INVALID_OPERATION);
+			}
+		}
+
+		// [OpenGL ES 3.2]: "Otherwise, if levelbase is not defined, or if any dimension
+		// is zero, all mipmap levels are left unchanged. This is not an error."
+		if(!texture->isBaseLevelDefined())
+		{
+			return;
+		}
+
 		texture->generateMipmaps();
 	}
 }
@@ -3296,18 +3289,11 @@
 
 	if(context)
 	{
-		es2::Texture *texture;
+		es2::Texture *texture = context->getTargetTexture(target);
 
-		switch(target)
+		if(!texture)
 		{
-		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
-		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
-		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
-		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
-		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
-		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
-		default:
-			return error(GL_INVALID_ENUM);
+			return;
 		}
 
 		switch(pname)
@@ -3383,18 +3369,11 @@
 
 	if(context)
 	{
-		es2::Texture *texture;
+		es2::Texture *texture = context->getTargetTexture(target);
 
-		switch(target)
+		if(!texture)
 		{
-		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
-		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
-		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
-		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
-		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
-		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
-		default:
-			return error(GL_INVALID_ENUM);
+			return;
 		}
 
 		switch(pname)
@@ -4655,18 +4634,11 @@
 
 	if(context)
 	{
-		es2::Texture *texture;
+		es2::Texture *texture = context->getTargetTexture(target);
 
-		switch(target)
+		if(!texture)
 		{
-		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
-		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
-		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
-		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
-		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
-		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
-		default:
-			return error(GL_INVALID_ENUM);
+			return;
 		}
 
 		switch(pname)
@@ -4786,18 +4758,11 @@
 
 	if(context)
 	{
-		es2::Texture *texture;
+		es2::Texture *texture = context->getTargetTexture(target);
 
-		switch(target)
+		if(!texture)
 		{
-		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
-		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
-		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
-		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
-		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
-		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
-		default:
-			return error(GL_INVALID_ENUM);
+			return;
 		}
 
 		switch(pname)