Use a Caps structure to store extension and texture format support.

Removes support for fallbacks in D3D9 texture formats. The fallback
formats did not work properly anyways.

BUG=angle:658

Change-Id: Idfa5183bf71fd8ebf4608f940f9d93177b9eff08
Reviewed-on: https://chromium-review.googlesource.com/200813
Tested-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index bf3cd0f..08894b7 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -1676,7 +1676,7 @@
               case GL_UNSIGNED_SHORT:
                 break;
               case GL_UNSIGNED_INT:
-                if (!context->supports32bitIndices())
+                if (!context->getCaps().extensions.elementIndexUint)
                 {
                     return gl::error(GL_INVALID_ENUM);
                 }
@@ -1732,7 +1732,7 @@
                   case GL_UNSIGNED_SHORT:
                     break;
                   case GL_UNSIGNED_INT:
-                    if (!context->supports32bitIndices())
+                    if (!context->getCaps().extensions.elementIndexUint)
                     {
                         return gl::error(GL_INVALID_ENUM);
                     }
@@ -2095,19 +2095,19 @@
             // Internally, all texture formats are sized so checking if the format
             // is color renderable and filterable will not fail.
 
-            bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
+            const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalFormat);
+
+            bool validRenderable = (formatCaps.colorRendering ||
                                     gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
 
-            if (gl::IsDepthRenderingSupported(internalFormat, context) ||
-                gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
-                !gl::IsTextureFilteringSupported(internalFormat, context) ||
-                !validRenderable)
+            if (formatCaps.depthRendering || gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
+                !formatCaps.filtering || !validRenderable)
             {
                 return gl::error(GL_INVALID_OPERATION);
             }
 
             // Non-power of 2 ES2 check
-            if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
+            if (!context->getCaps().extensions.textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
             {
                 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
                 return gl::error(GL_INVALID_OPERATION);
@@ -3202,14 +3202,11 @@
               case GL_RENDERBUFFER_DEPTH_SIZE:      *params = attachment->getDepthSize();      break;
               case GL_RENDERBUFFER_STENCIL_SIZE:    *params = attachment->getStencilSize();    break;
               case GL_RENDERBUFFER_SAMPLES_ANGLE:
-                if (context->getMaxSupportedSamples() != 0)
-                {
-                    *params = attachment->getSamples();
-                }
-                else
+                if (!context->getCaps().extensions.framebufferMultisample)
                 {
                     return gl::error(GL_INVALID_ENUM);
                 }
+                *params = attachment->getSamples();
                 break;
               default:
                 return gl::error(GL_INVALID_ENUM);
@@ -3444,7 +3441,7 @@
                 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
             }
           case GL_EXTENSIONS:
-            return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
+            return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
           default:
             return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
         }
@@ -3508,7 +3505,7 @@
                 *params = (GLfloat)texture->getUsage();
                 break;
               case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-                if (!context->supportsTextureFilterAnisotropy())
+                if (!context->getCaps().extensions.textureFilterAnisotropic)
                 {
                     return gl::error(GL_INVALID_ENUM);
                 }
@@ -3634,7 +3631,7 @@
                 *params = texture->getUsage();
                 break;
               case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-                if (!context->supportsTextureFilterAnisotropy())
+                if (!context->getCaps().extensions.textureFilterAnisotropic)
                 {
                     return gl::error(GL_INVALID_ENUM);
                 }
@@ -5014,7 +5011,7 @@
               case GL_TEXTURE_MIN_FILTER:           texture->setMinFilter(gl::uiround<GLenum>(param));   break;
               case GL_TEXTURE_MAG_FILTER:           texture->setMagFilter(gl::uiround<GLenum>(param));   break;
               case GL_TEXTURE_USAGE_ANGLE:          texture->setUsage(gl::uiround<GLenum>(param));       break;
-              case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
+              case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture->setMaxAnisotropy(param, context->getCaps().extensions.maxTextureAnisotropy); break;
               case GL_TEXTURE_COMPARE_MODE:         texture->setCompareMode(gl::uiround<GLenum>(param)); break;
               case GL_TEXTURE_COMPARE_FUNC:         texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
               case GL_TEXTURE_SWIZZLE_R:            texture->setSwizzleRed(gl::uiround<GLenum>(param));   break;
@@ -5070,7 +5067,7 @@
               case GL_TEXTURE_MIN_FILTER:           texture->setMinFilter((GLenum)param);   break;
               case GL_TEXTURE_MAG_FILTER:           texture->setMagFilter((GLenum)param);   break;
               case GL_TEXTURE_USAGE_ANGLE:          texture->setUsage((GLenum)param);       break;
-              case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
+              case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture->setMaxAnisotropy((float)param, context->getCaps().extensions.maxTextureAnisotropy); break;
               case GL_TEXTURE_COMPARE_MODE:         texture->setCompareMode((GLenum)param); break;
               case GL_TEXTURE_COMPARE_FUNC:         texture->setCompareFunc((GLenum)param); break;
               case GL_TEXTURE_SWIZZLE_R:            texture->setSwizzleRed((GLenum)param);   break;
@@ -5107,6 +5104,11 @@
 
         if (context)
         {
+            if (!context->getCaps().extensions.textureStorage)
+            {
+                return gl::error(GL_INVALID_OPERATION);
+            }
+
             if (context->getClientVersion() < 3 &&
                 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
             {
@@ -8105,11 +8107,11 @@
                 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
             }
 
-            if (index >= context->getNumExtensions())
+            if (index >= context->getExtensionStringCount())
             {
                 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
             }
-            
+
             return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
         }
     }
@@ -9725,9 +9727,8 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            if (!gl::IsColorRenderingSupported(internalformat, context) &&
-                !gl::IsDepthRenderingSupported(internalformat, context) &&
-                !gl::IsStencilRenderingSupported(internalformat, context))
+            const gl::TextureCaps &formatCaps = context->getCaps().textureCaps.get(internalformat);
+            if (!formatCaps.colorRendering && !formatCaps.depthRendering && !formatCaps.stencilRendering)
             {
                 return gl::error(GL_INVALID_ENUM);
             }
@@ -9954,11 +9955,6 @@
 
         if (context)
         {
-            if (!context->supportsPBOs())
-            {
-                return gl::error(GL_INVALID_OPERATION);
-            }
-
             if (!gl::ValidBufferTarget(context, target))
             {
                 return gl::error(GL_INVALID_ENUM);