Reorganized the parameters to validateES3CopyTexImageParameters and fixed a bug with compressed destination textures.

TRAC #22956

Signed-off-by: Jamie Madill
Signed-off-by: Shannon Woods
Author: Geoff Lang

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2353 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index cc15969..7eb2d0b 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -223,9 +223,9 @@
     return true;
 }
 
-bool validateES3TexImageFormat(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
-    GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
-    GLint border, GLenum format, GLenum type)
+bool validateES3TexImageParameters(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
+                                   GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
+                                   GLint border, GLenum format, GLenum type)
 {
     // Validate image size
     if (level < 0 || width < 0 || height < 0 || depth < 0 )
@@ -464,9 +464,9 @@
     return true;
 }
 
-bool validateCopyTexImageParameters(gl::Context *context, GLenum target, bool isCompressed, GLint level,
-                                    GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
-                                    GLsizei width, GLsizei height)
+bool validateES3CopyTexImageParameters(gl::Context *context, GLenum target, GLint level, GLenum internalformat,
+                                       bool isSubImage, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
+                                       GLsizei width, GLsizei height, GLint border)
 {
     if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
     {
@@ -483,6 +483,11 @@
         return false;
     }
 
+    if (border != 0)
+    {
+        return gl::error(GL_INVALID_VALUE, false);
+    }
+
     if (level > context->getMaximumTextureLevel())
     {
         return gl::error(GL_INVALID_VALUE, false);
@@ -569,12 +574,12 @@
         return gl::error(GL_INVALID_OPERATION, false);
     }
 
-    if (isCompressed != textureCompressed)
+    if (texture->isImmutable() && !isSubImage)
     {
         return gl::error(GL_INVALID_OPERATION, false);
     }
 
-    if (isCompressed)
+    if (textureCompressed)
     {
         if ((width % 4 != 0 && width != textureLevelWidth) ||
             (height % 4 != 0 && height != textureLevelHeight))
@@ -7683,7 +7688,7 @@
             }
 
             // validateES3TexImageFormat sets the error code if there is an error
-            if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
+            if (!validateES3TexImageParameters(context, target, level, internalformat, false, false,
                                                0, 0, 0, width, height, depth, border, format, type))
             {
                 return;
@@ -7740,7 +7745,7 @@
             }
 
             // validateES3TexImageFormat sets the error code if there is an error
-            if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
+            if (!validateES3TexImageParameters(context, target, level, GL_NONE, false, true,
                                                xoffset, yoffset, zoffset, width, height, depth, 0,
                                                format, type))
             {
@@ -7791,8 +7796,8 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
-                                                x, y, width, height))
+            if (!validateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
+                                                   x, y, width, height, 0))
             {
                 return;
             }
@@ -7846,8 +7851,8 @@
             }
 
             // validateES3TexImageFormat sets the error code if there is an error
-            if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
-                                           0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
+            if (!validateES3TexImageParameters(context, target, level, internalformat, true, false,
+                                               0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
             {
                 return;
             }
@@ -7908,8 +7913,8 @@
             }
 
             // validateES3TexImageFormat sets the error code if there is an error
-            if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
-                                           0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
+            if (!validateES3TexImageParameters(context, target, level, GL_NONE, true, true,
+                                               0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
             {
                 return;
             }