Texture rectangle related fixes and associated tests

Imported texture rectangle tests from angle and fixed all
texture rectangle related failures:
- Rectangle textures can be rendered to
- Rectangle textures only support level 0
- Rectangle textures can't be compressed
- glTexStorage2D can no longer create a texture larger
  than the maximum size allowed

Change-Id: I089291c94aad79e244782a8d56dd224c7510d237
Reviewed-on: https://swiftshader-review.googlesource.com/16908
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 5006161..a13000e 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -3594,7 +3594,7 @@
 	TRACE("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
 	      target, levels, internalformat, width, height);
 
-	if(width < 1 || height < 1 || levels < 1)
+	if(width < 1 || height < 1 || levels < 1 || ((target == GL_TEXTURE_RECTANGLE_ARB) && (levels != 1)))
 	{
 		return error(GL_INVALID_VALUE);
 	}
@@ -3604,7 +3604,8 @@
 		return error(GL_INVALID_OPERATION);
 	}
 
-	if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat, egl::getClientVersion()))
+	bool isCompressed = IsCompressed(internalformat, egl::getClientVersion());
+	if(!IsSizedInternalFormat(internalformat) && !isCompressed)
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -3615,9 +3616,19 @@
 	{
 		switch(target)
 		{
-		case GL_TEXTURE_2D:
 		case GL_TEXTURE_RECTANGLE_ARB:
+			if(isCompressed) // Rectangle textures cannot be compressed
 			{
+				return error(GL_INVALID_ENUM);
+			}
+		case GL_TEXTURE_2D:
+			{
+				if((width > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE) ||
+				   (height > es2::IMPLEMENTATION_MAX_TEXTURE_SIZE))
+				{
+					return error(GL_INVALID_VALUE);
+				}
+
 				es2::Texture2D *texture = context->getTexture2D(target);
 				if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
 				{
@@ -3635,6 +3646,12 @@
 			break;
 		case GL_TEXTURE_CUBE_MAP:
 			{
+				if((width > es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE) ||
+				   (height > es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE))
+				{
+					return error(GL_INVALID_VALUE);
+				}
+
 				es2::TextureCubeMap *texture = context->getTextureCubeMap();
 				if(!texture || texture->name == 0 || texture->getImmutableFormat())
 				{