Implemented OES_texture_npot support.

TRAC #16871
Signed-off-by: Daniel Koch
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/trunk@661 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 7c71c63..23957fe 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -28,6 +28,31 @@
 #include "libGLESv2/Shader.h"
 #include "libGLESv2/Texture.h"
 
+bool validImageSize(GLint level, GLsizei width, GLsizei height)
+{
+    if (level < 0 || width < 0 || height < 0)
+    {
+        return false;
+    }
+
+    if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
+    {
+        return true;
+    }
+
+    if (level == 0)
+    {
+        return true;
+    }
+
+    if (gl::isPow2(width) && gl::isPow2(height))
+    {
+        return true;
+    }
+
+    return false;
+}
+
 extern "C"
 {
 
@@ -738,12 +763,7 @@
 
     try
     {
-        if (level < 0)
-        {
-            return error(GL_INVALID_VALUE);
-        }
-
-        if (width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || border != 0 || imageSize < 0)
+        if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
         {
             return error(GL_INVALID_VALUE);
         }
@@ -868,13 +888,7 @@
             return error(GL_INVALID_ENUM);
         }
 
-        if (level < 0)
-        {
-            return error(GL_INVALID_VALUE);
-        }
-
-        if (xoffset < 0 || yoffset < 0 || width < 0 || height < 0 || 
-            (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || imageSize < 0)
+        if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
         {
             return error(GL_INVALID_VALUE);
         }
@@ -982,12 +996,7 @@
 
     try
     {
-        if (level < 0 || width < 0 || height < 0)
-        {
-            return error(GL_INVALID_VALUE);
-        }
-
-        if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
+        if (!validImageSize(level, width, height))
         {
             return error(GL_INVALID_VALUE);
         }
@@ -4397,12 +4406,7 @@
 
     try
     {
-        if (level < 0 || width < 0 || height < 0)
-        {
-            return error(GL_INVALID_VALUE);
-        }
-
-        if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
+        if (!validImageSize(level, width, height))
         {
             return error(GL_INVALID_VALUE);
         }