Refactor Texture to track image information for size and format queries.

BUG=angle:681

Change-Id: Ifb3f52d6348e4479181e66f1c39578f49e9dcf76
Reviewed-on: https://chromium-review.googlesource.com/235613
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 9db35c8..51b8d9a 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1230,28 +1230,11 @@
 
     const gl::Caps &caps = context->getCaps();
 
-    gl::Texture *texture = NULL;
-    GLenum textureInternalFormat = GL_NONE;
-    GLint textureLevelWidth = 0;
-    GLint textureLevelHeight = 0;
-    GLint textureLevelDepth = 0;
     GLuint maxDimension = 0;
-
     switch (target)
     {
       case GL_TEXTURE_2D:
-        {
-            gl::Texture2D *texture2d = context->getTexture2D();
-            if (texture2d)
-            {
-                textureInternalFormat = texture2d->getInternalFormat(level);
-                textureLevelWidth = texture2d->getWidth(level);
-                textureLevelHeight = texture2d->getHeight(level);
-                textureLevelDepth = 1;
-                texture = texture2d;
-                maxDimension = caps.max2DTextureSize;
-            }
-        }
+        maxDimension = caps.max2DTextureSize;
         break;
 
       case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
@@ -1260,48 +1243,15 @@
       case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
       case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
       case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
-        {
-            gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
-            if (textureCube)
-            {
-                textureInternalFormat = textureCube->getInternalFormat(target, level);
-                textureLevelWidth = textureCube->getWidth(target, level);
-                textureLevelHeight = textureCube->getHeight(target, level);
-                textureLevelDepth = 1;
-                texture = textureCube;
-                maxDimension = caps.maxCubeMapTextureSize;
-            }
-        }
+        maxDimension = caps.maxCubeMapTextureSize;
         break;
 
       case GL_TEXTURE_2D_ARRAY:
-        {
-            gl::Texture2DArray *texture2dArray = context->getTexture2DArray();
-            if (texture2dArray)
-            {
-                textureInternalFormat = texture2dArray->getInternalFormat(level);
-                textureLevelWidth = texture2dArray->getWidth(level);
-                textureLevelHeight = texture2dArray->getHeight(level);
-                textureLevelDepth = texture2dArray->getLayers(level);
-                texture = texture2dArray;
-                maxDimension = caps.max2DTextureSize;
-            }
-        }
+        maxDimension = caps.max2DTextureSize;
         break;
 
       case GL_TEXTURE_3D:
-        {
-            gl::Texture3D *texture3d = context->getTexture3D();
-            if (texture3d)
-            {
-                textureInternalFormat = texture3d->getInternalFormat(level);
-                textureLevelWidth = texture3d->getWidth(level);
-                textureLevelHeight = texture3d->getHeight(level);
-                textureLevelDepth = texture3d->getDepth(level);
-                texture = texture3d;
-                maxDimension = caps.max3DTextureSize;
-            }
-        }
+        maxDimension = caps.max3DTextureSize;
         break;
 
       default:
@@ -1309,6 +1259,7 @@
         return false;
     }
 
+    gl::Texture *texture = context->getTargetTexture(IsCubemapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
     if (!texture)
     {
         context->recordError(Error(GL_INVALID_OPERATION));
@@ -1329,21 +1280,17 @@
         return false;
     }
 
-    if (formatInfo.compressed)
+    if (formatInfo.compressed && !ValidCompressedImageSize(context, internalformat, width, height))
     {
-        if (((width % formatInfo.compressedBlockWidth) != 0 && width != textureLevelWidth) ||
-            ((height % formatInfo.compressedBlockHeight) != 0 && height != textureLevelHeight))
-        {
-            context->recordError(Error(GL_INVALID_OPERATION));
-            return false;
-        }
+        context->recordError(Error(GL_INVALID_OPERATION));
+        return false;
     }
 
     if (isSubImage)
     {
-        if (xoffset + width > textureLevelWidth ||
-            yoffset + height > textureLevelHeight ||
-            zoffset >= textureLevelDepth)
+        if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
+            static_cast<size_t>(yoffset + height) > texture->getHeight(target, level) ||
+            static_cast<size_t>(zoffset) >= texture->getDepth(target, level))
         {
             context->recordError(Error(GL_INVALID_VALUE));
             return false;
@@ -1371,7 +1318,7 @@
         }
     }
 
-    *textureFormatOut = textureInternalFormat;
+    *textureFormatOut = texture->getInternalFormat(target, level);
     return true;
 }
 
@@ -1786,12 +1733,6 @@
                     context->recordError(Error(GL_INVALID_OPERATION));
                     return false;
                 }
-                gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
-                if (tex2d->isCompressed(level))
-                {
-                    context->recordError(Error(GL_INVALID_OPERATION));
-                    return false;
-                }
             }
             break;
 
@@ -1812,12 +1753,6 @@
                     context->recordError(Error(GL_INVALID_OPERATION));
                     return false;
                 }
-                gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
-                if (texcube->isCompressed(textarget, level))
-                {
-                    context->recordError(Error(GL_INVALID_OPERATION));
-                    return false;
-                }
             }
             break;
 
@@ -1825,6 +1760,13 @@
             context->recordError(Error(GL_INVALID_ENUM));
             return false;
         }
+
+        const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(tex->getInternalFormat(textarget, level));
+        if (internalFormatInfo.compressed)
+        {
+            context->recordError(Error(GL_INVALID_OPERATION));
+            return false;
+        }
     }
 
     return true;