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)