Tracks sized internal formats for textures.

TRAC #21609

Signed-off-by: Daniel Koch

Author:    Shannon Woods <shannon.woods@transgaming.com>

git-svn-id: https://angleproject.googlecode.com/svn/trunk@1301 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/utilities.cpp b/src/libGLESv2/utilities.cpp
index d0a7beb..1dae681 100644
--- a/src/libGLESv2/utilities.cpp
+++ b/src/libGLESv2/utilities.cpp
@@ -229,22 +229,22 @@
     return -1;
 }
 
-GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment)
+GLsizei ComputePitch(GLsizei width, GLint internalformat, GLint alignment)
 {
     ASSERT(alignment > 0 && isPow2(alignment));
 
-    GLsizei rawPitch = ComputePixelSize(format, type) * width;
+    GLsizei rawPitch = ComputePixelSize(internalformat) * width;
     return (rawPitch + alignment - 1) & ~(alignment - 1);
 }
 
-GLsizei ComputeCompressedPitch(GLsizei width, GLenum format)
+GLsizei ComputeCompressedPitch(GLsizei width, GLenum internalformat)
 {
-    return ComputeCompressedSize(width, 1, format);
+    return ComputeCompressedSize(width, 1, internalformat);
 }
 
-GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format)
+GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum internalformat)
 {
-    switch (format)
+    switch (internalformat)
     {
       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
@@ -277,7 +277,10 @@
 bool IsDepthTexture(GLenum format)
 {
     if (format == GL_DEPTH_COMPONENT ||
-        format == GL_DEPTH_STENCIL_OES)
+        format == GL_DEPTH_STENCIL_OES ||
+        format == GL_DEPTH_COMPONENT16 ||
+        format == GL_DEPTH_COMPONENT32_OES ||
+        format == GL_DEPTH24_STENCIL8_OES)
     {
         return true;
     }
@@ -286,54 +289,29 @@
 }
 
 // Returns the size, in bytes, of a single texel in an Image
-int ComputePixelSize(GLenum format, GLenum type)
+int ComputePixelSize(GLint internalformat)
 {
-    switch (type)
+    switch (internalformat)
     {
-      case GL_UNSIGNED_BYTE:
-        switch (format)
-        {
-          case GL_ALPHA:           return sizeof(unsigned char);
-          case GL_LUMINANCE:       return sizeof(unsigned char);
-          case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2;
-          case GL_RGB:             return sizeof(unsigned char) * 3;
-          case GL_RGBA:            return sizeof(unsigned char) * 4;
-          case GL_BGRA_EXT:        return sizeof(unsigned char) * 4;
-          default: UNREACHABLE();
-        }
-        break;
-      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_4_4_4_4_REV_EXT:
-      case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
-      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)
-        {
-          case GL_ALPHA:           return sizeof(float);
-          case GL_LUMINANCE:       return sizeof(float);
-          case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
-          case GL_RGB:             return sizeof(float) * 3;
-          case GL_RGBA:            return sizeof(float) * 4;
-          default: UNREACHABLE();
-        }
-        break;
-      case GL_HALF_FLOAT_OES:
-        switch (format)
-        {
-          case GL_ALPHA:           return sizeof(unsigned short);
-          case GL_LUMINANCE:       return sizeof(unsigned short);
-          case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
-          case GL_RGB:             return sizeof(unsigned short) * 3;
-          case GL_RGBA:            return sizeof(unsigned short) * 4;
-          default: UNREACHABLE();
-        }
-        break;
+      case GL_ALPHA8_EXT:                       return sizeof(unsigned char);
+      case GL_LUMINANCE8_EXT:                   return sizeof(unsigned char);
+      case GL_ALPHA32F_EXT:                     return sizeof(float);
+      case GL_LUMINANCE32F_EXT:                 return sizeof(float);
+      case GL_ALPHA16F_EXT:                     return sizeof(unsigned short);
+      case GL_LUMINANCE16F_EXT:                 return sizeof(unsigned short);
+      case GL_LUMINANCE8_ALPHA8_EXT:            return sizeof(unsigned char) * 2;
+      case GL_LUMINANCE_ALPHA32F_EXT:           return sizeof(float) * 2;
+      case GL_LUMINANCE_ALPHA16F_EXT:           return sizeof(unsigned short) * 2;
+      case GL_RGB8_OES:                         return sizeof(unsigned char) * 3;
+      case GL_RGB565:                           return sizeof(unsigned short);
+      case GL_RGB32F_EXT:                       return sizeof(float) * 3;
+      case GL_RGB16F_EXT:                       return sizeof(unsigned short) * 3;
+      case GL_RGBA8_OES:                        return sizeof(unsigned char) * 4;
+      case GL_RGBA4:                            return sizeof(unsigned short);
+      case GL_RGB5_A1:                          return sizeof(unsigned short);
+      case GL_RGBA32F_EXT:                      return sizeof(float) * 4;
+      case GL_RGBA16F_EXT:                      return sizeof(unsigned short) * 4;
+      case GL_BGRA8_EXT:                        return sizeof(unsigned char) * 4;
       default: UNREACHABLE();
     }
 
@@ -350,6 +328,94 @@
     return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
 }
 
+GLint ConvertSizedInternalFormat(GLenum format, GLenum type)
+{
+    switch (format)
+    {
+      case GL_ALPHA:
+        switch (type)
+        {
+          case GL_UNSIGNED_BYTE:    return GL_ALPHA8_EXT;
+          case GL_FLOAT:            return GL_ALPHA32F_EXT;
+          case GL_HALF_FLOAT_OES:   return GL_ALPHA16F_EXT;
+          default:                  UNIMPLEMENTED();
+        }
+        break;
+      case GL_LUMINANCE:
+        switch (type)
+        {
+          case GL_UNSIGNED_BYTE:    return GL_LUMINANCE8_EXT;
+          case GL_FLOAT:            return GL_LUMINANCE32F_EXT;
+          case GL_HALF_FLOAT_OES:   return GL_LUMINANCE16F_EXT;
+          default:                  UNIMPLEMENTED();
+        }
+        break;
+      case GL_LUMINANCE_ALPHA:
+        switch (type)
+        {
+          case GL_UNSIGNED_BYTE:    return GL_LUMINANCE8_ALPHA8_EXT;
+          case GL_FLOAT:            return GL_LUMINANCE_ALPHA32F_EXT;
+          case GL_HALF_FLOAT_OES:   return GL_LUMINANCE_ALPHA16F_EXT;
+          default:                  UNIMPLEMENTED();
+        }
+        break;
+      case GL_RGB:
+        switch (type)
+        {
+          case GL_UNSIGNED_BYTE:            return GL_RGB8_OES;
+          case GL_UNSIGNED_SHORT_5_6_5:     return GL_RGB565;
+          case GL_FLOAT:                    return GL_RGB32F_EXT;
+          case GL_HALF_FLOAT_OES:           return GL_RGB16F_EXT;
+          default:                          UNIMPLEMENTED();
+        }
+        break;
+      case GL_RGBA:
+        switch (type)
+        {
+          case GL_UNSIGNED_BYTE:            return GL_RGBA8_OES;
+          case GL_UNSIGNED_SHORT_4_4_4_4:   return GL_RGBA4;
+          case GL_UNSIGNED_SHORT_5_5_5_1:   return GL_RGB5_A1;
+          case GL_FLOAT:                    return GL_RGBA32F_EXT;
+          case GL_HALF_FLOAT_OES:           return GL_RGBA16F_EXT;
+            break;
+          default:                          UNIMPLEMENTED();
+        }
+        break;
+      case GL_BGRA_EXT:
+        switch (type)
+        {
+            // Are there sized internal formats for the packed BGRA types?
+          case GL_UNSIGNED_BYTE:                    return GL_BGRA8_EXT;
+          default:                                  UNIMPLEMENTED();
+        }
+        break;
+      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+      case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+      case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+        return format;
+      case GL_DEPTH_COMPONENT:
+        switch (type)
+        {
+          case GL_UNSIGNED_SHORT:           return GL_DEPTH_COMPONENT16;
+          case GL_UNSIGNED_INT:             return GL_DEPTH_COMPONENT32_OES;
+          default:                          UNIMPLEMENTED();
+        }
+        break;
+      case GL_DEPTH_STENCIL_OES:
+        switch (type)
+        {
+          case GL_UNSIGNED_INT_24_8_OES:    return GL_DEPTH24_STENCIL8_OES;
+          default:                          UNIMPLEMENTED();
+        }
+        break;
+      default:
+        UNIMPLEMENTED();
+    }
+
+    return GL_NONE;
+}
+
 GLenum ExtractFormat(GLenum internalformat)
 {
     switch (internalformat)