Make TextureCubeMap size/format/compressed checks explicit about the level and face they are checking

Issue=306
Signed-off-by: Nicolas Capens

git-svn-id: http://angleproject.googlecode.com/svn/trunk@1082 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index fd96ef2..f251b55 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -163,22 +163,22 @@
 
 GLsizei RenderbufferTextureCubeMap::getWidth() const
 {
-    return mTextureCubeMap->getWidth(0);
+    return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
 }
 
 GLsizei RenderbufferTextureCubeMap::getHeight() const
 {
-    return mTextureCubeMap->getHeight(0);
+    return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
 }
 
 GLenum RenderbufferTextureCubeMap::getInternalFormat() const
 {
-    return mTextureCubeMap->getInternalFormat();
+    return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
 }
 
 D3DFORMAT RenderbufferTextureCubeMap::getD3DFormat() const
 {
-    return mTextureCubeMap->getD3DFormat();
+    return mTextureCubeMap->getD3DFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
 }
 
 GLsizei RenderbufferTextureCubeMap::getSamples() const
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 55e3ae3..8a7b4e4 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -2483,30 +2483,36 @@
     return GL_TEXTURE_CUBE_MAP;
 }
 
-GLsizei TextureCubeMap::getWidth(GLint level) const
+GLsizei TextureCubeMap::getWidth(GLenum target, GLint level) const
 {
     if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
-        return mImageArray[0][level].getWidth();
+        return mImageArray[faceIndex(target)][level].getWidth();
     else
         return 0;
 }
 
-GLsizei TextureCubeMap::getHeight(GLint level) const
+GLsizei TextureCubeMap::getHeight(GLenum target, GLint level) const
 {
     if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
-        return mImageArray[0][level].getHeight();
+        return mImageArray[faceIndex(target)][level].getHeight();
     else
         return 0;
 }
 
-GLenum TextureCubeMap::getInternalFormat() const
+GLenum TextureCubeMap::getInternalFormat(GLenum target, GLint level) const
 {
-    return mImageArray[0][0].getFormat();
+    if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
+        return mImageArray[faceIndex(target)][level].getFormat();
+    else
+        return GL_NONE;
 }
 
-D3DFORMAT TextureCubeMap::getD3DFormat() const
+D3DFORMAT TextureCubeMap::getD3DFormat(GLenum target, GLint level) const
 {
-    return mImageArray[0][0].getD3DFormat();
+    if (level < IMPLEMENTATION_MAX_TEXTURE_LEVELS)
+        return mImageArray[faceIndex(target)][level].getD3DFormat();
+    else
+        return D3DFMT_UNKNOWN;
 }
 
 void TextureCubeMap::setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
@@ -2606,8 +2612,8 @@
         return false;
     }
 
-    if ((getInternalFormat() == GL_FLOAT && !getContext()->supportsFloat32LinearFilter()) ||
-        (getInternalFormat() == GL_HALF_FLOAT_OES && !getContext()->supportsFloat16LinearFilter()))
+    if ((getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0) == GL_FLOAT && !getContext()->supportsFloat32LinearFilter()) ||
+        (getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0) == GL_HALF_FLOAT_OES && !getContext()->supportsFloat16LinearFilter()))
     {
         if (mMagFilter != GL_NEAREST || (mMinFilter != GL_NEAREST && mMinFilter != GL_NEAREST_MIPMAP_NEAREST))
         {
@@ -2703,9 +2709,9 @@
     return true;
 }
 
-bool TextureCubeMap::isCompressed() const
+bool TextureCubeMap::isCompressed(GLenum target, GLint level) const
 {
-    return IsCompressed(getInternalFormat());
+    return IsCompressed(getInternalFormat(target, level));
 }
 
 IDirect3DBaseTexture9 *TextureCubeMap::getBaseTexture() const
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index b3c1383..ba521f0 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -364,11 +364,11 @@
 
     virtual GLenum getTarget() const;
     
-    GLsizei getWidth(GLint level) const;
-    GLsizei getHeight(GLint level) const;
-    GLenum getInternalFormat() const;
-    D3DFORMAT getD3DFormat() const;
-    bool isCompressed() const;
+    GLsizei getWidth(GLenum target, GLint level) const;
+    GLsizei getHeight(GLenum target, GLint level) const;
+    GLenum getInternalFormat(GLenum target, GLint level) const;
+    D3DFORMAT getD3DFormat(GLenum target, GLint level) const;
+    bool isCompressed(GLenum target, GLint level) const;
 
     void setImagePosX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
     void setImageNegX(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index f5ea60e..b06e532 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -92,7 +92,7 @@
 }
 
 bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
-                                GLint xoffset, GLint yoffset, GLint level, GLenum format,
+                                GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format,
                                 gl::TextureCubeMap *texture)
 {
     if (!texture)
@@ -100,27 +100,27 @@
         return error(GL_INVALID_OPERATION, false);
     }
 
-    if (compressed != texture->isCompressed())
+    if (compressed != texture->isCompressed(target, level))
     {
         return error(GL_INVALID_OPERATION, false);
     }
 
-    if (format != GL_NONE && format != texture->getInternalFormat())
+    if (format != GL_NONE && format != texture->getInternalFormat(target, level))
     {
         return error(GL_INVALID_OPERATION, false);
     }
 
     if (compressed)
     {
-        if ((width % 4 != 0 && width != texture->getWidth(0)) ||
-            (height % 4 != 0 && height != texture->getHeight(0)))
+        if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
+            (height % 4 != 0 && height != texture->getHeight(target, 0)))
         {
             return error(GL_INVALID_OPERATION, false);
         }
     }
 
-    if (xoffset + width > texture->getWidth(level) ||
-        yoffset + height > texture->getHeight(level))
+    if (xoffset + width > texture->getWidth(target, level) ||
+        yoffset + height > texture->getHeight(target, level))
     {
         return error(GL_INVALID_VALUE, false);
     }
@@ -1141,7 +1141,7 @@
             else if (gl::IsCubemapTextureTarget(target))
             {
                 gl::TextureCubeMap *texture = context->getTextureCubeMap();
-                if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, level, format, texture))
+                if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, texture))
                 {
                     texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
                 }
@@ -1411,11 +1411,11 @@
             {
                 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
 
-                if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, level, GL_NONE, texcube))
+                if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, texcube))
                 {
                     return; // error already registered by validateSubImageParams
                 }
-                textureFormat = texcube->getInternalFormat();
+                textureFormat = texcube->getInternalFormat(target, level);
                 texture = texcube;
             }
             else UNREACHABLE();
@@ -2381,7 +2381,7 @@
                             return error(GL_INVALID_OPERATION);
                         }
                         gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
-                        if (texcube->isCompressed())
+                        if (texcube->isCompressed(textarget, level))
                         {
                             return error(GL_INVALID_OPERATION);
                         }
@@ -2515,7 +2515,7 @@
                 {
                     gl::TextureCubeMap *texcube = context->getTextureCubeMap();
 
-                    if (texcube->isCompressed())
+                    if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
                     {
                         return error(GL_INVALID_OPERATION);
                     }
@@ -5594,7 +5594,7 @@
             else if (gl::IsCubemapTextureTarget(target))
             {
                 gl::TextureCubeMap *texture = context->getTextureCubeMap();
-                if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, level, format, texture))
+                if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, texture))
                 {
                     texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
                 }