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);