Add support for DXT3 and DXT5

TEST=none
BUG=none
Review URL: http://codereview.appspot.com/4809068

git-svn-id: https://angleproject.googlecode.com/svn/trunk@721 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index f6dd3f5..77fff26 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -156,8 +156,11 @@
 
     mHasBeenCurrent = false;
 
-    mSupportsCompressedTextures = false;
+    mSupportsDXT1Textures = false;
+    mSupportsDXT3Textures = false;
+    mSupportsDXT5Textures = false;
     mSupportsEventQueries = false;
+    mNumCompressedTextureFormats = 0;
     mMaxSupportedSamples = 0;
     mMaskedClearSavedState = NULL;
     markAllStateDirty();
@@ -280,7 +283,9 @@
         mMaxSupportedSamples = max;
 
         mSupportsEventQueries = display->getEventQuerySupport();
-        mSupportsCompressedTextures = display->getCompressedTextureSupport();
+        mSupportsDXT1Textures = display->getDXT1TextureSupport();
+        mSupportsDXT3Textures = display->getDXT3TextureSupport();
+        mSupportsDXT5Textures = display->getDXT5TextureSupport();
         mSupportsFloatTextures = display->getFloatTextureSupport(&mSupportsFloatLinearFilter, &mSupportsFloatRenderableTextures);
         mSupportsHalfFloatTextures = display->getHalfFloatTextureSupport(&mSupportsHalfFloatLinearFilter, &mSupportsHalfFloatRenderableTextures);
         mSupportsLuminanceTextures = display->getLuminanceTextureSupport();
@@ -288,6 +293,20 @@
 
         mSupports32bitIndices = mDeviceCaps.MaxVertexIndex >= (1 << 16);
 
+        mNumCompressedTextureFormats = 0;
+        if (supportsDXT1Textures())
+        {
+            mNumCompressedTextureFormats += 2;
+        }
+        if (supportsDXT3Textures())
+        {
+            mNumCompressedTextureFormats += 1;
+        }
+        if (supportsDXT5Textures())
+        {
+            mNumCompressedTextureFormats += 1;
+        }
+
         initExtensionString();
 
         mState.viewportX = 0;
@@ -1240,18 +1259,7 @@
       case GL_MAX_TEXTURE_SIZE:                 *params = getMaximumTextureDimension();         break;
       case GL_MAX_CUBE_MAP_TEXTURE_SIZE:        *params = getMaximumCubeTextureDimension();     break;
       case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   
-        {
-            if (supportsCompressedTextures())
-            {
-                // at current, only GL_COMPRESSED_RGB_S3TC_DXT1_EXT and 
-                // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT are supported
-                *params = 2;
-            }
-            else
-            {
-                *params = 0;
-            }
-        }
+        params[0] = mNumCompressedTextureFormats;
         break;
       case GL_MAX_SAMPLES_ANGLE:
         {
@@ -1307,10 +1315,18 @@
         break;
       case GL_COMPRESSED_TEXTURE_FORMATS:
         {
-            if (supportsCompressedTextures())
+            if (supportsDXT1Textures())
             {
-                params[0] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
-                params[1] = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+                *params++ = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
+                *params++ = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+            }
+            if (supportsDXT3Textures())
+            {
+                *params++ = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
+            }
+            if (supportsDXT5Textures())
+            {
+                *params++ = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
             }
         }
         break;
@@ -1422,7 +1438,12 @@
     // application.
     switch (pname)
     {
-      case GL_COMPRESSED_TEXTURE_FORMATS: /* no compressed texture formats are supported */ 
+      case GL_COMPRESSED_TEXTURE_FORMATS:
+        {
+            *type = GL_INT;
+            *numParams = mNumCompressedTextureFormats;
+        }
+        break;
       case GL_SHADER_BINARY_FORMATS:
         {
             *type = GL_INT;
@@ -3053,9 +3074,19 @@
     return mSupportsEventQueries;
 }
 
-bool Context::supportsCompressedTextures() const
+bool Context::supportsDXT1Textures() const
 {
-    return mSupportsCompressedTextures;
+    return mSupportsDXT1Textures;
+}
+
+bool Context::supportsDXT3Textures() const
+{
+    return mSupportsDXT3Textures;
+}
+
+bool Context::supportsDXT5Textures() const
+{
+    return mSupportsDXT5Textures;
 }
 
 bool Context::supportsFloatTextures() const
@@ -3330,11 +3361,21 @@
         mExtensionString += "GL_NV_fence ";
     }
 
-    if (supportsCompressedTextures())
+    if (supportsDXT1Textures())
     {
         mExtensionString += "GL_EXT_texture_compression_dxt1 ";
     }
 
+    if (supportsDXT3Textures())
+    {
+        mExtensionString += "GL_ANGLE_texture_compression_dxt3 ";
+    }
+
+    if (supportsDXT5Textures())
+    {
+        mExtensionString += "GL_ANGLE_texture_compression_dxt5 ";
+    }
+
     if (supportsFloatTextures())
     {
         mExtensionString += "GL_OES_texture_float ";