diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index e717d60..cfd17a9 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -4249,7 +4249,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
+	GLint sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
 
 	es1::Context *context = es1::getContext();
 
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 4be0273..56b2d06 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -925,7 +925,7 @@
 			{
 				return error(GL_INVALID_VALUE);
 			}
-			// Fall through
+			// Fall through to GL_TEXTURE_2D case.
 		case GL_TEXTURE_2D:
 			if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
 			   height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
@@ -3463,24 +3463,24 @@
 	case GL_RENDERER:
 		return (GLubyte*)"Google SwiftShader";
 	case GL_VERSION:
-	{
-		es2::Context *context = es2::getContext();
-		return (context && (context->getClientVersion() >= 3)) ?
-		       (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING :
-		       (GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING;
-	}
+		{
+			es2::Context *context = es2::getContext();
+			return (context && (context->getClientVersion() >= 3)) ?
+			       (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING :
+			       (GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING;
+		}
 	case GL_SHADING_LANGUAGE_VERSION:
-	{
-		es2::Context *context = es2::getContext();
-		return (context && (context->getClientVersion() >= 3)) ?
-		       (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING :
-		       (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;
-	}
+		{
+			es2::Context *context = es2::getContext();
+			return (context && (context->getClientVersion() >= 3)) ?
+			       (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING :
+			       (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;
+		}
 	case GL_EXTENSIONS:
-	{
-		es2::Context *context = es2::getContext();
-		return context ? context->getExtensions(GL_INVALID_INDEX) : (GLubyte*)nullptr;
-	}
+		{
+			es2::Context *context = es2::getContext();
+			return context ? context->getExtensions(GL_INVALID_INDEX) : (GLubyte*)nullptr;
+		}
 	default:
 		return error(GL_INVALID_ENUM, (GLubyte*)nullptr);
 	}
@@ -4971,7 +4971,7 @@
 			}
 		}
 
-		GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, context->getClientVersion());
+		GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, clientVersion);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -4989,7 +4989,7 @@
 			{
 				return error(GL_INVALID_VALUE); // Defining level other than 0 is not allowed
 			}
-			// Fall through
+			// Fall through to GL_TEXTURE_2D case.
 		case GL_TEXTURE_2D:
 			if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
 			   height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
@@ -5018,14 +5018,14 @@
 			return error(GL_INVALID_ENUM);
 		}
 
-		GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
-
 		validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, 1, format, type));
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
 		}
 
+		GLint sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
+
 		if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
 		{
 			es2::Texture2D *texture = context->getTexture2D(target);
@@ -6267,7 +6267,7 @@
 			return error(validationError);
 		}
 
-		GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
+		GLint sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
 		texture->setImage(level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackParameters(), data);
 	}
 }
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index f5f3264..a985793 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -264,18 +264,18 @@
 		case GL_COLOR_ATTACHMENT29:
 		case GL_COLOR_ATTACHMENT30:
 		case GL_COLOR_ATTACHMENT31:
-		{
-			GLuint index = (src - GL_COLOR_ATTACHMENT0);
-			if(index >= MAX_COLOR_ATTACHMENTS)
 			{
-				return error(GL_INVALID_OPERATION);
+				GLuint index = (src - GL_COLOR_ATTACHMENT0);
+				if(index >= MAX_COLOR_ATTACHMENTS)
+				{
+					return error(GL_INVALID_OPERATION);
+				}
+				if(readFramebufferName == 0)
+				{
+					return error(GL_INVALID_OPERATION);
+				}
+				context->setFramebufferReadBuffer(src);
 			}
-			if(readFramebufferName == 0)
-			{
-				return error(GL_INVALID_OPERATION);
-			}
-			context->setFramebufferReadBuffer(src);
-		}
 			break;
 		default:
 			return error(GL_INVALID_ENUM);
@@ -387,7 +387,7 @@
 			return error(validationError);
 		}
 
-		GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
+		GLint sizedInternalFormat = gl::GetSizedInternalFormat(internalformat, type);
 		texture->setImage(level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackParameters(), data);
 	}
 }
@@ -3621,6 +3621,7 @@
 			{
 				return error(GL_INVALID_ENUM);
 			}
+			// Fall through to GL_TEXTURE_2D case.
 		case GL_TEXTURE_2D:
 			{
 				if((width > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE) ||
@@ -3735,10 +3736,8 @@
 
 				for(int level = 0; level < levels; level++)
 				{
-					for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
-					{
-						texture->setImage(level, width, height, depth, internalformat, GL_NONE, GL_NONE, context->getUnpackParameters(), nullptr);
-					}
+					texture->setImage(level, width, height, depth, internalformat, GL_NONE, GL_NONE, context->getUnpackParameters(), nullptr);
+
 					width = std::max(1, (width / 2));
 					height = std::max(1, (height / 2));
 				}
