Optimize ValidateBindTexture type check.

This switch can be cached in a very fast packed map. The map contents
only change if different extensions are exposed. This reduces the
number of instructions we hit in ValidateBindTexture.

Bug: angleproject:2763
Change-Id: I6ba8a4124d85e4c193d0dee3e03e50713d51b1f4
Reviewed-on: https://chromium-review.googlesource.com/c/1262739
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@google.com>
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 5433c43..1573017 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -1110,6 +1110,44 @@
     return false;
 }
 
+void RecordBindTextureTypeError(Context *context, TextureType target)
+{
+    ASSERT(!context->getStateCache().isValidBindTextureType(target));
+
+    switch (target)
+    {
+        case TextureType::Rectangle:
+            ASSERT(!context->getExtensions().textureRectangle);
+            context->handleError(InvalidEnum()
+                                 << "Context does not support GL_ANGLE_texture_rectangle");
+            break;
+
+        case TextureType::_3D:
+        case TextureType::_2DArray:
+            ASSERT(context->getClientMajorVersion() < 3);
+            ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES3Required);
+            break;
+
+        case TextureType::_2DMultisample:
+            ASSERT(context->getClientVersion() < Version(3, 1));
+            ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES31Required);
+            break;
+
+        case TextureType::_2DMultisampleArray:
+            ASSERT(!context->getExtensions().textureStorageMultisample2DArray);
+            ANGLE_VALIDATION_ERR(context, InvalidEnum(), MultisampleArrayExtensionRequired);
+            break;
+
+        case TextureType::External:
+            ASSERT(!context->getExtensions().eglImageExternal &&
+                   !context->getExtensions().eglStreamConsumerExternal);
+            context->handleError(InvalidEnum() << "External texture extension not enabled");
+            break;
+
+        default:
+            ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
+    }
+}
 }  // anonymous namespace
 
 bool ValidateES2TexImageParameters(Context *context,
@@ -3044,55 +3082,10 @@
 
 bool ValidateBindTexture(Context *context, TextureType target, GLuint texture)
 {
-    switch (target)
+    if (!context->getStateCache().isValidBindTextureType(target))
     {
-        case TextureType::_2D:
-        case TextureType::CubeMap:
-            break;
-
-        case TextureType::Rectangle:
-            if (!context->getExtensions().textureRectangle)
-            {
-                context->handleError(InvalidEnum()
-                                     << "Context does not support GL_ANGLE_texture_rectangle");
-                return false;
-            }
-            break;
-
-        case TextureType::_3D:
-        case TextureType::_2DArray:
-            if (context->getClientMajorVersion() < 3)
-            {
-                ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES3Required);
-                return false;
-            }
-            break;
-
-        case TextureType::_2DMultisample:
-            if (context->getClientVersion() < Version(3, 1))
-            {
-                ANGLE_VALIDATION_ERR(context, InvalidEnum(), ES31Required);
-                return false;
-            }
-            break;
-        case TextureType::_2DMultisampleArray:
-            if (!context->getExtensions().textureStorageMultisample2DArray)
-            {
-                ANGLE_VALIDATION_ERR(context, InvalidEnum(), MultisampleArrayExtensionRequired);
-                return false;
-            }
-            break;
-        case TextureType::External:
-            if (!context->getExtensions().eglImageExternal &&
-                !context->getExtensions().eglStreamConsumerExternal)
-            {
-                context->handleError(InvalidEnum() << "External texture extension not enabled");
-                return false;
-            }
-            break;
-        default:
-            ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidTextureTarget);
-            return false;
+        RecordBindTextureTypeError(context, target);
+        return false;
     }
 
     if (texture == 0)