Updated the parameter validation functions to include 3d versions.

TRAC #22705

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

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2171 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 4e0d96d..2ff8689 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -21,9 +21,9 @@
 #include "libGLESv2/Query.h"
 #include "libGLESv2/Context.h"
 
-bool validImageSize(GLint level, GLsizei width, GLsizei height)
+bool validImageSize(GLint level, GLsizei width, GLsizei height, GLsizei depth)
 {
-    if (level < 0 || width < 0 || height < 0)
+    if (level < 0 || width < 0 || height < 0 || depth < 0)
     {
         return false;
     }
@@ -38,7 +38,7 @@
         return true;
     }
 
-    if (gl::isPow2(width) && gl::isPow2(height))
+    if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
     {
         return true;
     }
@@ -222,6 +222,48 @@
     return true;
 }
 
+bool validateSubImageParams3D(bool compressed, GLsizei width, GLsizei height, GLsizei depth,
+                              GLint xoffset, GLint yoffset,GLint zoffset, GLint level, GLenum format, GLenum type,
+                              gl::Texture3D *texture)
+{
+    if (!texture)
+    {
+        return gl::error(GL_INVALID_OPERATION, false);
+    }
+
+    if (compressed != texture->isCompressed(level))
+    {
+        return gl::error(GL_INVALID_OPERATION, false);
+    }
+
+    if (format != GL_NONE)
+    {
+        GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
+        if (internalformat != texture->getInternalFormat(level))
+        {
+            return gl::error(GL_INVALID_OPERATION, false);
+        }
+    }
+
+    if (compressed)
+    {
+        if ((width % 4 != 0 && width != texture->getWidth(0)) ||
+            (height % 4 != 0 && height != texture->getHeight(0)))
+        {
+            return gl::error(GL_INVALID_OPERATION, false);
+        }
+    }
+
+    if (xoffset + width > texture->getWidth(level) ||
+        yoffset + height > texture->getHeight(level) ||
+        zoffset + depth > texture->getDepth(level))
+    {
+        return gl::error(GL_INVALID_VALUE, false);
+    }
+
+    return true;
+}
+
 // check for combinations of format and type that are valid for ReadPixels
 bool validReadFormatType(GLenum format, GLenum type)
 {
@@ -1135,7 +1177,7 @@
 
     try
     {
-        if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
+        if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
         {
             return gl::error(GL_INVALID_VALUE);
         }
@@ -1300,7 +1342,7 @@
             return gl::error(GL_INVALID_ENUM);
         }
 
-        if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
+        if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
         {
             return gl::error(GL_INVALID_VALUE);
         }
@@ -1400,7 +1442,7 @@
 
     try
     {
-        if (!validImageSize(level, width, height))
+        if (!validImageSize(level, width, height, 1))
         {
             return gl::error(GL_INVALID_VALUE);
         }
@@ -5449,7 +5491,7 @@
 
     try
     {
-        if (!validImageSize(level, width, height))
+        if (!validImageSize(level, width, height, 1))
         {
             return gl::error(GL_INVALID_VALUE);
         }