Fix up some validation bugs in Texture functions.

In several places we weren't handling certain errors, or were
returning the wrong error code. Several dEQP negative API
tests are affected in functional.negative_api.texture.

BUG=angle:571

Change-Id: I19d7250aab2c15d709fd591b8df90ce883f9ac60
Reviewed-on: https://chromium-review.googlesource.com/201250
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/validationES.cpp b/src/libGLESv2/validationES.cpp
index c516eb4..86d518d 100644
--- a/src/libGLESv2/validationES.cpp
+++ b/src/libGLESv2/validationES.cpp
@@ -1147,6 +1147,7 @@
     GLint textureLevelWidth = 0;
     GLint textureLevelHeight = 0;
     GLint textureLevelDepth = 0;
+    int maxDimension = 0;
 
     switch (target)
     {
@@ -1162,6 +1163,7 @@
                 textureLevelHeight = texture2d->getHeight(level);
                 textureLevelDepth = 1;
                 texture = texture2d;
+                maxDimension = context->getMaximum2DTextureDimension();
             }
         }
         break;
@@ -1183,6 +1185,7 @@
                 textureLevelHeight = textureCube->getHeight(target, level);
                 textureLevelDepth = 1;
                 texture = textureCube;
+                maxDimension = context->getMaximumCubeTextureDimension();
             }
         }
         break;
@@ -1199,6 +1202,7 @@
                 textureLevelHeight = texture2dArray->getHeight(level);
                 textureLevelDepth = texture2dArray->getLayers(level);
                 texture = texture2dArray;
+                maxDimension = context->getMaximum2DTextureDimension();
             }
         }
         break;
@@ -1215,6 +1219,7 @@
                 textureLevelHeight = texture3d->getHeight(level);
                 textureLevelDepth = texture3d->getDepth(level);
                 texture = texture3d;
+                maxDimension = context->getMaximum3DTextureDimension();
             }
         }
         break;
@@ -1260,6 +1265,24 @@
             return gl::error(GL_INVALID_VALUE, false);
         }
     }
+    else
+    {
+        if (IsCubemapTextureTarget(target) && width != height)
+        {
+            return gl::error(GL_INVALID_VALUE, false);
+        }
+
+        if (!IsValidInternalFormat(internalformat, context))
+        {
+            return gl::error(GL_INVALID_ENUM, false);
+        }
+
+        int maxLevelDimension = (maxDimension >> level);
+        if (static_cast<int>(width) > maxLevelDimension || static_cast<int>(height) > maxLevelDimension)
+        {
+            return gl::error(GL_INVALID_VALUE, false);
+        }
+    }
 
     *textureFormatOut = textureInternalFormat;
     return true;