Refactor CopyTexImage validation.

Move the common validation code to a shared base function.

BUG=angle:571

Change-Id: Id70b413b408a21f0a8933cfd4a09e261e637bae1
Reviewed-on: https://chromium-review.googlesource.com/200559
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/validationES2.cpp b/src/libGLESv2/validationES2.cpp
index 428d138..c76e271 100644
--- a/src/libGLESv2/validationES2.cpp
+++ b/src/libGLESv2/validationES2.cpp
@@ -457,122 +457,17 @@
                                        GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height,
                                        GLint border)
 {
-    if (!ValidTexture2DDestinationTarget(context, target))
-    {
-        return gl::error(GL_INVALID_ENUM, false);
-    }
+    GLenum textureInternalFormat = GL_NONE;
 
-    if (!gl::IsInternalTextureTarget(target, context->getClientVersion()))
+    if (!ValidateCopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
+                                            xoffset, yoffset, 0, x, y, width, height, border, &textureInternalFormat))
     {
-        return gl::error(GL_INVALID_ENUM, false);
-    }
-
-    if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
-    {
-        return gl::error(GL_INVALID_VALUE, false);
-    }
-
-    if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
-    {
-        return gl::error(GL_INVALID_VALUE, false);
-    }
-
-    // Verify zero border
-    if (border != 0)
-    {
-        return gl::error(GL_INVALID_VALUE, false);
-    }
-
-    // Validate dimensions based on Context limits and validate the texture
-    if (!ValidMipLevel(context, target, level))
-    {
-        return gl::error(GL_INVALID_VALUE, false);
+        return false;
     }
 
     gl::Framebuffer *framebuffer = context->getReadFramebuffer();
-
-    if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
-    {
-        return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
-    }
-
-    if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
-    {
-        return gl::error(GL_INVALID_OPERATION, false);
-    }
-
     GLenum colorbufferFormat = framebuffer->getReadColorbuffer()->getInternalFormat();
-    gl::Texture *texture = NULL;
-    GLenum textureFormat = GL_RGBA;
-
-    switch (target)
-    {
-      case GL_TEXTURE_2D:
-        {
-            if (width > (context->getMaximum2DTextureDimension() >> level) ||
-                height > (context->getMaximum2DTextureDimension() >> level))
-            {
-                return gl::error(GL_INVALID_VALUE, false);
-            }
-
-            gl::Texture2D *tex2d = context->getTexture2D();
-            if (tex2d)
-            {
-                if (isSubImage && !validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
-                {
-                    return false; // error already registered by validateSubImageParams
-                }
-                texture = tex2d;
-                textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
-            }
-        }
-        break;
-
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
-      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
-        {
-            if (!isSubImage && width != height)
-            {
-                return gl::error(GL_INVALID_VALUE, false);
-            }
-
-            if (width > (context->getMaximumCubeTextureDimension() >> level) ||
-                height > (context->getMaximumCubeTextureDimension() >> level))
-            {
-                return gl::error(GL_INVALID_VALUE, false);
-            }
-
-            gl::TextureCubeMap *texcube = context->getTextureCubeMap();
-            if (texcube)
-            {
-                if (isSubImage && !validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
-                {
-                    return false; // error already registered by validateSubImageParams
-                }
-                texture = texcube;
-                textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
-            }
-        }
-        break;
-
-      default:
-        return gl::error(GL_INVALID_ENUM, false);
-    }
-
-    if (!texture)
-    {
-        return gl::error(GL_INVALID_OPERATION, false);
-    }
-
-    if (texture->isImmutable() && !isSubImage)
-    {
-        return gl::error(GL_INVALID_OPERATION, false);
-    }
-
+    GLenum textureFormat = gl::GetFormat(textureInternalFormat, context->getClientVersion());
 
     // [OpenGL ES 2.0.24] table 3.9
     if (isSubImage)