Report errors for unsupported Depth/stencil texture operations

Trac #20875
Signed-off-by: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/trunk@1105 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 133a85d..92a2da5 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -2163,6 +2163,11 @@
     return IsCompressed(getInternalFormat(level));
 }
 
+bool Texture2D::isDepth(GLint level) const
+{
+    return IsDepthTexture(getInternalFormat(level));
+}
+
 IDirect3DBaseTexture9 *Texture2D::getBaseTexture() const
 {
     return mTexStorage ? mTexStorage->getBaseTexture() : NULL;
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index ba521f0..5cb59ed 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -284,6 +284,7 @@
     GLenum getInternalFormat(GLint level) const;
     D3DFORMAT getD3DFormat(GLint level) const;
     bool isCompressed(GLint level) const;
+    bool isDepth(GLint level) const;
 
     void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
     void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 47903b0..f1791a7 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -1297,6 +1297,19 @@
                     return error(GL_INVALID_ENUM);
                 }
                 break;
+              case GL_DEPTH_COMPONENT:
+              case GL_DEPTH_COMPONENT16:
+              case GL_DEPTH_COMPONENT32_OES:
+              case GL_DEPTH_STENCIL_OES:
+              case GL_DEPTH24_STENCIL8_OES:
+                  if (context->supportsDepthTextures())
+                  {
+                      return error(GL_INVALID_OPERATION);
+                  }
+                  else
+                  {
+                      return error(GL_INVALID_ENUM);
+                  }
               default:
                 return error(GL_INVALID_ENUM);
             }
@@ -1461,6 +1474,9 @@
               case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
               case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
                 return error(GL_INVALID_OPERATION);
+              case GL_DEPTH_COMPONENT:
+              case GL_DEPTH_STENCIL_OES:
+                return error(GL_INVALID_OPERATION);
               default:
                 return error(GL_INVALID_OPERATION);
             }
@@ -2506,6 +2522,10 @@
                     {
                         return error(GL_INVALID_OPERATION);
                     }
+                    if (tex2d->isDepth(0))
+                    {
+                        return error(GL_INVALID_OPERATION);
+                    }
 
                     tex2d->generateMipmaps();
                     break;
@@ -5236,6 +5256,15 @@
                 {
                     return error(GL_INVALID_VALUE);
                 }
+                if (target != GL_TEXTURE_2D)
+                {
+                    return error(GL_INVALID_OPERATION);
+                }
+                // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
+                if (pixels != NULL)
+                {
+                    return error(GL_INVALID_OPERATION);
+                }
                 break;
               default:
                 break;
@@ -5514,6 +5543,10 @@
                 {
                     return error(GL_INVALID_ENUM);
                 }
+                if (target != GL_TEXTURE_2D)
+                {
+                    return error(GL_INVALID_OPERATION);
+                }
                 break;
               default:
                 break;
@@ -5624,6 +5657,12 @@
                 {
                     return error(GL_INVALID_ENUM);
                 }
+                if (target != GL_TEXTURE_2D)
+                {
+                    return error(GL_INVALID_OPERATION);
+                }
+                // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
+                return error(GL_INVALID_OPERATION);
             }
 
             if (target == GL_TEXTURE_2D)