Allow depth and depth-stencil formats and types for textures and update utility functions
Trac #20875
Signed-off-by: Nicolas Capens
TexImage2D accepts
format,internalformat=DEPTH_COMPONENT, type=UNSIGNED_SHORT
format,internalformat=DEPTH_COMPONENT, type=UNSIGNED_INT
format,internalformat=DEPTH_STENCIL_OES, type=UNSIGNED_INT_24_8_OES
TexSubImage2D accepts
format=DEPTH_COMPONENT, type=UNSIGNED_SHORT
format=DEPTH_COMPONENT, type=UNSIGNED_INT
format=DEPTH_STENCIL_OES, type=UNSIGNED_INT_24_8_OES
TexStorage2DEXT accepts
internalformat=DEPTH_COMPONENT16
internalformat=DEPTH_COMPONENT32_OES
internalformat=DEPTH24_STENCIL8_OES
git-svn-id: https://angleproject.googlecode.com/svn/trunk@1104 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index b06e532..47903b0 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -5131,6 +5131,25 @@
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
break;
+ case GL_DEPTH_COMPONENT:
+ switch (type)
+ {
+ case GL_UNSIGNED_SHORT:
+ case GL_UNSIGNED_INT:
+ break;
+ default:
+ return error(GL_INVALID_ENUM);
+ }
+ break;
+ case GL_DEPTH_STENCIL_OES:
+ switch (type)
+ {
+ case GL_UNSIGNED_INT_24_8_OES:
+ break;
+ default:
+ return error(GL_INVALID_ENUM);
+ }
+ break;
default:
return error(GL_INVALID_VALUE);
}
@@ -5211,6 +5230,13 @@
return error(GL_INVALID_ENUM);
}
break;
+ case GL_DEPTH_COMPONENT:
+ case GL_DEPTH_STENCIL_OES:
+ if (!context->supportsDepthTextures())
+ {
+ return error(GL_INVALID_VALUE);
+ }
+ break;
default:
break;
}
@@ -5481,6 +5507,16 @@
return error(GL_INVALID_ENUM);
}
break;
+ case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT32_OES:
+ case GL_DEPTH24_STENCIL8_OES:
+ if (!context->supportsDepthTextures())
+ {
+ return error(GL_INVALID_ENUM);
+ }
+ break;
+ default:
+ break;
}
if (target == GL_TEXTURE_2D)
@@ -5582,6 +5618,13 @@
return error(GL_INVALID_ENUM);
}
}
+ else if (gl::IsDepthTexture(format))
+ {
+ if (!context->supportsDepthTextures())
+ {
+ return error(GL_INVALID_ENUM);
+ }
+ }
if (target == GL_TEXTURE_2D)
{
diff --git a/src/libGLESv2/utilities.cpp b/src/libGLESv2/utilities.cpp
index 6589eb1..4c9c7a9 100644
--- a/src/libGLESv2/utilities.cpp
+++ b/src/libGLESv2/utilities.cpp
@@ -274,6 +274,17 @@
}
}
+bool IsDepthTexture(GLenum format)
+{
+ if (format == GL_DEPTH_COMPONENT ||
+ format == GL_DEPTH_STENCIL_OES)
+ {
+ return true;
+ }
+
+ return false;
+}
+
// Returns the size, in bytes, of a single texel in an Image
int ComputePixelSize(GLenum format, GLenum type)
{
@@ -294,7 +305,11 @@
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_5_6_5:
+ case GL_UNSIGNED_SHORT:
return sizeof(unsigned short);
+ case GL_UNSIGNED_INT:
+ case GL_UNSIGNED_INT_24_8_OES:
+ return sizeof(unsigned int);
case GL_FLOAT:
switch (format)
{
@@ -375,6 +390,13 @@
case GL_UNSIGNED_SHORT_5_6_5:
return (format == GL_RGB);
+ case GL_UNSIGNED_SHORT:
+ case GL_UNSIGNED_INT:
+ return (format == GL_DEPTH_COMPONENT);
+
+ case GL_UNSIGNED_INT_24_8_OES:
+ return (format == GL_DEPTH_STENCIL_OES);
+
default:
return false;
}
@@ -407,6 +429,9 @@
case GL_LUMINANCE16F_EXT: return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA16F_EXT: return GL_LUMINANCE_ALPHA;
case GL_BGRA8_EXT: return GL_BGRA_EXT;
+ case GL_DEPTH_COMPONENT16: return GL_DEPTH_COMPONENT;
+ case GL_DEPTH_COMPONENT32_OES: return GL_DEPTH_COMPONENT;
+ case GL_DEPTH24_STENCIL8_OES: return GL_DEPTH_STENCIL_OES;
default: return GL_NONE; // Unsupported
}
}
@@ -438,6 +463,9 @@
case GL_LUMINANCE16F_EXT: return GL_HALF_FLOAT_OES;
case GL_LUMINANCE_ALPHA16F_EXT: return GL_HALF_FLOAT_OES;
case GL_BGRA8_EXT: return GL_UNSIGNED_BYTE;
+ case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT;
+ case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
+ case GL_DEPTH24_STENCIL8_OES: return GL_UNSIGNED_INT_24_8_OES;
default: return GL_NONE; // Unsupported
}
}
diff --git a/src/libGLESv2/utilities.h b/src/libGLESv2/utilities.h
index 1ff981d..00afeee 100644
--- a/src/libGLESv2/utilities.h
+++ b/src/libGLESv2/utilities.h
@@ -39,6 +39,7 @@
GLsizei ComputeCompressedPitch(GLsizei width, GLenum format);
GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format);
bool IsCompressed(GLenum format);
+bool IsDepthTexture(GLenum format);
bool IsCubemapTextureTarget(GLenum target);
bool IsInternalTextureTarget(GLenum target);
bool CheckTextureFormatType(GLenum format, GLenum type);