Use packed enum for DrawElementsType.

The packing and unpacking take a few extra instructions. But it
completely obviates the need for any switches in the validation code.
Speed is slightly faster or the similar depending on the back-end.

Also add gl_angle_ext.xml to GL entry point generator inputs. This was
missing and would cause the code generation to miss certain changes.

Bug: angleproject:2985
Change-Id: I1ea41a71db71135000166ead8305ec42d22ff7b3
Reviewed-on: https://chromium-review.googlesource.com/c/1351729
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/scripts/entry_point_packed_gl_enums.json b/scripts/entry_point_packed_gl_enums.json
index 5e2657e..b843c97 100644
--- a/scripts/entry_point_packed_gl_enums.json
+++ b/scripts/entry_point_packed_gl_enums.json
@@ -107,19 +107,24 @@
         "mode": "PrimitiveMode"
     },
     "glDrawElements": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glDrawElementsIndirect": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glDrawElementsInstanced": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glDrawElementsInstancedANGLE": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glDrawRangeElements": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glEGLImageTargetTexture2DOES": {
         "target": "TextureType"
@@ -299,10 +304,12 @@
         "mode": "PrimitiveMode"
     },
     "glMultiDrawElementsANGLE": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glMultiDrawElementsInstancedANGLE": {
-        "mode": "PrimitiveMode"
+        "mode": "PrimitiveMode",
+        "type": "DrawElementsType"
     },
     "glPointParameterf": {
         "pname" : "PointParameter"
diff --git a/scripts/run_code_generation.py b/scripts/run_code_generation.py
index 92cc20b..18d1bd7 100755
--- a/scripts/run_code_generation.py
+++ b/scripts/run_code_generation.py
@@ -99,6 +99,7 @@
         'inputs': [
             'scripts/entry_point_packed_gl_enums.json',
             'scripts/gl.xml',
+            'scripts/gl_angle_ext.xml',
         ],
         'script': 'scripts/generate_entry_points.py',
     },
diff --git a/scripts/run_code_generation_hashes.json b/scripts/run_code_generation_hashes.json
index 9cd4b2a..e7231e1 100644
--- a/scripts/run_code_generation_hashes.json
+++ b/scripts/run_code_generation_hashes.json
@@ -50,11 +50,13 @@
   "GL copy conversion table:src/libANGLE/gen_copy_conversion_table.py":
     "ac1afe23d9578bd1d2ef74f4a7aa927a",
   "GL entry point:scripts/entry_point_packed_gl_enums.json":
-    "91796c2aa1aef35c93b5c4ddd88496d2",
+    "0554a67f70407e82c872010014721099",
   "GL entry point:scripts/generate_entry_points.py":
     "de1438d762e9c737c5addc77769ad55d",
   "GL entry point:scripts/gl.xml":
     "b470cb06b06cbbe7adb2c8129ec85708",
+  "GL entry point:scripts/gl_angle_ext.xml":
+    "9fd7020b8c63816320df0bdcd4582741",
   "GL format map:src/libANGLE/es3_format_type_combinations.json":
     "a232823cd6430f14e28793ccabb968ee",
   "GL format map:src/libANGLE/format_map_data.json":
@@ -74,7 +76,7 @@
   "Vulkan format:src/libANGLE/renderer/vulkan/vk_format_map.json":
     "0c14ee33bcec99ee02eb6b39da046bc0",
   "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py":
-    "b666933fa621018c3ac0e1767a0f7bc1",
+    "1238d8d25cb48875863f96a2577a13b1",
   "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
     "1743adf55153edf91363fa7b4350d859",
   "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/PushConstantColor.frag":
diff --git a/src/common/PackedEnums.h b/src/common/PackedEnums.h
index 79cefb9..d6a4fbc 100644
--- a/src/common/PackedEnums.h
+++ b/src/common/PackedEnums.h
@@ -268,6 +268,47 @@
               "PrimitiveMode violation");
 static_assert(ToGLenum(PrimitiveMode::TriangleStripAdjacency) == GL_TRIANGLE_STRIP_ADJACENCY,
               "PrimitiveMode violation");
+
+enum class DrawElementsType : size_t
+{
+    UnsignedByte  = 0,
+    UnsignedShort = 1,
+    UnsignedInt   = 2,
+    InvalidEnum   = 3,
+    EnumCount     = 3,
+};
+
+template <>
+constexpr DrawElementsType FromGLenum<DrawElementsType>(GLenum from)
+{
+    GLenum scaled = (from - GL_UNSIGNED_BYTE);
+    GLenum packed = (scaled >> 1);
+
+    if ((scaled & 1) != 0 || packed >= static_cast<GLenum>(DrawElementsType::EnumCount))
+    {
+        return DrawElementsType::InvalidEnum;
+    }
+
+    return static_cast<DrawElementsType>(packed);
+}
+
+constexpr GLenum ToGLenum(DrawElementsType from)
+{
+    return ((static_cast<GLenum>(from) << 1) + GL_UNSIGNED_BYTE);
+}
+
+static_assert(ToGLenum(DrawElementsType::UnsignedByte) == GL_UNSIGNED_BYTE,
+              "DrawElementsType violation");
+static_assert(ToGLenum(DrawElementsType::UnsignedShort) == GL_UNSIGNED_SHORT,
+              "DrawElementsType violation");
+static_assert(ToGLenum(DrawElementsType::UnsignedInt) == GL_UNSIGNED_INT,
+              "DrawElementsType violation");
+static_assert(FromGLenum<DrawElementsType>(GL_UNSIGNED_BYTE) == DrawElementsType::UnsignedByte,
+              "DrawElementsType violation");
+static_assert(FromGLenum<DrawElementsType>(GL_UNSIGNED_SHORT) == DrawElementsType::UnsignedShort,
+              "DrawElementsType violation");
+static_assert(FromGLenum<DrawElementsType>(GL_UNSIGNED_INT) == DrawElementsType::UnsignedInt,
+              "DrawElementsType violation");
 }  // namespace gl
 
 namespace egl
diff --git a/src/common/angleutils.h b/src/common/angleutils.h
index c4bdfbe..7e7460a 100644
--- a/src/common/angleutils.h
+++ b/src/common/angleutils.h
@@ -307,11 +307,11 @@
 #ifndef ANGLE_STRINGIFY
 #    define ANGLE_STRINGIFY(x) #x
 #endif
+// clang-format on
 
 #ifndef ANGLE_MACRO_STRINGIFY
 #    define ANGLE_MACRO_STRINGIFY(x) ANGLE_STRINGIFY(x)
 #endif
-// clang-format on
 
 // Detect support for C++17 [[nodiscard]]
 #if !defined(__has_cpp_attribute)
diff --git a/src/common/utilities.cpp b/src/common/utilities.cpp
index 2175074..8ef211d 100644
--- a/src/common/utilities.cpp
+++ b/src/common/utilities.cpp
@@ -530,22 +530,22 @@
     return -1;
 }
 
-IndexRange ComputeIndexRange(GLenum indexType,
+IndexRange ComputeIndexRange(DrawElementsType indexType,
                              const GLvoid *indices,
                              size_t count,
                              bool primitiveRestartEnabled)
 {
     switch (indexType)
     {
-        case GL_UNSIGNED_BYTE:
+        case DrawElementsType::UnsignedByte:
             return ComputeTypedIndexRange(static_cast<const GLubyte *>(indices), count,
                                           primitiveRestartEnabled,
                                           GetPrimitiveRestartIndex(indexType));
-        case GL_UNSIGNED_SHORT:
+        case DrawElementsType::UnsignedShort:
             return ComputeTypedIndexRange(static_cast<const GLushort *>(indices), count,
                                           primitiveRestartEnabled,
                                           GetPrimitiveRestartIndex(indexType));
-        case GL_UNSIGNED_INT:
+        case DrawElementsType::UnsignedInt:
             return ComputeTypedIndexRange(static_cast<const GLuint *>(indices), count,
                                           primitiveRestartEnabled,
                                           GetPrimitiveRestartIndex(indexType));
@@ -555,15 +555,15 @@
     }
 }
 
-GLuint GetPrimitiveRestartIndex(GLenum indexType)
+GLuint GetPrimitiveRestartIndex(DrawElementsType indexType)
 {
     switch (indexType)
     {
-        case GL_UNSIGNED_BYTE:
+        case DrawElementsType::UnsignedByte:
             return 0xFF;
-        case GL_UNSIGNED_SHORT:
+        case DrawElementsType::UnsignedShort:
             return 0xFFFF;
-        case GL_UNSIGNED_INT:
+        case DrawElementsType::UnsignedInt:
             return 0xFFFFFFFF;
         default:
             UNREACHABLE();
diff --git a/src/common/utilities.h b/src/common/utilities.h
index 8918e45..512e05d 100644
--- a/src/common/utilities.h
+++ b/src/common/utilities.h
@@ -63,13 +63,13 @@
 
 // Find the range of index values in the provided indices pointer.  Primitive restart indices are
 // only counted in the range if primitive restart is disabled.
-IndexRange ComputeIndexRange(GLenum indexType,
+IndexRange ComputeIndexRange(DrawElementsType indexType,
                              const GLvoid *indices,
                              size_t count,
                              bool primitiveRestartEnabled);
 
 // Get the primitive restart index value for the given index type.
-GLuint GetPrimitiveRestartIndex(GLenum indexType);
+GLuint GetPrimitiveRestartIndex(DrawElementsType indexType);
 
 bool IsTriangleMode(PrimitiveMode drawMode);
 bool IsLineMode(PrimitiveMode primitiveMode);
diff --git a/src/libANGLE/Buffer.cpp b/src/libANGLE/Buffer.cpp
index c8ec6b6..94afe14 100644
--- a/src/libANGLE/Buffer.cpp
+++ b/src/libANGLE/Buffer.cpp
@@ -227,7 +227,7 @@
 }
 
 angle::Result Buffer::getIndexRange(const gl::Context *context,
-                                    GLenum type,
+                                    DrawElementsType type,
                                     size_t offset,
                                     size_t count,
                                     bool primitiveRestartEnabled,
diff --git a/src/libANGLE/Buffer.h b/src/libANGLE/Buffer.h
index 15f3101..4150018 100644
--- a/src/libANGLE/Buffer.h
+++ b/src/libANGLE/Buffer.h
@@ -103,7 +103,7 @@
     void onPixelPack(const Context *context);
 
     angle::Result getIndexRange(const gl::Context *context,
-                                GLenum type,
+                                DrawElementsType type,
                                 size_t offset,
                                 size_t count,
                                 bool primitiveRestartEnabled,
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 132563a..150301f 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -2242,7 +2242,10 @@
                                      instanceCount);
 }
 
-void Context::drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices)
+void Context::drawElements(PrimitiveMode mode,
+                           GLsizei count,
+                           DrawElementsType type,
+                           const void *indices)
 {
     // No-op if count draws no primitives for given mode
     if (noopDraw(mode, count))
@@ -2256,7 +2259,7 @@
 
 void Context::drawElementsInstanced(PrimitiveMode mode,
                                     GLsizei count,
-                                    GLenum type,
+                                    DrawElementsType type,
                                     const void *indices,
                                     GLsizei instances)
 {
@@ -2275,7 +2278,7 @@
                                 GLuint start,
                                 GLuint end,
                                 GLsizei count,
-                                GLenum type,
+                                DrawElementsType type,
                                 const void *indices)
 {
     // No-op if count draws no primitives for given mode
@@ -2295,7 +2298,7 @@
     ANGLE_CONTEXT_TRY(mImplementation->drawArraysIndirect(this, mode, indirect));
 }
 
-void Context::drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect)
+void Context::drawElementsIndirect(PrimitiveMode mode, DrawElementsType type, const void *indirect)
 {
     ANGLE_CONTEXT_TRY(prepareForDraw(mode));
     ANGLE_CONTEXT_TRY(mImplementation->drawElementsIndirect(this, mode, type, indirect));
@@ -5461,7 +5464,7 @@
 
 void Context::multiDrawElements(PrimitiveMode mode,
                                 const GLsizei *counts,
-                                GLenum type,
+                                DrawElementsType type,
                                 const GLvoid *const *indices,
                                 GLsizei drawcount)
 {
@@ -5497,7 +5500,7 @@
 
 void Context::multiDrawElementsInstanced(PrimitiveMode mode,
                                          const GLsizei *counts,
-                                         GLenum type,
+                                         DrawElementsType type,
                                          const GLvoid *const *indices,
                                          const GLsizei *instanceCounts,
                                          GLsizei drawcount)
@@ -8186,6 +8189,7 @@
 {
     updateValidDrawModes(context);
     updateValidBindTextureTypes(context);
+    updateValidDrawElementsTypes(context);
 }
 
 void StateCache::updateActiveAttribsMask(Context *context)
@@ -8403,4 +8407,16 @@
         {TextureType::CubeMap, true},
     }};
 }
+
+void StateCache::updateValidDrawElementsTypes(Context *context)
+{
+    bool supportsUint =
+        (context->getClientMajorVersion() >= 3 || context->getExtensions().elementIndexUint);
+
+    mCachedValidDrawElementsTypes = {{
+        {DrawElementsType::UnsignedByte, true},
+        {DrawElementsType::UnsignedShort, true},
+        {DrawElementsType::UnsignedInt, supportsUint},
+    }};
+}
 }  // namespace gl
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index c880db5..5f95a4a 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -156,6 +156,12 @@
         return mCachedValidBindTextureTypes[type];
     }
 
+    // Cannot chance except on Context/Extension init.
+    bool isValidDrawElementsType(DrawElementsType type) const
+    {
+        return mCachedValidDrawElementsTypes[type];
+    }
+
     // State change notifications.
     void onVertexArrayBindingChange(Context *context);
     void onProgramExecutableChange(Context *context);
@@ -181,6 +187,7 @@
     void updateBasicDrawStatesError();
     void updateValidDrawModes(Context *context);
     void updateValidBindTextureTypes(Context *context);
+    void updateValidDrawElementsTypes(Context *context);
 
     intptr_t getBasicDrawStatesErrorImpl(Context *context) const;
 
@@ -199,6 +206,8 @@
         mCachedValidDrawModes;
     angle::PackedEnumMap<TextureType, bool, angle::EnumSize<TextureType>() + 1>
         mCachedValidBindTextureTypes;
+    angle::PackedEnumMap<DrawElementsType, bool, angle::EnumSize<DrawElementsType>() + 1>
+        mCachedValidDrawElementsTypes;
 };
 
 class Context final : public egl::LabeledObject, angle::NonCopyable, public angle::ObserverInterface
@@ -690,20 +699,23 @@
     void drawArrays(PrimitiveMode mode, GLint first, GLsizei count);
     void drawArraysInstanced(PrimitiveMode mode, GLint first, GLsizei count, GLsizei instanceCount);
 
-    void drawElements(PrimitiveMode mode, GLsizei count, GLenum type, const void *indices);
+    void drawElements(PrimitiveMode mode,
+                      GLsizei count,
+                      DrawElementsType type,
+                      const void *indices);
     void drawElementsInstanced(PrimitiveMode mode,
                                GLsizei count,
-                               GLenum type,
+                               DrawElementsType type,
                                const void *indices,
                                GLsizei instances);
     void drawRangeElements(PrimitiveMode mode,
                            GLuint start,
                            GLuint end,
                            GLsizei count,
-                           GLenum type,
+                           DrawElementsType type,
                            const void *indices);
     void drawArraysIndirect(PrimitiveMode mode, const void *indirect);
-    void drawElementsIndirect(PrimitiveMode mode, GLenum type, const void *indirect);
+    void drawElementsIndirect(PrimitiveMode mode, DrawElementsType type, const void *indirect);
 
     void blitFramebuffer(GLint srcX0,
                          GLint srcY0,
@@ -1572,12 +1584,12 @@
                                   GLsizei drawcount);
     void multiDrawElements(PrimitiveMode mode,
                            const GLsizei *counts,
-                           GLenum type,
+                           DrawElementsType type,
                            const GLvoid *const *indices,
                            GLsizei drawcount);
     void multiDrawElementsInstanced(PrimitiveMode mode,
                                     const GLsizei *counts,
-                                    GLenum type,
+                                    DrawElementsType type,
                                     const GLvoid *const *indices,
                                     const GLsizei *instanceCounts,
                                     GLsizei drawcount);
diff --git a/src/libANGLE/IndexRangeCache.cpp b/src/libANGLE/IndexRangeCache.cpp
index 1898772..5540dc8 100644
--- a/src/libANGLE/IndexRangeCache.cpp
+++ b/src/libANGLE/IndexRangeCache.cpp
@@ -19,7 +19,7 @@
 
 IndexRangeCache::~IndexRangeCache() {}
 
-void IndexRangeCache::addRange(GLenum type,
+void IndexRangeCache::addRange(DrawElementsType type,
                                size_t offset,
                                size_t count,
                                bool primitiveRestartEnabled,
@@ -28,7 +28,7 @@
     mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range;
 }
 
-bool IndexRangeCache::findRange(GLenum type,
+bool IndexRangeCache::findRange(DrawElementsType type,
                                 size_t offset,
                                 size_t count,
                                 bool primitiveRestartEnabled,
@@ -62,7 +62,8 @@
     while (i != mIndexRangeCache.end())
     {
         size_t rangeStart = i->first.offset;
-        size_t rangeEnd   = i->first.offset + (GetTypeInfo(i->first.type).bytes * i->first.count);
+        size_t rangeEnd =
+            i->first.offset + (GetDrawElementsTypeSize(i->first.type) * i->first.count);
 
         if (invalidateEnd < rangeStart || invalidateStart > rangeEnd)
         {
@@ -81,10 +82,10 @@
 }
 
 IndexRangeCache::IndexRangeKey::IndexRangeKey()
-    : IndexRangeCache::IndexRangeKey(GL_NONE, 0, 0, false)
+    : IndexRangeCache::IndexRangeKey(DrawElementsType::InvalidEnum, 0, 0, false)
 {}
 
-IndexRangeCache::IndexRangeKey::IndexRangeKey(GLenum type_,
+IndexRangeCache::IndexRangeKey::IndexRangeKey(DrawElementsType type_,
                                               size_t offset_,
                                               size_t count_,
                                               bool primitiveRestartEnabled_)
diff --git a/src/libANGLE/IndexRangeCache.h b/src/libANGLE/IndexRangeCache.h
index 3f5d623..f53602d 100644
--- a/src/libANGLE/IndexRangeCache.h
+++ b/src/libANGLE/IndexRangeCache.h
@@ -10,11 +10,11 @@
 #ifndef LIBANGLE_INDEXRANGECACHE_H_
 #define LIBANGLE_INDEXRANGECACHE_H_
 
+#include "angle_gl.h"
+#include "common/PackedEnums.h"
 #include "common/angleutils.h"
 #include "common/mathutil.h"
 
-#include "angle_gl.h"
-
 #include <map>
 
 namespace gl
@@ -26,12 +26,12 @@
     IndexRangeCache();
     ~IndexRangeCache();
 
-    void addRange(GLenum type,
+    void addRange(DrawElementsType type,
                   size_t offset,
                   size_t count,
                   bool primitiveRestartEnabled,
                   const IndexRange &range);
-    bool findRange(GLenum type,
+    bool findRange(DrawElementsType type,
                    size_t offset,
                    size_t count,
                    bool primitiveRestartEnabled,
@@ -44,11 +44,11 @@
     struct IndexRangeKey
     {
         IndexRangeKey();
-        IndexRangeKey(GLenum type, size_t offset, size_t count, bool primitiveRestart);
+        IndexRangeKey(DrawElementsType type, size_t offset, size_t count, bool primitiveRestart);
 
         bool operator<(const IndexRangeKey &rhs) const;
 
-        GLenum type;
+        DrawElementsType type;
         size_t offset;
         size_t count;
         bool primitiveRestartEnabled;
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index f62e7ce..440da98 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -529,7 +529,7 @@
 }
 
 angle::Result VertexArray::getIndexRangeImpl(const Context *context,
-                                             GLenum type,
+                                             DrawElementsType type,
                                              GLsizei indexCount,
                                              const void *indices,
                                              IndexRange *indexRangeOut) const
@@ -553,12 +553,12 @@
 
 VertexArray::IndexRangeCache::IndexRangeCache() = default;
 
-void VertexArray::IndexRangeCache::put(GLenum type,
+void VertexArray::IndexRangeCache::put(DrawElementsType type,
                                        GLsizei indexCount,
                                        size_t offset,
                                        const IndexRange &indexRange)
 {
-    ASSERT(type != GL_NONE);
+    ASSERT(type != DrawElementsType::InvalidEnum);
 
     mTypeKey       = type;
     mIndexCountKey = indexCount;
diff --git a/src/libANGLE/VertexArray.h b/src/libANGLE/VertexArray.h
index 6a37c03..6e86b7d 100644
--- a/src/libANGLE/VertexArray.h
+++ b/src/libANGLE/VertexArray.h
@@ -256,7 +256,7 @@
     bool hasTransformFeedbackBindingConflict(const gl::Context *context) const;
 
     ANGLE_INLINE angle::Result getIndexRange(const Context *context,
-                                             GLenum type,
+                                             DrawElementsType type,
                                              GLsizei indexCount,
                                              const void *indices,
                                              IndexRange *indexRangeOut) const
@@ -291,7 +291,7 @@
     void updateCachedMappedArrayBuffers(VertexBinding *binding);
 
     angle::Result getIndexRangeImpl(const Context *context,
-                                    GLenum type,
+                                    DrawElementsType type,
                                     GLsizei indexCount,
                                     const void *indices,
                                     IndexRange *indexRangeOut) const;
@@ -315,9 +315,12 @@
       public:
         IndexRangeCache();
 
-        void invalidate() { mTypeKey = GL_NONE; }
+        void invalidate() { mTypeKey = DrawElementsType::InvalidEnum; }
 
-        bool get(GLenum type, GLsizei indexCount, const void *indices, IndexRange *indexRangeOut)
+        bool get(DrawElementsType type,
+                 GLsizei indexCount,
+                 const void *indices,
+                 IndexRange *indexRangeOut)
         {
             size_t offset = reinterpret_cast<uintptr_t>(indices);
             if (mTypeKey == type && mIndexCountKey == indexCount && mOffsetKey == offset)
@@ -329,10 +332,13 @@
             return false;
         }
 
-        void put(GLenum type, GLsizei indexCount, size_t offset, const IndexRange &indexRange);
+        void put(DrawElementsType type,
+                 GLsizei indexCount,
+                 size_t offset,
+                 const IndexRange &indexRange);
 
       private:
-        GLenum mTypeKey;
+        DrawElementsType mTypeKey;
         GLsizei mIndexCountKey;
         size_t mOffsetKey;
         IndexRange mPayload;
diff --git a/src/libANGLE/formatutils.h b/src/libANGLE/formatutils.h
index a883bf7..e2d491c 100644
--- a/src/libANGLE/formatutils.h
+++ b/src/libANGLE/formatutils.h
@@ -40,7 +40,7 @@
 {
     Type() : bytes(0), bytesShift(0), specialInterpretation(0) {}
 
-    Type(uint32_t packedTypeInfo)
+    explicit Type(uint32_t packedTypeInfo)
         : bytes(packedTypeInfo & 0xff),
           bytesShift((packedTypeInfo >> 8) & 0xff),
           specialInterpretation((packedTypeInfo >> 16) & 1)
@@ -59,6 +59,21 @@
     return Type(GetPackedTypeInfo(type));
 }
 
+// This helpers use tricks based on the assumption that the type has certain values.
+static_assert(static_cast<GLuint>(DrawElementsType::UnsignedByte) == 0, "Please update this code.");
+static_assert(static_cast<GLuint>(DrawElementsType::UnsignedShort) == 1,
+              "Please update this code.");
+static_assert(static_cast<GLuint>(DrawElementsType::UnsignedInt) == 2, "Please update this code.");
+ANGLE_INLINE GLuint GetDrawElementsTypeSize(DrawElementsType type)
+{
+    return (1 << static_cast<GLuint>(type));
+}
+
+ANGLE_INLINE GLuint GetDrawElementsTypeShift(DrawElementsType type)
+{
+    return static_cast<GLuint>(type);
+}
+
 // Information about an OpenGL internal format.  Can be keyed on the internalFormat and type
 // members.
 struct InternalFormat
diff --git a/src/libANGLE/renderer/BufferImpl.h b/src/libANGLE/renderer/BufferImpl.h
index e6c12c5..33a3432 100644
--- a/src/libANGLE/renderer/BufferImpl.h
+++ b/src/libANGLE/renderer/BufferImpl.h
@@ -59,7 +59,7 @@
     virtual angle::Result unmap(const gl::Context *context, GLboolean *result)          = 0;
 
     virtual angle::Result getIndexRange(const gl::Context *context,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         size_t offset,
                                         size_t count,
                                         bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/BufferImpl_mock.h b/src/libANGLE/renderer/BufferImpl_mock.h
index 0f32787..7d6901d 100644
--- a/src/libANGLE/renderer/BufferImpl_mock.h
+++ b/src/libANGLE/renderer/BufferImpl_mock.h
@@ -43,9 +43,13 @@
         angle::Result(const gl::Context *contextImpl, size_t, size_t, GLbitfield, void **));
     MOCK_METHOD2(unmap, angle::Result(const gl::Context *contextImpl, GLboolean *result));
 
-    MOCK_METHOD6(
-        getIndexRange,
-        angle::Result(const gl::Context *, GLenum, size_t, size_t, bool, gl::IndexRange *));
+    MOCK_METHOD6(getIndexRange,
+                 angle::Result(const gl::Context *,
+                               gl::DrawElementsType,
+                               size_t,
+                               size_t,
+                               bool,
+                               gl::IndexRange *));
 
     MOCK_METHOD0(destructor, void());
 
diff --git a/src/libANGLE/renderer/ContextImpl.h b/src/libANGLE/renderer/ContextImpl.h
index b07a930..137480c 100644
--- a/src/libANGLE/renderer/ContextImpl.h
+++ b/src/libANGLE/renderer/ContextImpl.h
@@ -54,12 +54,12 @@
     virtual angle::Result drawElements(const gl::Context *context,
                                        gl::PrimitiveMode mode,
                                        GLsizei count,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indices)        = 0;
     virtual angle::Result drawElementsInstanced(const gl::Context *context,
                                                 gl::PrimitiveMode mode,
                                                 GLsizei count,
-                                                GLenum type,
+                                                gl::DrawElementsType type,
                                                 const void *indices,
                                                 GLsizei instances) = 0;
     virtual angle::Result drawRangeElements(const gl::Context *context,
@@ -67,7 +67,7 @@
                                             GLuint start,
                                             GLuint end,
                                             GLsizei count,
-                                            GLenum type,
+                                            gl::DrawElementsType type,
                                             const void *indices)   = 0;
 
     virtual angle::Result drawArraysIndirect(const gl::Context *context,
@@ -75,7 +75,7 @@
                                              const void *indirect)   = 0;
     virtual angle::Result drawElementsIndirect(const gl::Context *context,
                                                gl::PrimitiveMode mode,
-                                               GLenum type,
+                                               gl::DrawElementsType type,
                                                const void *indirect) = 0;
 
     // CHROMIUM_path_rendering path drawing methods.
diff --git a/src/libANGLE/renderer/d3d/BufferD3D.cpp b/src/libANGLE/renderer/d3d/BufferD3D.cpp
index 2fd5b88..7609eec 100644
--- a/src/libANGLE/renderer/d3d/BufferD3D.cpp
+++ b/src/libANGLE/renderer/d3d/BufferD3D.cpp
@@ -175,7 +175,7 @@
 }
 
 angle::Result BufferD3D::getIndexRange(const gl::Context *context,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        size_t offset,
                                        size_t count,
                                        bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/d3d/BufferD3D.h b/src/libANGLE/renderer/d3d/BufferD3D.h
index ab96c4e..19ea78c 100644
--- a/src/libANGLE/renderer/d3d/BufferD3D.h
+++ b/src/libANGLE/renderer/d3d/BufferD3D.h
@@ -58,7 +58,7 @@
     void promoteStaticUsage(const gl::Context *context, size_t dataSize);
 
     angle::Result getIndexRange(const gl::Context *context,
-                                GLenum type,
+                                gl::DrawElementsType type,
                                 size_t offset,
                                 size_t count,
                                 bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/d3d/IndexBuffer.cpp b/src/libANGLE/renderer/d3d/IndexBuffer.cpp
index b46c4d1..1b04193 100644
--- a/src/libANGLE/renderer/d3d/IndexBuffer.cpp
+++ b/src/libANGLE/renderer/d3d/IndexBuffer.cpp
@@ -50,7 +50,7 @@
     }
 }
 
-GLenum IndexBufferInterface::getIndexType() const
+gl::DrawElementsType IndexBufferInterface::getIndexType() const
 {
     return mIndexBuffer->getIndexType();
 }
@@ -122,7 +122,7 @@
 
 angle::Result IndexBufferInterface::setBufferSize(const gl::Context *context,
                                                   unsigned int bufferSize,
-                                                  GLenum indexType)
+                                                  gl::DrawElementsType indexType)
 {
     if (mIndexBuffer->getBufferSize() == 0)
     {
@@ -142,7 +142,7 @@
 
 angle::Result StreamingIndexBufferInterface::reserveBufferSpace(const gl::Context *context,
                                                                 unsigned int size,
-                                                                GLenum indexType)
+                                                                gl::DrawElementsType indexType)
 {
     unsigned int curBufferSize = getBufferSize();
     unsigned int writePos      = getWritePosition();
@@ -168,7 +168,7 @@
 
 angle::Result StaticIndexBufferInterface::reserveBufferSpace(const gl::Context *context,
                                                              unsigned int size,
-                                                             GLenum indexType)
+                                                             gl::DrawElementsType indexType)
 {
     unsigned int curSize = getBufferSize();
     if (curSize == 0)
diff --git a/src/libANGLE/renderer/d3d/IndexBuffer.h b/src/libANGLE/renderer/d3d/IndexBuffer.h
index 7671443..e21bca2 100644
--- a/src/libANGLE/renderer/d3d/IndexBuffer.h
+++ b/src/libANGLE/renderer/d3d/IndexBuffer.h
@@ -10,6 +10,7 @@
 #ifndef LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
 #define LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_
 
+#include "common/PackedEnums.h"
 #include "common/angleutils.h"
 #include "libANGLE/Error.h"
 
@@ -30,7 +31,7 @@
 
     virtual angle::Result initialize(const gl::Context *context,
                                      unsigned int bufferSize,
-                                     GLenum indexType,
+                                     gl::DrawElementsType indexType,
                                      bool dynamic) = 0;
 
     virtual angle::Result mapBuffer(const gl::Context *context,
@@ -41,11 +42,11 @@
 
     virtual angle::Result discard(const gl::Context *context) = 0;
 
-    virtual GLenum getIndexType() const             = 0;
-    virtual unsigned int getBufferSize() const      = 0;
+    virtual gl::DrawElementsType getIndexType() const             = 0;
+    virtual unsigned int getBufferSize() const                    = 0;
     virtual angle::Result setSize(const gl::Context *context,
                                   unsigned int bufferSize,
-                                  GLenum indexType) = 0;
+                                  gl::DrawElementsType indexType) = 0;
 
     unsigned int getSerial() const;
 
@@ -65,9 +66,9 @@
 
     virtual angle::Result reserveBufferSpace(const gl::Context *context,
                                              unsigned int size,
-                                             GLenum indexType) = 0;
+                                             gl::DrawElementsType indexType) = 0;
 
-    GLenum getIndexType() const;
+    gl::DrawElementsType getIndexType() const;
     unsigned int getBufferSize() const;
 
     unsigned int getSerial() const;
@@ -88,7 +89,7 @@
 
     angle::Result setBufferSize(const gl::Context *context,
                                 unsigned int bufferSize,
-                                GLenum indexType);
+                                gl::DrawElementsType indexType);
 
   private:
     IndexBuffer *mIndexBuffer;
@@ -105,7 +106,7 @@
 
     angle::Result reserveBufferSpace(const gl::Context *context,
                                      unsigned int size,
-                                     GLenum indexType) override;
+                                     gl::DrawElementsType indexType) override;
 };
 
 class StaticIndexBufferInterface : public IndexBufferInterface
@@ -116,7 +117,7 @@
 
     angle::Result reserveBufferSpace(const gl::Context *context,
                                      unsigned int size,
-                                     GLenum indexType) override;
+                                     gl::DrawElementsType indexType) override;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/d3d/IndexDataManager.cpp b/src/libANGLE/renderer/d3d/IndexDataManager.cpp
index 6a96c66..d626ef5 100644
--- a/src/libANGLE/renderer/d3d/IndexDataManager.cpp
+++ b/src/libANGLE/renderer/d3d/IndexDataManager.cpp
@@ -26,9 +26,9 @@
 
 template <typename InputT, typename DestT>
 void ConvertIndexArray(const void *input,
-                       GLenum sourceType,
+                       gl::DrawElementsType sourceType,
                        void *output,
-                       GLenum destinationType,
+                       gl::DrawElementsType destinationType,
                        GLsizei count,
                        bool usePrimitiveRestartFixedIndex)
 {
@@ -53,8 +53,8 @@
     }
 }
 
-void ConvertIndices(GLenum sourceType,
-                    GLenum destinationType,
+void ConvertIndices(gl::DrawElementsType sourceType,
+                    gl::DrawElementsType destinationType,
                     const void *input,
                     GLsizei count,
                     void *output,
@@ -62,20 +62,20 @@
 {
     if (sourceType == destinationType)
     {
-        const gl::Type &typeInfo = gl::GetTypeInfo(destinationType);
-        memcpy(output, input, count * typeInfo.bytes);
+        const GLuint dstTypeSize = gl::GetDrawElementsTypeSize(destinationType);
+        memcpy(output, input, count * dstTypeSize);
         return;
     }
 
-    if (sourceType == GL_UNSIGNED_BYTE)
+    if (sourceType == gl::DrawElementsType::UnsignedByte)
     {
-        ASSERT(destinationType == GL_UNSIGNED_SHORT);
+        ASSERT(destinationType == gl::DrawElementsType::UnsignedShort);
         ConvertIndexArray<GLubyte, GLushort>(input, sourceType, output, destinationType, count,
                                              usePrimitiveRestartFixedIndex);
     }
-    else if (sourceType == GL_UNSIGNED_SHORT)
+    else if (sourceType == gl::DrawElementsType::UnsignedShort)
     {
-        ASSERT(destinationType == GL_UNSIGNED_INT);
+        ASSERT(destinationType == gl::DrawElementsType::UnsignedInt);
         ConvertIndexArray<GLushort, GLuint>(input, sourceType, output, destinationType, count,
                                             usePrimitiveRestartFixedIndex);
     }
@@ -87,18 +87,18 @@
                                   IndexBufferInterface *buffer,
                                   const void *data,
                                   unsigned int count,
-                                  GLenum srcType,
-                                  GLenum dstType,
+                                  gl::DrawElementsType srcType,
+                                  gl::DrawElementsType dstType,
                                   bool usePrimitiveRestartFixedIndex,
                                   unsigned int *offset)
 {
-    const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType);
+    const GLuint dstTypeBytesShift = gl::GetDrawElementsTypeShift(dstType);
 
-    bool check = (count > (std::numeric_limits<unsigned int>::max() >> dstTypeInfo.bytesShift));
+    bool check = (count > (std::numeric_limits<unsigned int>::max() >> dstTypeBytesShift));
     ANGLE_CHECK(GetImplAs<ContextD3D>(context), !check,
                 "Reserving indices exceeds the maximum buffer size.", GL_OUT_OF_MEMORY);
 
-    unsigned int bufferSizeRequired = count << dstTypeInfo.bytesShift;
+    unsigned int bufferSizeRequired = count << dstTypeBytesShift;
     ANGLE_TRY(buffer->reserveBufferSpace(context, bufferSizeRequired, dstType));
 
     void *output = nullptr;
@@ -109,30 +109,8 @@
     ANGLE_TRY(buffer->unmapBuffer(context));
     return angle::Result::Continue();
 }
-
-unsigned int ElementTypeSize(GLenum elementType)
-{
-    switch (elementType)
-    {
-        case GL_UNSIGNED_BYTE:
-            return sizeof(GLubyte);
-        case GL_UNSIGNED_SHORT:
-            return sizeof(GLushort);
-        case GL_UNSIGNED_INT:
-            return sizeof(GLuint);
-        default:
-            UNREACHABLE();
-            return 0;
-    }
-}
-
 }  // anonymous namespace
 
-bool IsOffsetAligned(GLenum elementType, unsigned int offset)
-{
-    return (offset % ElementTypeSize(elementType) == 0);
-}
-
 // IndexDataManager implementation.
 IndexDataManager::IndexDataManager(BufferFactoryD3D *factory)
     : mFactory(factory), mStreamingBufferShort(), mStreamingBufferInt()
@@ -155,15 +133,16 @@
 // we will start by falling back to streaming, and after a while will start using a static
 // translated copy of the index buffer.
 angle::Result IndexDataManager::prepareIndexData(const gl::Context *context,
-                                                 GLenum srcType,
-                                                 GLenum dstType,
+                                                 gl::DrawElementsType srcType,
+                                                 gl::DrawElementsType dstType,
                                                  GLsizei count,
                                                  gl::Buffer *glBuffer,
                                                  const void *indices,
                                                  TranslatedIndexData *translated)
 {
-    const gl::Type &srcTypeInfo = gl::GetTypeInfo(srcType);
-    const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType);
+    GLuint srcTypeBytes = gl::GetDrawElementsTypeSize(srcType);
+    GLuint srcTypeShift = gl::GetDrawElementsTypeShift(srcType);
+    GLuint dstTypeShift = gl::GetDrawElementsTypeShift(dstType);
 
     BufferD3D *buffer = glBuffer ? GetImplAs<BufferD3D>(glBuffer) : nullptr;
 
@@ -187,7 +166,7 @@
 
     // Case 2: the indices are already in a buffer
     unsigned int offset = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(indices));
-    ASSERT(srcTypeInfo.bytes * static_cast<unsigned int>(count) + offset <= buffer->getSize());
+    ASSERT(srcTypeBytes * static_cast<unsigned int>(count) + offset <= buffer->getSize());
 
     bool offsetAligned = IsOffsetAligned(srcType, offset);
 
@@ -197,7 +176,7 @@
         translated->storage     = buffer;
         translated->indexBuffer = nullptr;
         translated->serial      = buffer->getSerial();
-        translated->startIndex  = (offset >> srcTypeInfo.bytesShift);
+        translated->startIndex  = (offset >> srcTypeShift);
         translated->startOffset = offset;
         return angle::Result::Continue();
     }
@@ -225,7 +204,7 @@
 
         ANGLE_TRY(streamIndexData(context, bufferData + offset, count, srcType, dstType,
                                   primitiveRestartFixedIndexEnabled, translated));
-        buffer->promoteStaticUsage(context, count << srcTypeInfo.bytesShift);
+        buffer->promoteStaticUsage(context, count << srcTypeShift);
     }
     else
     {
@@ -236,7 +215,7 @@
             ASSERT(bufferData != nullptr);
 
             unsigned int convertCount =
-                static_cast<unsigned int>(buffer->getSize()) >> srcTypeInfo.bytesShift;
+                static_cast<unsigned int>(buffer->getSize()) >> srcTypeShift;
             ANGLE_TRY(StreamInIndexBuffer(context, staticBuffer, bufferData, convertCount, srcType,
                                           dstType, primitiveRestartFixedIndexEnabled, nullptr));
         }
@@ -244,8 +223,8 @@
 
         translated->indexBuffer = staticBuffer->getIndexBuffer();
         translated->serial      = staticBuffer->getSerial();
-        translated->startIndex  = (offset >> srcTypeInfo.bytesShift);
-        translated->startOffset = (offset >> srcTypeInfo.bytesShift) << dstTypeInfo.bytesShift;
+        translated->startIndex  = (offset >> srcTypeShift);
+        translated->startOffset = (offset >> srcTypeShift) << dstTypeShift;
     }
 
     return angle::Result::Continue();
@@ -254,12 +233,12 @@
 angle::Result IndexDataManager::streamIndexData(const gl::Context *context,
                                                 const void *data,
                                                 unsigned int count,
-                                                GLenum srcType,
-                                                GLenum dstType,
+                                                gl::DrawElementsType srcType,
+                                                gl::DrawElementsType dstType,
                                                 bool usePrimitiveRestartFixedIndex,
                                                 TranslatedIndexData *translated)
 {
-    const gl::Type &dstTypeInfo = gl::GetTypeInfo(dstType);
+    const GLuint dstTypeShift = gl::GetDrawElementsTypeShift(dstType);
 
     IndexBufferInterface *indexBuffer = nullptr;
     ANGLE_TRY(getStreamingIndexBuffer(context, dstType, &indexBuffer));
@@ -271,21 +250,23 @@
 
     translated->indexBuffer = indexBuffer->getIndexBuffer();
     translated->serial      = indexBuffer->getSerial();
-    translated->startIndex  = (offset >> dstTypeInfo.bytesShift);
+    translated->startIndex  = (offset >> dstTypeShift);
     translated->startOffset = offset;
 
     return angle::Result::Continue();
 }
 
 angle::Result IndexDataManager::getStreamingIndexBuffer(const gl::Context *context,
-                                                        GLenum destinationIndexType,
+                                                        gl::DrawElementsType destinationIndexType,
                                                         IndexBufferInterface **outBuffer)
 {
     ASSERT(outBuffer);
-    ASSERT(destinationIndexType == GL_UNSIGNED_SHORT || destinationIndexType == GL_UNSIGNED_INT);
+    ASSERT(destinationIndexType == gl::DrawElementsType::UnsignedShort ||
+           destinationIndexType == gl::DrawElementsType::UnsignedInt);
 
-    auto &streamingBuffer =
-        (destinationIndexType == GL_UNSIGNED_INT) ? mStreamingBufferInt : mStreamingBufferShort;
+    auto &streamingBuffer = (destinationIndexType == gl::DrawElementsType::UnsignedInt)
+                                ? mStreamingBufferInt
+                                : mStreamingBufferShort;
 
     if (!streamingBuffer)
     {
@@ -301,10 +282,10 @@
 
 angle::Result GetIndexTranslationDestType(const gl::Context *context,
                                           GLsizei indexCount,
-                                          GLenum indexType,
+                                          gl::DrawElementsType indexType,
                                           const void *indices,
                                           bool usePrimitiveRestartWorkaround,
-                                          GLenum *destTypeOut)
+                                          gl::DrawElementsType *destTypeOut)
 {
     // Avoid D3D11's primitive restart index value
     // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124(v=vs.85).aspx
@@ -314,7 +295,7 @@
         // This is a bit of a trick. We assume the count for an indirect draw is zero.
         if (indexCount == 0)
         {
-            *destTypeOut = GL_UNSIGNED_INT;
+            *destTypeOut = gl::DrawElementsType::UnsignedInt;
             return angle::Result::Continue();
         }
 
@@ -323,12 +304,14 @@
             context, indexType, indexCount, indices, &indexRange));
         if (indexRange.end == gl::GetPrimitiveRestartIndex(indexType))
         {
-            *destTypeOut = GL_UNSIGNED_INT;
+            *destTypeOut = gl::DrawElementsType::UnsignedInt;
             return angle::Result::Continue();
         }
     }
 
-    *destTypeOut = (indexType == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
+    *destTypeOut = (indexType == gl::DrawElementsType::UnsignedInt)
+                       ? gl::DrawElementsType::UnsignedInt
+                       : gl::DrawElementsType::UnsignedShort;
     return angle::Result::Continue();
 }
 
diff --git a/src/libANGLE/renderer/d3d/IndexDataManager.h b/src/libANGLE/renderer/d3d/IndexDataManager.h
index eda4fc9..874580e 100644
--- a/src/libANGLE/renderer/d3d/IndexDataManager.h
+++ b/src/libANGLE/renderer/d3d/IndexDataManager.h
@@ -44,7 +44,7 @@
     BufferD3D *srcBuffer;
     const void *srcIndices;
     unsigned int srcCount;
-    GLenum srcIndexType;
+    gl::DrawElementsType srcIndexType;
     bool srcIndicesChanged;
 };
 
@@ -55,7 +55,7 @@
 
     IndexBuffer *indexBuffer;
     BufferD3D *storage;
-    GLenum indexType;
+    gl::DrawElementsType indexType;
     unsigned int serial;
 
     SourceIndexData srcIndexData;
@@ -70,8 +70,8 @@
     void deinitialize();
 
     angle::Result prepareIndexData(const gl::Context *context,
-                                   GLenum srcType,
-                                   GLenum dstType,
+                                   gl::DrawElementsType srcType,
+                                   gl::DrawElementsType dstType,
                                    GLsizei count,
                                    gl::Buffer *glBuffer,
                                    const void *indices,
@@ -81,12 +81,12 @@
     angle::Result streamIndexData(const gl::Context *context,
                                   const void *data,
                                   unsigned int count,
-                                  GLenum srcType,
-                                  GLenum dstType,
+                                  gl::DrawElementsType srcType,
+                                  gl::DrawElementsType dstType,
                                   bool usePrimitiveRestartFixedIndex,
                                   TranslatedIndexData *translated);
     angle::Result getStreamingIndexBuffer(const gl::Context *context,
-                                          GLenum destinationIndexType,
+                                          gl::DrawElementsType destinationIndexType,
                                           IndexBufferInterface **outBuffer);
 
     using StreamingBuffer = std::unique_ptr<StreamingIndexBufferInterface>;
@@ -98,13 +98,15 @@
 
 angle::Result GetIndexTranslationDestType(const gl::Context *context,
                                           GLsizei indexCount,
-                                          GLenum indexType,
+                                          gl::DrawElementsType indexType,
                                           const void *indices,
                                           bool usePrimitiveRestartWorkaround,
-                                          GLenum *destTypeOut);
+                                          gl::DrawElementsType *destTypeOut);
 
-bool IsOffsetAligned(GLenum elementType, unsigned int offset);
-
+ANGLE_INLINE bool IsOffsetAligned(gl::DrawElementsType elementType, unsigned int offset)
+{
+    return (offset % gl::GetDrawElementsTypeSize(elementType) == 0);
+}
 }  // namespace rx
 
 #endif  // LIBANGLE_INDEXDATAMANAGER_H_
diff --git a/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
index 497c55c..df46af1 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
@@ -1308,13 +1308,13 @@
         size_t indicesDataSize = 0;
         switch (indexInfo->srcIndexType)
         {
-            case GL_UNSIGNED_INT:
+            case gl::DrawElementsType::UnsignedInt:
                 indicesDataSize = sizeof(GLuint) * indexInfo->srcCount;
                 break;
-            case GL_UNSIGNED_SHORT:
+            case gl::DrawElementsType::UnsignedShort:
                 indicesDataSize = sizeof(GLushort) * indexInfo->srcCount;
                 break;
-            case GL_UNSIGNED_BYTE:
+            case gl::DrawElementsType::UnsignedByte:
                 indicesDataSize = sizeof(GLubyte) * indexInfo->srcCount;
                 break;
             default:
@@ -1354,15 +1354,18 @@
 
         switch (indexInfo->srcIndexType)
         {
-            case GL_UNSIGNED_INT:
+            case gl::DrawElementsType::UnsignedInt:
                 readIndexValue = ReadIndexValueFromIndices<GLuint>;
                 break;
-            case GL_UNSIGNED_SHORT:
+            case gl::DrawElementsType::UnsignedShort:
                 readIndexValue = ReadIndexValueFromIndices<GLushort>;
                 break;
-            case GL_UNSIGNED_BYTE:
+            case gl::DrawElementsType::UnsignedByte:
                 readIndexValue = ReadIndexValueFromIndices<GLubyte>;
                 break;
+            default:
+                UNREACHABLE();
+                return angle::Result::Stop();
         }
 
         // Iterate over the cached index data and copy entries indicated into the emulated buffer.
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index ec7f732..9b9ab9f 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -60,16 +60,17 @@
     return false;
 }
 
-bool DrawCallHasStreamingElementArray(const gl::Context *context, GLenum srcType)
+bool DrawCallHasStreamingElementArray(const gl::Context *context, gl::DrawElementsType srcType)
 {
     const gl::State &glState       = context->getGLState();
     gl::Buffer *elementArrayBuffer = glState.getVertexArray()->getElementArrayBuffer();
 
     bool primitiveRestartWorkaround =
         UsePrimitiveRestartWorkaround(glState.isPrimitiveRestartEnabled(), srcType);
-    const GLenum dstType = (srcType == GL_UNSIGNED_INT || primitiveRestartWorkaround)
-                               ? GL_UNSIGNED_INT
-                               : GL_UNSIGNED_SHORT;
+    const gl::DrawElementsType dstType =
+        (srcType == gl::DrawElementsType::UnsignedInt || primitiveRestartWorkaround)
+            ? gl::DrawElementsType::UnsignedInt
+            : gl::DrawElementsType::UnsignedShort;
 
     // Not clear where the offset comes from here.
     switch (ClassifyIndexStorage(glState, elementArrayBuffer, srcType, dstType, 0))
@@ -246,8 +247,8 @@
                                     GLsizei count)
 {
     ASSERT(count > 0);
-    ANGLE_TRY(mRenderer->getStateManager()->updateState(context, mode, first, count, GL_NONE,
-                                                        nullptr, 0, 0));
+    ANGLE_TRY(mRenderer->getStateManager()->updateState(
+        context, mode, first, count, gl::DrawElementsType::InvalidEnum, nullptr, 0, 0));
     return mRenderer->drawArrays(context, mode, first, count, 0);
 }
 
@@ -258,15 +259,15 @@
                                              GLsizei instanceCount)
 {
     ASSERT(count > 0);
-    ANGLE_TRY(mRenderer->getStateManager()->updateState(context, mode, first, count, GL_NONE,
-                                                        nullptr, instanceCount, 0));
+    ANGLE_TRY(mRenderer->getStateManager()->updateState(
+        context, mode, first, count, gl::DrawElementsType::InvalidEnum, nullptr, instanceCount, 0));
     return mRenderer->drawArrays(context, mode, first, count, instanceCount);
 }
 
 ANGLE_INLINE angle::Result Context11::drawElementsImpl(const gl::Context *context,
                                                        gl::PrimitiveMode mode,
                                                        GLsizei indexCount,
-                                                       GLenum indexType,
+                                                       gl::DrawElementsType indexType,
                                                        const void *indices,
                                                        GLsizei instanceCount)
 {
@@ -294,7 +295,7 @@
 angle::Result Context11::drawElements(const gl::Context *context,
                                       gl::PrimitiveMode mode,
                                       GLsizei count,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       const void *indices)
 {
     return drawElementsImpl(context, mode, count, type, indices, 0);
@@ -303,7 +304,7 @@
 angle::Result Context11::drawElementsInstanced(const gl::Context *context,
                                                gl::PrimitiveMode mode,
                                                GLsizei count,
-                                               GLenum type,
+                                               gl::DrawElementsType type,
                                                const void *indices,
                                                GLsizei instances)
 {
@@ -315,7 +316,7 @@
                                            GLuint start,
                                            GLuint end,
                                            GLsizei count,
-                                           GLenum type,
+                                           gl::DrawElementsType type,
                                            const void *indices)
 {
     return drawElementsImpl(context, mode, count, type, indices, 0);
@@ -330,21 +331,22 @@
         const gl::DrawArraysIndirectCommand *cmd = nullptr;
         ANGLE_TRY(ReadbackIndirectBuffer(context, indirect, &cmd));
 
-        ANGLE_TRY(mRenderer->getStateManager()->updateState(
-            context, mode, cmd->first, cmd->count, GL_NONE, nullptr, cmd->instanceCount, 0));
+        ANGLE_TRY(mRenderer->getStateManager()->updateState(context, mode, cmd->first, cmd->count,
+                                                            gl::DrawElementsType::InvalidEnum,
+                                                            nullptr, cmd->instanceCount, 0));
         return mRenderer->drawArrays(context, mode, cmd->first, cmd->count, cmd->instanceCount);
     }
     else
     {
-        ANGLE_TRY(
-            mRenderer->getStateManager()->updateState(context, mode, 0, 0, GL_NONE, nullptr, 0, 0));
+        ANGLE_TRY(mRenderer->getStateManager()->updateState(
+            context, mode, 0, 0, gl::DrawElementsType::InvalidEnum, nullptr, 0, 0));
         return mRenderer->drawArraysIndirect(context, indirect);
     }
 }
 
 angle::Result Context11::drawElementsIndirect(const gl::Context *context,
                                               gl::PrimitiveMode mode,
-                                              GLenum type,
+                                              gl::DrawElementsType type,
                                               const void *indirect)
 {
     if (DrawCallHasStreamingVertexArrays(context, mode) ||
@@ -353,9 +355,9 @@
         const gl::DrawElementsIndirectCommand *cmd = nullptr;
         ANGLE_TRY(ReadbackIndirectBuffer(context, indirect, &cmd));
 
-        const gl::Type &typeInfo = gl::GetTypeInfo(type);
-        const void *indices      = reinterpret_cast<const void *>(
-            static_cast<uintptr_t>(cmd->firstIndex * typeInfo.bytes));
+        const GLuint typeBytes = gl::GetDrawElementsTypeSize(type);
+        const void *indices =
+            reinterpret_cast<const void *>(static_cast<uintptr_t>(cmd->firstIndex * typeBytes));
 
         // We must explicitly resolve the index range for the slow-path indirect drawElements to
         // make sure we are using the correct 'baseVertex'. This parameter does not exist for the
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.h b/src/libANGLE/renderer/d3d/d3d11/Context11.h
index e2bde41..4ba58ac 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.h
@@ -83,12 +83,12 @@
     angle::Result drawElements(const gl::Context *context,
                                gl::PrimitiveMode mode,
                                GLsizei count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices) override;
     angle::Result drawElementsInstanced(const gl::Context *context,
                                         gl::PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices,
                                         GLsizei instances) override;
     angle::Result drawRangeElements(const gl::Context *context,
@@ -96,14 +96,14 @@
                                     GLuint start,
                                     GLuint end,
                                     GLsizei count,
-                                    GLenum type,
+                                    gl::DrawElementsType type,
                                     const void *indices) override;
     angle::Result drawArraysIndirect(const gl::Context *context,
                                      gl::PrimitiveMode mode,
                                      const void *indirect) override;
     angle::Result drawElementsIndirect(const gl::Context *context,
                                        gl::PrimitiveMode mode,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indirect) override;
 
     // Device loss
@@ -171,7 +171,7 @@
     angle::Result drawElementsImpl(const gl::Context *context,
                                    gl::PrimitiveMode mode,
                                    GLsizei indexCount,
-                                   GLenum indexType,
+                                   gl::DrawElementsType indexType,
                                    const void *indices,
                                    GLsizei instanceCount);
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
index 7a0d39c..3e3a2b8 100644
--- a/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.cpp
@@ -17,14 +17,18 @@
 {
 
 IndexBuffer11::IndexBuffer11(Renderer11 *const renderer)
-    : mRenderer(renderer), mBuffer(), mBufferSize(0), mIndexType(GL_NONE), mDynamicUsage(false)
+    : mRenderer(renderer),
+      mBuffer(),
+      mBufferSize(0),
+      mIndexType(gl::DrawElementsType::InvalidEnum),
+      mDynamicUsage(false)
 {}
 
 IndexBuffer11::~IndexBuffer11() {}
 
 angle::Result IndexBuffer11::initialize(const gl::Context *context,
                                         unsigned int bufferSize,
-                                        GLenum indexType,
+                                        gl::DrawElementsType indexType,
                                         bool dynamic)
 {
     mBuffer.reset();
@@ -93,7 +97,7 @@
     return angle::Result::Continue();
 }
 
-GLenum IndexBuffer11::getIndexType() const
+gl::DrawElementsType IndexBuffer11::getIndexType() const
 {
     return mIndexType;
 }
@@ -105,7 +109,7 @@
 
 angle::Result IndexBuffer11::setSize(const gl::Context *context,
                                      unsigned int bufferSize,
-                                     GLenum indexType)
+                                     gl::DrawElementsType indexType)
 {
     if (bufferSize > mBufferSize || indexType != mIndexType)
     {
@@ -136,11 +140,11 @@
 {
     switch (mIndexType)
     {
-        case GL_UNSIGNED_BYTE:
+        case gl::DrawElementsType::UnsignedByte:
             return DXGI_FORMAT_R16_UINT;
-        case GL_UNSIGNED_SHORT:
+        case gl::DrawElementsType::UnsignedShort:
             return DXGI_FORMAT_R16_UINT;
-        case GL_UNSIGNED_INT:
+        case gl::DrawElementsType::UnsignedInt:
             return DXGI_FORMAT_R32_UINT;
         default:
             UNREACHABLE();
diff --git a/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h b/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
index 76a96d7..8f6f0e6 100644
--- a/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/IndexBuffer11.h
@@ -24,7 +24,7 @@
 
     angle::Result initialize(const gl::Context *context,
                              unsigned int bufferSize,
-                             GLenum indexType,
+                             gl::DrawElementsType indexType,
                              bool dynamic) override;
 
     angle::Result mapBuffer(const gl::Context *context,
@@ -33,11 +33,11 @@
                             void **outMappedMemory) override;
     angle::Result unmapBuffer(const gl::Context *context) override;
 
-    GLenum getIndexType() const override;
+    gl::DrawElementsType getIndexType() const override;
     unsigned int getBufferSize() const override;
     angle::Result setSize(const gl::Context *context,
                           unsigned int bufferSize,
-                          GLenum indexType) override;
+                          gl::DrawElementsType indexType) override;
 
     angle::Result discard(const gl::Context *context) override;
 
@@ -49,7 +49,7 @@
 
     d3d11::Buffer mBuffer;
     unsigned int mBufferSize;
-    GLenum mIndexType;
+    gl::DrawElementsType mIndexType;
     bool mDynamicUsage;
 };
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index 059d515..743551e 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -155,7 +155,7 @@
 template <typename T>
 void CopyLineLoopIndicesWithRestart(const void *indices,
                                     size_t count,
-                                    GLenum indexType,
+                                    gl::DrawElementsType indexType,
                                     std::vector<GLuint> *bufferOut)
 {
     GLuint restartIndex    = gl::GetPrimitiveRestartIndex(indexType);
@@ -195,22 +195,22 @@
 }
 
 void GetLineLoopIndices(const void *indices,
-                        GLenum indexType,
+                        gl::DrawElementsType indexType,
                         GLuint count,
                         bool usePrimitiveRestartFixedIndex,
                         std::vector<GLuint> *bufferOut)
 {
-    if (indexType != GL_NONE && usePrimitiveRestartFixedIndex)
+    if (indexType != gl::DrawElementsType::InvalidEnum && usePrimitiveRestartFixedIndex)
     {
         switch (indexType)
         {
-            case GL_UNSIGNED_BYTE:
+            case gl::DrawElementsType::UnsignedByte:
                 CopyLineLoopIndicesWithRestart<GLubyte>(indices, count, indexType, bufferOut);
                 break;
-            case GL_UNSIGNED_SHORT:
+            case gl::DrawElementsType::UnsignedShort:
                 CopyLineLoopIndicesWithRestart<GLushort>(indices, count, indexType, bufferOut);
                 break;
-            case GL_UNSIGNED_INT:
+            case gl::DrawElementsType::UnsignedInt:
                 CopyLineLoopIndicesWithRestart<GLuint>(indices, count, indexType, bufferOut);
                 break;
             default:
@@ -226,16 +226,16 @@
     switch (indexType)
     {
         // Non-indexed draw
-        case GL_NONE:
+        case gl::DrawElementsType::InvalidEnum:
             SetLineLoopIndices(&(*bufferOut)[0], count);
             break;
-        case GL_UNSIGNED_BYTE:
+        case gl::DrawElementsType::UnsignedByte:
             CopyLineLoopIndices<GLubyte>(indices, &(*bufferOut)[0], count);
             break;
-        case GL_UNSIGNED_SHORT:
+        case gl::DrawElementsType::UnsignedShort:
             CopyLineLoopIndices<GLushort>(indices, &(*bufferOut)[0], count);
             break;
-        case GL_UNSIGNED_INT:
+        case gl::DrawElementsType::UnsignedInt:
             CopyLineLoopIndices<GLuint>(indices, &(*bufferOut)[0], count);
             break;
         default:
@@ -260,11 +260,11 @@
 template <typename T>
 void CopyTriangleFanIndicesWithRestart(const void *indices,
                                        GLuint indexCount,
-                                       GLenum indexType,
+                                       gl::DrawElementsType indexType,
                                        std::vector<GLuint> *bufferOut)
 {
     GLuint restartIndex    = gl::GetPrimitiveRestartIndex(indexType);
-    GLuint d3dRestartIndex = gl::GetPrimitiveRestartIndex(GL_UNSIGNED_INT);
+    GLuint d3dRestartIndex = gl::GetPrimitiveRestartIndex(gl::DrawElementsType::UnsignedInt);
     const T *srcPtr        = static_cast<const T *>(indices);
     Optional<GLuint> vertexA;
     Optional<GLuint> vertexB;
@@ -303,22 +303,22 @@
 }
 
 void GetTriFanIndices(const void *indices,
-                      GLenum indexType,
+                      gl::DrawElementsType indexType,
                       GLuint count,
                       bool usePrimitiveRestartFixedIndex,
                       std::vector<GLuint> *bufferOut)
 {
-    if (indexType != GL_NONE && usePrimitiveRestartFixedIndex)
+    if (indexType != gl::DrawElementsType::InvalidEnum && usePrimitiveRestartFixedIndex)
     {
         switch (indexType)
         {
-            case GL_UNSIGNED_BYTE:
+            case gl::DrawElementsType::UnsignedByte:
                 CopyTriangleFanIndicesWithRestart<GLubyte>(indices, count, indexType, bufferOut);
                 break;
-            case GL_UNSIGNED_SHORT:
+            case gl::DrawElementsType::UnsignedShort:
                 CopyTriangleFanIndicesWithRestart<GLushort>(indices, count, indexType, bufferOut);
                 break;
-            case GL_UNSIGNED_INT:
+            case gl::DrawElementsType::UnsignedInt:
                 CopyTriangleFanIndicesWithRestart<GLuint>(indices, count, indexType, bufferOut);
                 break;
             default:
@@ -335,16 +335,16 @@
     switch (indexType)
     {
         // Non-indexed draw
-        case GL_NONE:
+        case gl::DrawElementsType::InvalidEnum:
             SetTriangleFanIndices(&(*bufferOut)[0], numTris);
             break;
-        case GL_UNSIGNED_BYTE:
+        case gl::DrawElementsType::UnsignedByte:
             CopyTriangleFanIndices<GLubyte>(indices, &(*bufferOut)[0], numTris);
             break;
-        case GL_UNSIGNED_SHORT:
+        case gl::DrawElementsType::UnsignedShort:
             CopyTriangleFanIndices<GLushort>(indices, &(*bufferOut)[0], numTris);
             break;
-        case GL_UNSIGNED_INT:
+        case gl::DrawElementsType::UnsignedInt:
             CopyTriangleFanIndices<GLuint>(indices, &(*bufferOut)[0], numTris);
             break;
         default:
@@ -1503,11 +1503,11 @@
     switch (mode)
     {
         case gl::PrimitiveMode::LineLoop:
-            return drawLineLoop(context, clampedVertexCount, GL_NONE, nullptr, 0,
-                                adjustedInstanceCount);
+            return drawLineLoop(context, clampedVertexCount, gl::DrawElementsType::InvalidEnum,
+                                nullptr, 0, adjustedInstanceCount);
         case gl::PrimitiveMode::TriangleFan:
-            return drawTriangleFan(context, clampedVertexCount, GL_NONE, nullptr, 0,
-                                   adjustedInstanceCount);
+            return drawTriangleFan(context, clampedVertexCount, gl::DrawElementsType::InvalidEnum,
+                                   nullptr, 0, adjustedInstanceCount);
         case gl::PrimitiveMode::Points:
             if (getWorkarounds().useInstancedPointSpriteEmulation)
             {
@@ -1562,7 +1562,7 @@
                                        gl::PrimitiveMode mode,
                                        GLint startVertex,
                                        GLsizei indexCount,
-                                       GLenum indexType,
+                                       gl::DrawElementsType indexType,
                                        const void *indices,
                                        GLsizei instanceCount)
 {
@@ -1694,7 +1694,7 @@
 
 angle::Result Renderer11::drawLineLoop(const gl::Context *context,
                                        GLuint count,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indexPointer,
                                        int baseVertex,
                                        int instances)
@@ -1706,7 +1706,7 @@
     const void *indices = indexPointer;
 
     // Get the raw indices for an indexed draw
-    if (type != GL_NONE && elementArrayBuffer)
+    if (type != gl::DrawElementsType::InvalidEnum && elementArrayBuffer)
     {
         BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
         intptr_t offset    = reinterpret_cast<intptr_t>(indices);
@@ -1720,8 +1720,8 @@
     if (!mLineLoopIB)
     {
         mLineLoopIB = new StreamingIndexBufferInterface(this);
-        ANGLE_TRY(
-            mLineLoopIB->reserveBufferSpace(context, INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT));
+        ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, INITIAL_INDEX_BUFFER_SIZE,
+                                                  gl::DrawElementsType::UnsignedInt));
     }
 
     // Checked by Renderer11::applyPrimitiveType
@@ -1737,7 +1737,8 @@
 
     unsigned int spaceNeeded =
         static_cast<unsigned int>(sizeof(GLuint) * mScratchIndexDataBuffer.size());
-    ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, spaceNeeded, GL_UNSIGNED_INT));
+    ANGLE_TRY(
+        mLineLoopIB->reserveBufferSpace(context, spaceNeeded, gl::DrawElementsType::UnsignedInt));
 
     void *mappedMemory = nullptr;
     unsigned int offset;
@@ -1771,7 +1772,7 @@
 
 angle::Result Renderer11::drawTriangleFan(const gl::Context *context,
                                           GLuint count,
-                                          GLenum type,
+                                          gl::DrawElementsType type,
                                           const void *indices,
                                           int baseVertex,
                                           int instances)
@@ -1783,7 +1784,7 @@
     const void *indexPointer = indices;
 
     // Get the raw indices for an indexed draw
-    if (type != GL_NONE && elementArrayBuffer)
+    if (type != gl::DrawElementsType::InvalidEnum && elementArrayBuffer)
     {
         BufferD3D *storage = GetImplAs<BufferD3D>(elementArrayBuffer);
         intptr_t offset    = reinterpret_cast<intptr_t>(indices);
@@ -1798,7 +1799,7 @@
     {
         mTriangleFanIB = new StreamingIndexBufferInterface(this);
         ANGLE_TRY(mTriangleFanIB->reserveBufferSpace(context, INITIAL_INDEX_BUFFER_SIZE,
-                                                     GL_UNSIGNED_INT));
+                                                     gl::DrawElementsType::UnsignedInt));
     }
 
     // Checked by Renderer11::applyPrimitiveType
@@ -1818,7 +1819,8 @@
 
     const unsigned int spaceNeeded =
         static_cast<unsigned int>(mScratchIndexDataBuffer.size() * sizeof(unsigned int));
-    ANGLE_TRY(mTriangleFanIB->reserveBufferSpace(context, spaceNeeded, GL_UNSIGNED_INT));
+    ANGLE_TRY(mTriangleFanIB->reserveBufferSpace(context, spaceNeeded,
+                                                 gl::DrawElementsType::UnsignedInt));
 
     void *mappedMemory = nullptr;
     unsigned int offset;
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
index dd19d65..6c9f60e 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
@@ -408,7 +408,7 @@
                                gl::PrimitiveMode mode,
                                GLint startVertex,
                                GLsizei indexCount,
-                               GLenum indexType,
+                               gl::DrawElementsType indexType,
                                const void *indices,
                                GLsizei instanceCount);
     angle::Result drawArraysIndirect(const gl::Context *context, const void *indirect);
@@ -509,13 +509,13 @@
 
     angle::Result drawLineLoop(const gl::Context *context,
                                GLuint count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices,
                                int baseVertex,
                                int instances);
     angle::Result drawTriangleFan(const gl::Context *context,
                                   GLuint count,
-                                  GLenum type,
+                                  gl::DrawElementsType type,
                                   const void *indices,
                                   int baseVertex,
                                   int instances);
diff --git a/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
index 937801e..890ff57 100644
--- a/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
@@ -2052,7 +2052,7 @@
                                           gl::PrimitiveMode mode,
                                           GLint firstVertex,
                                           GLsizei vertexOrIndexCount,
-                                          GLenum indexTypeOrNone,
+                                          gl::DrawElementsType indexTypeOrInvalid,
                                           const void *indices,
                                           GLsizei instanceCount,
                                           GLint baseVertex)
@@ -2098,7 +2098,7 @@
     }
 
     ANGLE_TRY(mVertexArray11->syncStateForDraw(context, firstVertex, vertexOrIndexCount,
-                                               indexTypeOrNone, indices, instanceCount,
+                                               indexTypeOrInvalid, indices, instanceCount,
                                                baseVertex));
 
     // Changes in the draw call can affect the vertex buffer translations.
@@ -2108,9 +2108,9 @@
         invalidateInputLayout();
     }
 
-    if (indexTypeOrNone != GL_NONE)
+    if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
     {
-        ANGLE_TRY(applyIndexBuffer(context, vertexOrIndexCount, indexTypeOrNone, indices));
+        ANGLE_TRY(applyIndexBuffer(context, vertexOrIndexCount, indexTypeOrInvalid, indices));
     }
 
     if (mLastAppliedDrawMode != mode)
@@ -2185,7 +2185,7 @@
                 break;
             case DIRTY_BIT_VERTEX_BUFFERS_AND_INPUT_LAYOUT:
                 ANGLE_TRY(syncVertexBuffersAndInputLayout(context, mode, firstVertex,
-                                                          vertexOrIndexCount, indexTypeOrNone,
+                                                          vertexOrIndexCount, indexTypeOrInvalid,
                                                           instanceCount));
                 break;
             case DIRTY_BIT_PRIMITIVE_TOPOLOGY:
@@ -2802,12 +2802,13 @@
     return angle::Result::Continue();
 }
 
-angle::Result StateManager11::syncVertexBuffersAndInputLayout(const gl::Context *context,
-                                                              gl::PrimitiveMode mode,
-                                                              GLint firstVertex,
-                                                              GLsizei vertexOrIndexCount,
-                                                              GLenum indexTypeOrNone,
-                                                              GLsizei instanceCount)
+angle::Result StateManager11::syncVertexBuffersAndInputLayout(
+    const gl::Context *context,
+    gl::PrimitiveMode mode,
+    GLint firstVertex,
+    GLsizei vertexOrIndexCount,
+    gl::DrawElementsType indexTypeOrInvalid,
+    GLsizei instanceCount)
 {
     const auto &vertexArrayAttribs = mVertexArray11->getTranslatedAttribs();
 
@@ -2842,14 +2843,14 @@
     setInputLayoutInternal(inputLayout);
 
     // Update the applied vertex buffers.
-    ANGLE_TRY(applyVertexBuffers(context, mode, indexTypeOrNone, firstVertex));
+    ANGLE_TRY(applyVertexBuffers(context, mode, indexTypeOrInvalid, firstVertex));
 
     return angle::Result::Continue();
 }
 
 angle::Result StateManager11::applyVertexBuffers(const gl::Context *context,
                                                  gl::PrimitiveMode mode,
-                                                 GLenum indexTypeOrNone,
+                                                 gl::DrawElementsType indexTypeOrInvalid,
                                                  GLint firstVertex)
 {
     bool programUsesInstancedPointSprites =
@@ -2882,7 +2883,8 @@
                 ASSERT(attrib.vertexBuffer.get());
                 buffer = GetAs<VertexBuffer11>(attrib.vertexBuffer.get())->getBuffer().get();
             }
-            else if (instancedPointSpritesActive && indexTypeOrNone != GL_NONE)
+            else if (instancedPointSpritesActive &&
+                     indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
             {
                 ASSERT(mVertexArray11->isCachedIndexInfoValid());
                 TranslatedIndexData indexInfo = mVertexArray11->getCachedIndexInfo();
@@ -2997,7 +2999,7 @@
 
 angle::Result StateManager11::applyIndexBuffer(const gl::Context *context,
                                                GLsizei indexCount,
-                                               GLenum indexType,
+                                               gl::DrawElementsType indexType,
                                                const void *indices)
 {
     if (!mIndexBufferIsDirty)
@@ -3006,16 +3008,17 @@
         return angle::Result::Continue();
     }
 
-    GLenum destElementType         = mVertexArray11->getCachedDestinationIndexType();
-    gl::Buffer *elementArrayBuffer = mVertexArray11->getState().getElementArrayBuffer();
+    gl::DrawElementsType destElementType = mVertexArray11->getCachedDestinationIndexType();
+    gl::Buffer *elementArrayBuffer       = mVertexArray11->getState().getElementArrayBuffer();
 
     TranslatedIndexData indexInfo;
     ANGLE_TRY(mIndexDataManager.prepareIndexData(context, indexType, destElementType, indexCount,
                                                  elementArrayBuffer, indices, &indexInfo));
 
-    ID3D11Buffer *buffer = nullptr;
-    DXGI_FORMAT bufferFormat =
-        (indexInfo.indexType == GL_UNSIGNED_INT) ? DXGI_FORMAT_R32_UINT : DXGI_FORMAT_R16_UINT;
+    ID3D11Buffer *buffer     = nullptr;
+    DXGI_FORMAT bufferFormat = (indexInfo.indexType == gl::DrawElementsType::UnsignedInt)
+                                   ? DXGI_FORMAT_R32_UINT
+                                   : DXGI_FORMAT_R16_UINT;
 
     if (indexInfo.storage)
     {
diff --git a/src/libANGLE/renderer/d3d/d3d11/StateManager11.h b/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
index 6ca8da9..eb22232 100644
--- a/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
@@ -212,7 +212,7 @@
                               gl::PrimitiveMode mode,
                               GLint firstVertex,
                               GLsizei vertexOrIndexCount,
-                              GLenum indexTypeOrNone,
+                              gl::DrawElementsType indexTypeOrInvalid,
                               const void *indices,
                               GLsizei instanceCount,
                               GLint baseVertex);
@@ -365,14 +365,14 @@
                                                   gl::PrimitiveMode mode,
                                                   GLint firstVertex,
                                                   GLsizei vertexOrIndexCount,
-                                                  GLenum indexTypeOrNone,
+                                                  gl::DrawElementsType indexTypeOrInvalid,
                                                   GLsizei instanceCount);
 
     bool setInputLayoutInternal(const d3d11::InputLayout *inputLayout);
 
     angle::Result applyVertexBuffers(const gl::Context *context,
                                      gl::PrimitiveMode mode,
-                                     GLenum indexTypeOrNone,
+                                     gl::DrawElementsType indexTypeOrInvalid,
                                      GLint firstVertex);
     // TODO(jmadill): Migrate to d3d11::Buffer.
     bool queueVertexBufferChange(size_t bufferIndex,
@@ -386,7 +386,7 @@
     // Not handled by an internal dirty bit because it isn't synced on drawArrays calls.
     angle::Result applyIndexBuffer(const gl::Context *context,
                                    GLsizei indexCount,
-                                   GLenum indexType,
+                                   gl::DrawElementsType indexType,
                                    const void *indices);
 
     enum DirtyBitType
diff --git a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
index 27321b0..c12cfd0 100644
--- a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
@@ -25,7 +25,7 @@
       mTranslatedAttribs(data.getMaxAttribs()),
       mAppliedNumViewsToDivisor(1),
       mCurrentElementArrayStorage(IndexStorageType::Invalid),
-      mCachedDestinationIndexType(GL_NONE)
+      mCachedDestinationIndexType(gl::DrawElementsType::InvalidEnum)
 {}
 
 VertexArray11::~VertexArray11() {}
@@ -122,7 +122,7 @@
 angle::Result VertexArray11::syncStateForDraw(const gl::Context *context,
                                               GLint firstVertex,
                                               GLsizei vertexOrIndexCount,
-                                              GLenum indexTypeOrNone,
+                                              gl::DrawElementsType indexTypeOrInvalid,
                                               const void *indices,
                                               GLsizei instances,
                                               GLint baseVertex)
@@ -156,24 +156,24 @@
         if (activeDynamicAttribs.any())
         {
             ANGLE_TRY(updateDynamicAttribs(context, stateManager->getVertexDataManager(),
-                                           firstVertex, vertexOrIndexCount, indexTypeOrNone,
+                                           firstVertex, vertexOrIndexCount, indexTypeOrInvalid,
                                            indices, instances, baseVertex, activeDynamicAttribs));
             stateManager->invalidateInputLayout();
         }
     }
 
-    if (indexTypeOrNone != GL_NONE)
+    if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
     {
         bool restartEnabled = context->getGLState().isPrimitiveRestartEnabled();
-        if (!mLastDrawElementsType.valid() || mLastDrawElementsType.value() != indexTypeOrNone ||
+        if (!mLastDrawElementsType.valid() || mLastDrawElementsType.value() != indexTypeOrInvalid ||
             mLastDrawElementsIndices.value() != indices ||
             mLastPrimitiveRestartEnabled.value() != restartEnabled)
         {
-            mLastDrawElementsType        = indexTypeOrNone;
+            mLastDrawElementsType        = indexTypeOrInvalid;
             mLastDrawElementsIndices     = indices;
             mLastPrimitiveRestartEnabled = restartEnabled;
 
-            ANGLE_TRY(updateElementArrayStorage(context, vertexOrIndexCount, indexTypeOrNone,
+            ANGLE_TRY(updateElementArrayStorage(context, vertexOrIndexCount, indexTypeOrInvalid,
                                                 indices, restartEnabled));
             stateManager->invalidateIndexBuffer();
         }
@@ -188,7 +188,7 @@
 
 angle::Result VertexArray11::updateElementArrayStorage(const gl::Context *context,
                                                        GLsizei indexCount,
-                                                       GLenum indexType,
+                                                       gl::DrawElementsType indexType,
                                                        const void *indices,
                                                        bool restartEnabled)
 {
@@ -286,7 +286,7 @@
                                                   VertexDataManager *vertexDataManager,
                                                   GLint firstVertex,
                                                   GLsizei vertexOrIndexCount,
-                                                  GLenum indexTypeOrNone,
+                                                  gl::DrawElementsType indexTypeOrInvalid,
                                                   const void *indices,
                                                   GLsizei instances,
                                                   GLint baseVertex,
@@ -298,8 +298,8 @@
 
     GLint startVertex;
     size_t vertexCount;
-    ANGLE_TRY(GetVertexRangeInfo(context, firstVertex, vertexOrIndexCount, indexTypeOrNone, indices,
-                                 baseVertex, &startVertex, &vertexCount));
+    ANGLE_TRY(GetVertexRangeInfo(context, firstVertex, vertexOrIndexCount, indexTypeOrInvalid,
+                                 indices, baseVertex, &startVertex, &vertexCount));
 
     for (size_t dynamicAttribIndex : activeDynamicAttribs)
     {
@@ -352,7 +352,7 @@
     return mCachedIndexInfo.valid();
 }
 
-GLenum VertexArray11::getCachedDestinationIndexType() const
+gl::DrawElementsType VertexArray11::getCachedDestinationIndexType() const
 {
     return mCachedDestinationIndexType;
 }
diff --git a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
index f75f1fd..9930b14 100644
--- a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
@@ -36,7 +36,7 @@
     angle::Result syncStateForDraw(const gl::Context *context,
                                    GLint firstVertex,
                                    GLsizei vertexOrIndexCount,
-                                   GLenum indexTypeOrNone,
+                                   gl::DrawElementsType indexTypeOrInvalid,
                                    const void *indices,
                                    GLsizei instances,
                                    GLint baseVertex);
@@ -56,7 +56,7 @@
     void updateCachedIndexInfo(const TranslatedIndexData &indexInfo);
     bool isCachedIndexInfoValid() const;
 
-    GLenum getCachedDestinationIndexType() const;
+    gl::DrawElementsType getCachedDestinationIndexType() const;
 
   private:
     void updateVertexAttribStorage(const gl::Context *context,
@@ -68,7 +68,7 @@
                                        VertexDataManager *vertexDataManager,
                                        GLint firstVertex,
                                        GLsizei vertexOrIndexCount,
-                                       GLenum indexTypeOrNone,
+                                       gl::DrawElementsType indexTypeOrInvalid,
                                        const void *indices,
                                        GLsizei instances,
                                        GLint baseVertex,
@@ -76,7 +76,7 @@
 
     angle::Result updateElementArrayStorage(const gl::Context *context,
                                             GLsizei indexCount,
-                                            GLenum indexType,
+                                            gl::DrawElementsType indexType,
                                             const void *indices,
                                             bool restartEnabled);
 
@@ -95,12 +95,12 @@
     int mAppliedNumViewsToDivisor;
 
     // If the index buffer needs re-streaming.
-    Optional<GLenum> mLastDrawElementsType;
+    Optional<gl::DrawElementsType> mLastDrawElementsType;
     Optional<const void *> mLastDrawElementsIndices;
     Optional<bool> mLastPrimitiveRestartEnabled;
     IndexStorageType mCurrentElementArrayStorage;
     Optional<TranslatedIndexData> mCachedIndexInfo;
-    GLenum mCachedDestinationIndexType;
+    gl::DrawElementsType mCachedDestinationIndexType;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
index f262b2d..ba4af4c 100644
--- a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
@@ -2503,17 +2503,18 @@
             renderer->presentPathFastEnabled());
 }
 
-bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled, GLenum type)
+bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled,
+                                   gl::DrawElementsType type)
 {
     // We should never have to deal with primitive restart workaround issue with GL_UNSIGNED_INT
     // indices, since we restrict it via MAX_ELEMENT_INDEX.
-    return (!primitiveRestartFixedIndexEnabled && type == GL_UNSIGNED_SHORT);
+    return (!primitiveRestartFixedIndexEnabled && type == gl::DrawElementsType::UnsignedShort);
 }
 
 IndexStorageType ClassifyIndexStorage(const gl::State &glState,
                                       const gl::Buffer *elementArrayBuffer,
-                                      GLenum elementType,
-                                      GLenum destElementType,
+                                      gl::DrawElementsType elementType,
+                                      gl::DrawElementsType destElementType,
                                       unsigned int offset)
 {
     // No buffer bound means we are streaming from a client pointer.
diff --git a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
index c1e2f1a..ed5b5ec 100644
--- a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
+++ b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
@@ -422,7 +422,8 @@
 };
 
 bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer);
-bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled, GLenum type);
+bool UsePrimitiveRestartWorkaround(bool primitiveRestartFixedIndexEnabled,
+                                   gl::DrawElementsType type);
 
 enum class IndexStorageType
 {
@@ -443,8 +444,8 @@
 
 IndexStorageType ClassifyIndexStorage(const gl::State &glState,
                                       const gl::Buffer *elementArrayBuffer,
-                                      GLenum elementType,
-                                      GLenum destElementType,
+                                      gl::DrawElementsType elementType,
+                                      gl::DrawElementsType destElementType,
                                       unsigned int offset);
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
index 412a20f..62422e4 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
@@ -163,7 +163,7 @@
 angle::Result Context9::drawElements(const gl::Context *context,
                                      gl::PrimitiveMode mode,
                                      GLsizei count,
-                                     GLenum type,
+                                     gl::DrawElementsType type,
                                      const void *indices)
 {
     return mRenderer->genericDrawElements(context, mode, count, type, indices, 0);
@@ -172,7 +172,7 @@
 angle::Result Context9::drawElementsInstanced(const gl::Context *context,
                                               gl::PrimitiveMode mode,
                                               GLsizei count,
-                                              GLenum type,
+                                              gl::DrawElementsType type,
                                               const void *indices,
                                               GLsizei instances)
 {
@@ -184,7 +184,7 @@
                                           GLuint start,
                                           GLuint end,
                                           GLsizei count,
-                                          GLenum type,
+                                          gl::DrawElementsType type,
                                           const void *indices)
 {
     return mRenderer->genericDrawElements(context, mode, count, type, indices, 0);
@@ -200,7 +200,7 @@
 
 angle::Result Context9::drawElementsIndirect(const gl::Context *context,
                                              gl::PrimitiveMode mode,
-                                             GLenum type,
+                                             gl::DrawElementsType type,
                                              const void *indirect)
 {
     ANGLE_HR_UNREACHABLE(this);
diff --git a/src/libANGLE/renderer/d3d/d3d9/Context9.h b/src/libANGLE/renderer/d3d/d3d9/Context9.h
index f9f1456..ba4f29a 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Context9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Context9.h
@@ -82,12 +82,12 @@
     angle::Result drawElements(const gl::Context *context,
                                gl::PrimitiveMode mode,
                                GLsizei count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices) override;
     angle::Result drawElementsInstanced(const gl::Context *context,
                                         gl::PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices,
                                         GLsizei instances) override;
     angle::Result drawRangeElements(const gl::Context *context,
@@ -95,14 +95,14 @@
                                     GLuint start,
                                     GLuint end,
                                     GLsizei count,
-                                    GLenum type,
+                                    gl::DrawElementsType type,
                                     const void *indices) override;
     angle::Result drawArraysIndirect(const gl::Context *context,
                                      gl::PrimitiveMode mode,
                                      const void *indirect) override;
     angle::Result drawElementsIndirect(const gl::Context *context,
                                        gl::PrimitiveMode mode,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indirect) override;
 
     // Device loss
diff --git a/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp b/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
index f1b2cc4..ce1fdb7 100644
--- a/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.cpp
@@ -18,7 +18,7 @@
 {
     mIndexBuffer = nullptr;
     mBufferSize  = 0;
-    mIndexType   = 0;
+    mIndexType   = gl::DrawElementsType::InvalidEnum;
     mDynamic     = false;
 }
 
@@ -29,7 +29,7 @@
 
 angle::Result IndexBuffer9::initialize(const gl::Context *context,
                                        unsigned int bufferSize,
-                                       GLenum indexType,
+                                       gl::DrawElementsType indexType,
                                        bool dynamic)
 {
     SafeRelease(mIndexBuffer);
@@ -39,11 +39,12 @@
     if (bufferSize > 0)
     {
         D3DFORMAT format = D3DFMT_UNKNOWN;
-        if (indexType == GL_UNSIGNED_SHORT || indexType == GL_UNSIGNED_BYTE)
+        if (indexType == gl::DrawElementsType::UnsignedShort ||
+            indexType == gl::DrawElementsType::UnsignedByte)
         {
             format = D3DFMT_INDEX16;
         }
-        else if (indexType == GL_UNSIGNED_INT)
+        else if (indexType == gl::DrawElementsType::UnsignedInt)
         {
             ASSERT(mRenderer->getNativeExtensions().elementIndexUint);
             format = D3DFMT_INDEX32;
@@ -96,7 +97,7 @@
     return angle::Result::Continue();
 }
 
-GLenum IndexBuffer9::getIndexType() const
+gl::DrawElementsType IndexBuffer9::getIndexType() const
 {
     return mIndexType;
 }
@@ -108,7 +109,7 @@
 
 angle::Result IndexBuffer9::setSize(const gl::Context *context,
                                     unsigned int bufferSize,
-                                    GLenum indexType)
+                                    gl::DrawElementsType indexType)
 {
     if (bufferSize > mBufferSize || indexType != mIndexType)
     {
@@ -140,11 +141,11 @@
 {
     switch (mIndexType)
     {
-        case GL_UNSIGNED_BYTE:
+        case gl::DrawElementsType::UnsignedByte:
             return D3DFMT_INDEX16;
-        case GL_UNSIGNED_SHORT:
+        case gl::DrawElementsType::UnsignedShort:
             return D3DFMT_INDEX16;
-        case GL_UNSIGNED_INT:
+        case gl::DrawElementsType::UnsignedInt:
             return D3DFMT_INDEX32;
         default:
             UNREACHABLE();
diff --git a/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h b/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h
index 0aaf525..ca7cc20 100644
--- a/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/IndexBuffer9.h
@@ -23,7 +23,7 @@
 
     angle::Result initialize(const gl::Context *context,
                              unsigned int bufferSize,
-                             GLenum indexType,
+                             gl::DrawElementsType indexType,
                              bool dynamic) override;
 
     angle::Result mapBuffer(const gl::Context *context,
@@ -32,11 +32,11 @@
                             void **outMappedMemory) override;
     angle::Result unmapBuffer(const gl::Context *context) override;
 
-    GLenum getIndexType() const override;
+    gl::DrawElementsType getIndexType() const override;
     unsigned int getBufferSize() const override;
     angle::Result setSize(const gl::Context *context,
                           unsigned int bufferSize,
-                          GLenum indexType) override;
+                          gl::DrawElementsType indexType) override;
 
     angle::Result discard(const gl::Context *context) override;
 
@@ -48,7 +48,7 @@
 
     IDirect3DIndexBuffer9 *mIndexBuffer;
     unsigned int mBufferSize;
-    GLenum mIndexType;
+    gl::DrawElementsType mIndexType;
     bool mDynamic;
 };
 
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index f578328..4fa012d 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -1301,13 +1301,13 @@
                                           const void *indices,
                                           GLsizei count,
                                           gl::PrimitiveMode mode,
-                                          GLenum type,
+                                          gl::DrawElementsType type,
                                           TranslatedIndexData *indexInfo)
 {
     gl::VertexArray *vao           = context->getGLState().getVertexArray();
     gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer();
 
-    GLenum dstType = GL_NONE;
+    gl::DrawElementsType dstType = gl::DrawElementsType::InvalidEnum;
     ANGLE_TRY(GetIndexTranslationDestType(context, count, type, indices, false, &dstType));
 
     ANGLE_TRY(mIndexDataManager->prepareIndexData(context, type, dstType, count, elementArrayBuffer,
@@ -1339,7 +1339,7 @@
 
     if (mode == gl::PrimitiveMode::LineLoop)
     {
-        return drawLineLoop(context, count, GL_NONE, nullptr, 0, nullptr);
+        return drawLineLoop(context, count, gl::DrawElementsType::InvalidEnum, nullptr, 0, nullptr);
     }
 
     if (instances > 0)
@@ -1371,7 +1371,7 @@
 angle::Result Renderer9::drawElementsImpl(const gl::Context *context,
                                           gl::PrimitiveMode mode,
                                           GLsizei count,
-                                          GLenum type,
+                                          gl::DrawElementsType type,
                                           const void *indices,
                                           GLsizei instances)
 {
@@ -1415,13 +1415,13 @@
 
 angle::Result Renderer9::drawLineLoop(const gl::Context *context,
                                       GLsizei count,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       const void *indices,
                                       int minIndex,
                                       gl::Buffer *elementArrayBuffer)
 {
     // Get the raw indices for an indexed draw
-    if (type != GL_NONE && elementArrayBuffer)
+    if (type != gl::DrawElementsType::InvalidEnum && elementArrayBuffer)
     {
         BufferD3D *storage        = GetImplAs<BufferD3D>(elementArrayBuffer);
         intptr_t offset           = reinterpret_cast<intptr_t>(indices);
@@ -1439,7 +1439,7 @@
         {
             mLineLoopIB = new StreamingIndexBufferInterface(this);
             ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, INITIAL_INDEX_BUFFER_SIZE,
-                                                      GL_UNSIGNED_INT));
+                                                      gl::DrawElementsType::UnsignedInt));
         }
 
         // Checked by Renderer9::applyPrimitiveType
@@ -1454,7 +1454,8 @@
 
         const unsigned int spaceNeeded =
             (static_cast<unsigned int>(count) + 1) * sizeof(unsigned int);
-        ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, spaceNeeded, GL_UNSIGNED_INT));
+        ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, spaceNeeded,
+                                                  gl::DrawElementsType::UnsignedInt));
 
         void *mappedMemory  = nullptr;
         unsigned int offset = 0;
@@ -1465,28 +1466,28 @@
 
         switch (type)
         {
-            case GL_NONE:  // Non-indexed draw
+            case gl::DrawElementsType::InvalidEnum:  // Non-indexed draw
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = i;
                 }
                 data[count] = 0;
                 break;
-            case GL_UNSIGNED_BYTE:
+            case gl::DrawElementsType::UnsignedByte:
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<const GLubyte *>(indices)[i];
                 }
                 data[count] = static_cast<const GLubyte *>(indices)[0];
                 break;
-            case GL_UNSIGNED_SHORT:
+            case gl::DrawElementsType::UnsignedShort:
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<const GLushort *>(indices)[i];
                 }
                 data[count] = static_cast<const GLushort *>(indices)[0];
                 break;
-            case GL_UNSIGNED_INT:
+            case gl::DrawElementsType::UnsignedInt:
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<const GLuint *>(indices)[i];
@@ -1505,7 +1506,7 @@
         {
             mLineLoopIB = new StreamingIndexBufferInterface(this);
             ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, INITIAL_INDEX_BUFFER_SIZE,
-                                                      GL_UNSIGNED_SHORT));
+                                                      gl::DrawElementsType::UnsignedShort));
         }
 
         // Checked by Renderer9::applyPrimitiveType
@@ -1520,7 +1521,8 @@
 
         const unsigned int spaceNeeded =
             (static_cast<unsigned int>(count) + 1) * sizeof(unsigned short);
-        ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, spaceNeeded, GL_UNSIGNED_SHORT));
+        ANGLE_TRY(mLineLoopIB->reserveBufferSpace(context, spaceNeeded,
+                                                  gl::DrawElementsType::UnsignedShort));
 
         void *mappedMemory = nullptr;
         unsigned int offset;
@@ -1531,28 +1533,28 @@
 
         switch (type)
         {
-            case GL_NONE:  // Non-indexed draw
+            case gl::DrawElementsType::InvalidEnum:  // Non-indexed draw
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<unsigned short>(i);
                 }
                 data[count] = 0;
                 break;
-            case GL_UNSIGNED_BYTE:
+            case gl::DrawElementsType::UnsignedByte:
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<const GLubyte *>(indices)[i];
                 }
                 data[count] = static_cast<const GLubyte *>(indices)[0];
                 break;
-            case GL_UNSIGNED_SHORT:
+            case gl::DrawElementsType::UnsignedShort:
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<const GLushort *>(indices)[i];
                 }
                 data[count] = static_cast<const GLushort *>(indices)[0];
                 break;
-            case GL_UNSIGNED_INT:
+            case gl::DrawElementsType::UnsignedInt:
                 for (int i = 0; i < count; i++)
                 {
                     data[i] = static_cast<unsigned short>(static_cast<const GLuint *>(indices)[i]);
@@ -1581,7 +1583,7 @@
 
 angle::Result Renderer9::drawIndexedPoints(const gl::Context *context,
                                            GLsizei count,
-                                           GLenum type,
+                                           gl::DrawElementsType type,
                                            const void *indices,
                                            int minIndex,
                                            gl::Buffer *elementArrayBuffer)
@@ -1601,13 +1603,13 @@
 
     switch (type)
     {
-        case GL_UNSIGNED_BYTE:
+        case gl::DrawElementsType::UnsignedByte:
             DrawPoints<GLubyte>(mDevice, count, indices, minIndex);
             return angle::Result::Continue();
-        case GL_UNSIGNED_SHORT:
+        case gl::DrawElementsType::UnsignedShort:
             DrawPoints<GLushort>(mDevice, count, indices, minIndex);
             return angle::Result::Continue();
-        case GL_UNSIGNED_INT:
+        case gl::DrawElementsType::UnsignedInt:
             DrawPoints<GLuint>(mDevice, count, indices, minIndex);
             return angle::Result::Continue();
         default:
@@ -1628,7 +1630,8 @@
         {
             SafeDelete(mCountingIB);
             mCountingIB = new StaticIndexBufferInterface(this);
-            ANGLE_TRY(mCountingIB->reserveBufferSpace(context, spaceNeeded, GL_UNSIGNED_SHORT));
+            ANGLE_TRY(mCountingIB->reserveBufferSpace(context, spaceNeeded,
+                                                      gl::DrawElementsType::UnsignedShort));
 
             void *mappedMemory = nullptr;
             ANGLE_TRY(mCountingIB->mapBuffer(context, spaceNeeded, &mappedMemory, nullptr));
@@ -1650,7 +1653,8 @@
         {
             SafeDelete(mCountingIB);
             mCountingIB = new StaticIndexBufferInterface(this);
-            ANGLE_TRY(mCountingIB->reserveBufferSpace(context, spaceNeeded, GL_UNSIGNED_INT));
+            ANGLE_TRY(mCountingIB->reserveBufferSpace(context, spaceNeeded,
+                                                      gl::DrawElementsType::UnsignedInt));
 
             void *mappedMemory = nullptr;
             ANGLE_TRY(mCountingIB->mapBuffer(context, spaceNeeded, &mappedMemory, nullptr));
@@ -2972,7 +2976,7 @@
 angle::Result Renderer9::genericDrawElements(const gl::Context *context,
                                              gl::PrimitiveMode mode,
                                              GLsizei count,
-                                             GLenum type,
+                                             gl::DrawElementsType type,
                                              const void *indices,
                                              GLsizei instances)
 {
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.h b/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
index ffe57ba..a0444a8 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
@@ -159,7 +159,7 @@
                                    const void *indices,
                                    GLsizei count,
                                    gl::PrimitiveMode mode,
-                                   GLenum type,
+                                   gl::DrawElementsType type,
                                    TranslatedIndexData *indexInfo);
 
     void clear(const ClearParameters &clearParams,
@@ -390,7 +390,7 @@
     angle::Result genericDrawElements(const gl::Context *context,
                                       gl::PrimitiveMode mode,
                                       GLsizei count,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       const void *indices,
                                       GLsizei instances);
 
@@ -424,7 +424,7 @@
     angle::Result drawElementsImpl(const gl::Context *context,
                                    gl::PrimitiveMode mode,
                                    GLsizei count,
-                                   GLenum type,
+                                   gl::DrawElementsType type,
                                    const void *indices,
                                    GLsizei instances);
 
@@ -450,13 +450,13 @@
 
     angle::Result drawLineLoop(const gl::Context *context,
                                GLsizei count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices,
                                int minIndex,
                                gl::Buffer *elementArrayBuffer);
     angle::Result drawIndexedPoints(const gl::Context *context,
                                     GLsizei count,
-                                    GLenum type,
+                                    gl::DrawElementsType type,
                                     const void *indices,
                                     int minIndex,
                                     gl::Buffer *elementArrayBuffer);
diff --git a/src/libANGLE/renderer/gl/BufferGL.cpp b/src/libANGLE/renderer/gl/BufferGL.cpp
index 261c951..22920db 100644
--- a/src/libANGLE/renderer/gl/BufferGL.cpp
+++ b/src/libANGLE/renderer/gl/BufferGL.cpp
@@ -195,7 +195,7 @@
 }
 
 angle::Result BufferGL::getIndexRange(const gl::Context *context,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       size_t offset,
                                       size_t count,
                                       bool primitiveRestartEnabled,
@@ -212,10 +212,10 @@
     {
         mStateManager->bindBuffer(DestBufferOperationTarget, mBufferID);
 
-        const gl::Type &typeInfo = gl::GetTypeInfo(type);
+        const GLuint typeBytes = gl::GetDrawElementsTypeSize(type);
         const uint8_t *bufferData =
             MapBufferRangeWithFallback(mFunctions, gl::ToGLenum(DestBufferOperationTarget), offset,
-                                       count * typeInfo.bytes, GL_MAP_READ_BIT);
+                                       count * typeBytes, GL_MAP_READ_BIT);
         *outRange = gl::ComputeIndexRange(type, bufferData, count, primitiveRestartEnabled);
         mFunctions->unmapBuffer(gl::ToGLenum(DestBufferOperationTarget));
     }
diff --git a/src/libANGLE/renderer/gl/BufferGL.h b/src/libANGLE/renderer/gl/BufferGL.h
index 285da0c..1d93faa 100644
--- a/src/libANGLE/renderer/gl/BufferGL.h
+++ b/src/libANGLE/renderer/gl/BufferGL.h
@@ -50,7 +50,7 @@
     angle::Result unmap(const gl::Context *context, GLboolean *result) override;
 
     angle::Result getIndexRange(const gl::Context *context,
-                                GLenum type,
+                                gl::DrawElementsType type,
                                 size_t offset,
                                 size_t count,
                                 bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/gl/ContextGL.cpp b/src/libANGLE/renderer/gl/ContextGL.cpp
index e8b9846..65edb91 100644
--- a/src/libANGLE/renderer/gl/ContextGL.cpp
+++ b/src/libANGLE/renderer/gl/ContextGL.cpp
@@ -204,7 +204,7 @@
 
 ANGLE_INLINE angle::Result ContextGL::setDrawElementsState(const gl::Context *context,
                                                            GLsizei count,
-                                                           GLenum type,
+                                                           gl::DrawElementsType type,
                                                            const void *indices,
                                                            GLsizei instanceCount,
                                                            const void **outIndices)
@@ -283,7 +283,7 @@
 angle::Result ContextGL::drawElements(const gl::Context *context,
                                       gl::PrimitiveMode mode,
                                       GLsizei count,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       const void *indices)
 {
     const gl::Program *program  = context->getGLState().getProgram();
@@ -294,11 +294,11 @@
     ANGLE_TRY(setDrawElementsState(context, count, type, indices, instanceCount, &drawIndexPtr));
     if (!usesMultiview)
     {
-        getFunctions()->drawElements(ToGLenum(mode), count, type, drawIndexPtr);
+        getFunctions()->drawElements(ToGLenum(mode), count, ToGLenum(type), drawIndexPtr);
     }
     else
     {
-        getFunctions()->drawElementsInstanced(ToGLenum(mode), count, type, drawIndexPtr,
+        getFunctions()->drawElementsInstanced(ToGLenum(mode), count, ToGLenum(type), drawIndexPtr,
                                               instanceCount);
     }
     return angle::Result::Continue();
@@ -307,7 +307,7 @@
 angle::Result ContextGL::drawElementsInstanced(const gl::Context *context,
                                                gl::PrimitiveMode mode,
                                                GLsizei count,
-                                               GLenum type,
+                                               gl::DrawElementsType type,
                                                const void *indices,
                                                GLsizei instances)
 {
@@ -321,7 +321,7 @@
 
     ANGLE_TRY(setDrawElementsState(context, count, type, indices, adjustedInstanceCount,
                                    &drawIndexPointer));
-    getFunctions()->drawElementsInstanced(ToGLenum(mode), count, type, drawIndexPointer,
+    getFunctions()->drawElementsInstanced(ToGLenum(mode), count, ToGLenum(type), drawIndexPointer,
                                           adjustedInstanceCount);
     return angle::Result::Continue();
 }
@@ -331,7 +331,7 @@
                                            GLuint start,
                                            GLuint end,
                                            GLsizei count,
-                                           GLenum type,
+                                           gl::DrawElementsType type,
                                            const void *indices)
 {
     const gl::Program *program   = context->getGLState().getProgram();
@@ -343,13 +343,13 @@
         setDrawElementsState(context, count, type, indices, instanceCount, &drawIndexPointer));
     if (!usesMultiview)
     {
-        getFunctions()->drawRangeElements(ToGLenum(mode), start, end, count, type,
+        getFunctions()->drawRangeElements(ToGLenum(mode), start, end, count, ToGLenum(type),
                                           drawIndexPointer);
     }
     else
     {
-        getFunctions()->drawElementsInstanced(ToGLenum(mode), count, type, drawIndexPointer,
-                                              instanceCount);
+        getFunctions()->drawElementsInstanced(ToGLenum(mode), count, ToGLenum(type),
+                                              drawIndexPointer, instanceCount);
     }
     return angle::Result::Continue();
 }
@@ -365,11 +365,11 @@
 
 angle::Result ContextGL::drawElementsIndirect(const gl::Context *context,
                                               gl::PrimitiveMode mode,
-                                              GLenum type,
+                                              gl::DrawElementsType type,
                                               const void *indirect)
 {
     ANGLE_TRY(setDrawIndirectState(context));
-    getFunctions()->drawElementsIndirect(ToGLenum(mode), type, indirect);
+    getFunctions()->drawElementsIndirect(ToGLenum(mode), ToGLenum(type), indirect);
     return angle::Result::Continue();
 }
 
diff --git a/src/libANGLE/renderer/gl/ContextGL.h b/src/libANGLE/renderer/gl/ContextGL.h
index 3ae0161..5077036 100644
--- a/src/libANGLE/renderer/gl/ContextGL.h
+++ b/src/libANGLE/renderer/gl/ContextGL.h
@@ -91,12 +91,12 @@
     angle::Result drawElements(const gl::Context *context,
                                gl::PrimitiveMode mode,
                                GLsizei count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices) override;
     angle::Result drawElementsInstanced(const gl::Context *context,
                                         gl::PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices,
                                         GLsizei instances) override;
     angle::Result drawRangeElements(const gl::Context *context,
@@ -104,14 +104,14 @@
                                     GLuint start,
                                     GLuint end,
                                     GLsizei count,
-                                    GLenum type,
+                                    gl::DrawElementsType type,
                                     const void *indices) override;
     angle::Result drawArraysIndirect(const gl::Context *context,
                                      gl::PrimitiveMode mode,
                                      const void *indirect) override;
     angle::Result drawElementsIndirect(const gl::Context *context,
                                        gl::PrimitiveMode mode,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indirect) override;
 
     // CHROMIUM_path_rendering implementation
@@ -219,7 +219,7 @@
 
     angle::Result setDrawElementsState(const gl::Context *context,
                                        GLsizei count,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indices,
                                        GLsizei instanceCount,
                                        const void **outIndices);
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 9118abb..14e5476 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -108,14 +108,14 @@
                                                 GLsizei count,
                                                 GLsizei instanceCount) const
 {
-    return syncDrawState(context, activeAttributesMask, first, count, GL_NONE, nullptr,
-                         instanceCount, false, nullptr);
+    return syncDrawState(context, activeAttributesMask, first, count,
+                         gl::DrawElementsType::InvalidEnum, nullptr, instanceCount, false, nullptr);
 }
 
 angle::Result VertexArrayGL::syncDrawElementsState(const gl::Context *context,
                                                    const gl::AttributesMask &activeAttributesMask,
                                                    GLsizei count,
-                                                   GLenum type,
+                                                   gl::DrawElementsType type,
                                                    const void *indices,
                                                    GLsizei instanceCount,
                                                    bool primitiveRestartEnabled,
@@ -140,7 +140,7 @@
                                            const gl::AttributesMask &activeAttributesMask,
                                            GLint first,
                                            GLsizei count,
-                                           GLenum type,
+                                           gl::DrawElementsType type,
                                            const void *indices,
                                            GLsizei instanceCount,
                                            bool primitiveRestartEnabled,
@@ -154,7 +154,7 @@
     // Determine if an index buffer needs to be streamed and the range of vertices that need to be
     // copied
     IndexRange indexRange;
-    if (type != GL_NONE)
+    if (type != gl::DrawElementsType::InvalidEnum)
     {
         ANGLE_TRY(syncIndexData(context, count, type, indices, primitiveRestartEnabled,
                                 needsStreamingAttribs.any(), &indexRange, outIndices));
@@ -176,7 +176,7 @@
 
 angle::Result VertexArrayGL::syncIndexData(const gl::Context *context,
                                            GLsizei count,
-                                           GLenum type,
+                                           gl::DrawElementsType type,
                                            const void *indices,
                                            bool primitiveRestartEnabled,
                                            bool attributesNeedStreaming,
@@ -228,8 +228,8 @@
         mAppliedElementArrayBuffer.set(context, nullptr);
 
         // Make sure the element array buffer is large enough
-        const Type &indexTypeInfo          = GetTypeInfo(type);
-        size_t requiredStreamingBufferSize = indexTypeInfo.bytes * count;
+        const GLuint indexTypeBytes        = gl::GetDrawElementsTypeSize(type);
+        size_t requiredStreamingBufferSize = indexTypeBytes * count;
         if (requiredStreamingBufferSize > mStreamingElementArrayBufferSize)
         {
             // Copy the indices in while resizing the buffer
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.h b/src/libANGLE/renderer/gl/VertexArrayGL.h
index c6062fb..2f2c47b 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.h
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.h
@@ -35,7 +35,7 @@
     angle::Result syncDrawElementsState(const gl::Context *context,
                                         const gl::AttributesMask &activeAttributesMask,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices,
                                         GLsizei instanceCount,
                                         bool primitiveRestartEnabled,
@@ -57,7 +57,7 @@
                                 const gl::AttributesMask &activeAttributesMask,
                                 GLint first,
                                 GLsizei count,
-                                GLenum type,
+                                gl::DrawElementsType type,
                                 const void *indices,
                                 GLsizei instanceCount,
                                 bool primitiveRestartEnabled,
@@ -66,7 +66,7 @@
     // Apply index data, only sets outIndexRange if attributesNeedStreaming is true
     angle::Result syncIndexData(const gl::Context *context,
                                 GLsizei count,
-                                GLenum type,
+                                gl::DrawElementsType type,
                                 const void *indices,
                                 bool primitiveRestartEnabled,
                                 bool attributesNeedStreaming,
diff --git a/src/libANGLE/renderer/null/BufferNULL.cpp b/src/libANGLE/renderer/null/BufferNULL.cpp
index 310bd3e..b4d7133 100644
--- a/src/libANGLE/renderer/null/BufferNULL.cpp
+++ b/src/libANGLE/renderer/null/BufferNULL.cpp
@@ -97,7 +97,7 @@
 }
 
 angle::Result BufferNULL::getIndexRange(const gl::Context *context,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         size_t offset,
                                         size_t count,
                                         bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/null/BufferNULL.h b/src/libANGLE/renderer/null/BufferNULL.h
index d136b68..e8e1b77 100644
--- a/src/libANGLE/renderer/null/BufferNULL.h
+++ b/src/libANGLE/renderer/null/BufferNULL.h
@@ -47,7 +47,7 @@
     angle::Result unmap(const gl::Context *context, GLboolean *result) override;
 
     angle::Result getIndexRange(const gl::Context *context,
-                                GLenum type,
+                                gl::DrawElementsType type,
                                 size_t offset,
                                 size_t count,
                                 bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/null/ContextNULL.cpp b/src/libANGLE/renderer/null/ContextNULL.cpp
index b9636e2..5c32678 100644
--- a/src/libANGLE/renderer/null/ContextNULL.cpp
+++ b/src/libANGLE/renderer/null/ContextNULL.cpp
@@ -138,7 +138,7 @@
 angle::Result ContextNULL::drawElements(const gl::Context *context,
                                         gl::PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices)
 {
     return angle::Result::Continue();
@@ -147,7 +147,7 @@
 angle::Result ContextNULL::drawElementsInstanced(const gl::Context *context,
                                                  gl::PrimitiveMode mode,
                                                  GLsizei count,
-                                                 GLenum type,
+                                                 gl::DrawElementsType type,
                                                  const void *indices,
                                                  GLsizei instances)
 {
@@ -159,7 +159,7 @@
                                              GLuint start,
                                              GLuint end,
                                              GLsizei count,
-                                             GLenum type,
+                                             gl::DrawElementsType type,
                                              const void *indices)
 {
     return angle::Result::Continue();
@@ -174,7 +174,7 @@
 
 angle::Result ContextNULL::drawElementsIndirect(const gl::Context *context,
                                                 gl::PrimitiveMode mode,
-                                                GLenum type,
+                                                gl::DrawElementsType type,
                                                 const void *indirect)
 {
     return angle::Result::Continue();
diff --git a/src/libANGLE/renderer/null/ContextNULL.h b/src/libANGLE/renderer/null/ContextNULL.h
index d3b6eea..88dec5b 100644
--- a/src/libANGLE/renderer/null/ContextNULL.h
+++ b/src/libANGLE/renderer/null/ContextNULL.h
@@ -56,12 +56,12 @@
     angle::Result drawElements(const gl::Context *context,
                                gl::PrimitiveMode mode,
                                GLsizei count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices) override;
     angle::Result drawElementsInstanced(const gl::Context *context,
                                         gl::PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices,
                                         GLsizei instances) override;
     angle::Result drawRangeElements(const gl::Context *context,
@@ -69,14 +69,14 @@
                                     GLuint start,
                                     GLuint end,
                                     GLsizei count,
-                                    GLenum type,
+                                    gl::DrawElementsType type,
                                     const void *indices) override;
     angle::Result drawArraysIndirect(const gl::Context *context,
                                      gl::PrimitiveMode mode,
                                      const void *indirect) override;
     angle::Result drawElementsIndirect(const gl::Context *context,
                                        gl::PrimitiveMode mode,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indirect) override;
 
     // CHROMIUM_path_rendering path drawing methods.
diff --git a/src/libANGLE/renderer/renderer_utils.cpp b/src/libANGLE/renderer/renderer_utils.cpp
index 7ff150c..14beeed 100644
--- a/src/libANGLE/renderer/renderer_utils.cpp
+++ b/src/libANGLE/renderer/renderer_utils.cpp
@@ -586,17 +586,17 @@
 angle::Result GetVertexRangeInfo(const gl::Context *context,
                                  GLint firstVertex,
                                  GLsizei vertexOrIndexCount,
-                                 GLenum indexTypeOrNone,
+                                 gl::DrawElementsType indexTypeOrInvalid,
                                  const void *indices,
                                  GLint baseVertex,
                                  GLint *startVertexOut,
                                  size_t *vertexCountOut)
 {
-    if (indexTypeOrNone != GL_NONE)
+    if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
     {
         gl::IndexRange indexRange;
         ANGLE_TRY(context->getGLState().getVertexArray()->getIndexRange(
-            context, indexTypeOrNone, vertexOrIndexCount, indices, &indexRange));
+            context, indexTypeOrInvalid, vertexOrIndexCount, indices, &indexRange));
         ANGLE_TRY(ComputeStartVertex(context->getImplementation(), indexRange, baseVertex,
                                      startVertexOut));
         *vertexCountOut = indexRange.vertexCount();
diff --git a/src/libANGLE/renderer/renderer_utils.h b/src/libANGLE/renderer/renderer_utils.h
index eff7040..e7a4b86 100644
--- a/src/libANGLE/renderer/renderer_utils.h
+++ b/src/libANGLE/renderer/renderer_utils.h
@@ -281,7 +281,7 @@
 angle::Result GetVertexRangeInfo(const gl::Context *context,
                                  GLint firstVertex,
                                  GLsizei vertexOrIndexCount,
-                                 GLenum indexTypeOrNone,
+                                 gl::DrawElementsType indexTypeOrInvalid,
                                  const void *indices,
                                  GLint baseVertex,
                                  GLint *startVertexOut,
diff --git a/src/libANGLE/renderer/vulkan/BufferVk.cpp b/src/libANGLE/renderer/vulkan/BufferVk.cpp
index eb6f293..4fa8a3a 100644
--- a/src/libANGLE/renderer/vulkan/BufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/BufferVk.cpp
@@ -153,7 +153,7 @@
 }
 
 angle::Result BufferVk::getIndexRange(const gl::Context *context,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       size_t offset,
                                       size_t count,
                                       bool primitiveRestartEnabled,
@@ -177,11 +177,11 @@
     // TODO(jmadill): Consider keeping a shadow system memory copy in some cases.
     ASSERT(mBuffer.valid());
 
-    const gl::Type &typeInfo = gl::GetTypeInfo(type);
+    const GLuint &typeBytes = gl::GetDrawElementsTypeSize(type);
 
     uint8_t *mapPointer = nullptr;
     ANGLE_VK_TRY(contextVk, mBuffer.getDeviceMemory().map(contextVk->getDevice(), offset,
-                                                          typeInfo.bytes * count, 0, &mapPointer));
+                                                          typeBytes * count, 0, &mapPointer));
 
     *outRange = gl::ComputeIndexRange(type, mapPointer, count, primitiveRestartEnabled);
 
diff --git a/src/libANGLE/renderer/vulkan/BufferVk.h b/src/libANGLE/renderer/vulkan/BufferVk.h
index c45bd1e..9911758 100644
--- a/src/libANGLE/renderer/vulkan/BufferVk.h
+++ b/src/libANGLE/renderer/vulkan/BufferVk.h
@@ -49,7 +49,7 @@
     angle::Result unmap(const gl::Context *context, GLboolean *result) override;
 
     angle::Result getIndexRange(const gl::Context *context,
-                                GLenum type,
+                                gl::DrawElementsType type,
                                 size_t offset,
                                 size_t count,
                                 bool primitiveRestartEnabled,
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 20783fe..26ac068 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -114,7 +114,7 @@
       mDrawFramebuffer(nullptr),
       mProgram(nullptr),
       mLastIndexBufferOffset(0),
-      mCurrentDrawElementsType(GL_NONE),
+      mCurrentDrawElementsType(gl::DrawElementsType::InvalidEnum),
       mClearColorMask(kAllColorChannelsMask),
       mFlipYForCurrentSurface(false),
       mDriverUniformsBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(DriverUniforms) * 16, true),
@@ -264,7 +264,7 @@
                                    gl::PrimitiveMode mode,
                                    GLint firstVertex,
                                    GLsizei vertexOrIndexCount,
-                                   GLenum indexTypeOrNone,
+                                   gl::DrawElementsType indexTypeOrNone,
                                    const void *indices,
                                    DirtyBits dirtyBitMask,
                                    vk::CommandBuffer **commandBufferOut)
@@ -313,7 +313,7 @@
 angle::Result ContextVk::setupIndexedDraw(const gl::Context *context,
                                           gl::PrimitiveMode mode,
                                           GLsizei indexCount,
-                                          GLenum indexType,
+                                          gl::DrawElementsType indexType,
                                           const void *indices,
                                           vk::CommandBuffer **commandBufferOut)
 {
@@ -338,7 +338,7 @@
             mVertexArray->updateCurrentElementArrayBufferOffset(mLastIndexBufferOffset);
         }
 
-        if (indexType == GL_UNSIGNED_BYTE && mDirtyBits[DIRTY_BIT_INDEX_BUFFER])
+        if (indexType == gl::DrawElementsType::UnsignedByte && mDirtyBits[DIRTY_BIT_INDEX_BUFFER])
         {
             ANGLE_TRY(mVertexArray->updateIndexTranslation(this, indexCount, indexType, indices));
         }
@@ -352,15 +352,17 @@
                                            gl::PrimitiveMode mode,
                                            GLint firstVertex,
                                            GLsizei vertexOrIndexCount,
-                                           GLenum indexTypeOrNone,
+                                           gl::DrawElementsType indexTypeOrInvalid,
                                            const void *indices,
                                            vk::CommandBuffer **commandBufferOut)
 {
-    ANGLE_TRY(mVertexArray->handleLineLoop(this, firstVertex, vertexOrIndexCount, indexTypeOrNone,
-                                           indices));
+    ANGLE_TRY(mVertexArray->handleLineLoop(this, firstVertex, vertexOrIndexCount,
+                                           indexTypeOrInvalid, indices));
     mDirtyBits.set(DIRTY_BIT_INDEX_BUFFER);
-    mCurrentDrawElementsType = indexTypeOrNone != GL_NONE ? indexTypeOrNone : GL_UNSIGNED_INT;
-    return setupDraw(context, mode, firstVertex, vertexOrIndexCount, indexTypeOrNone, indices,
+    mCurrentDrawElementsType = indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum
+                                   ? indexTypeOrInvalid
+                                   : gl::DrawElementsType::UnsignedInt;
+    return setupDraw(context, mode, firstVertex, vertexOrIndexCount, indexTypeOrInvalid, indices,
                      mIndexedDirtyBitsMask, commandBufferOut);
 }
 
@@ -444,7 +446,7 @@
 {
     commandBuffer->bindIndexBuffer(mVertexArray->getCurrentElementArrayBufferHandle(),
                                    mVertexArray->getCurrentElementArrayBufferOffset(),
-                                   gl_vk::GetIndexType(mCurrentDrawElementsType));
+                                   gl_vk::kIndexTypeMap[mCurrentDrawElementsType]);
 
     vk::BufferHelper *elementArrayBuffer = mVertexArray->getCurrentElementArrayBuffer();
     if (elementArrayBuffer)
@@ -491,13 +493,14 @@
 
     if (mode == gl::PrimitiveMode::LineLoop)
     {
-        ANGLE_TRY(setupLineLoopDraw(context, mode, first, count, GL_NONE, nullptr, &commandBuffer));
+        ANGLE_TRY(setupLineLoopDraw(context, mode, first, count, gl::DrawElementsType::InvalidEnum,
+                                    nullptr, &commandBuffer));
         vk::LineLoopHelper::Draw(clampedVertexCount, commandBuffer);
     }
     else
     {
-        ANGLE_TRY(setupDraw(context, mode, first, count, GL_NONE, nullptr, mNonIndexedDirtyBitsMask,
-                            &commandBuffer));
+        ANGLE_TRY(setupDraw(context, mode, first, count, gl::DrawElementsType::InvalidEnum, nullptr,
+                            mNonIndexedDirtyBitsMask, &commandBuffer));
         commandBuffer->draw(clampedVertexCount, 1, first, 0);
     }
 
@@ -517,7 +520,7 @@
 angle::Result ContextVk::drawElements(const gl::Context *context,
                                       gl::PrimitiveMode mode,
                                       GLsizei count,
-                                      GLenum type,
+                                      gl::DrawElementsType type,
                                       const void *indices)
 {
     vk::CommandBuffer *commandBuffer = nullptr;
@@ -538,7 +541,7 @@
 angle::Result ContextVk::drawElementsInstanced(const gl::Context *context,
                                                gl::PrimitiveMode mode,
                                                GLsizei count,
-                                               GLenum type,
+                                               gl::DrawElementsType type,
                                                const void *indices,
                                                GLsizei instances)
 {
@@ -551,7 +554,7 @@
                                            GLuint start,
                                            GLuint end,
                                            GLsizei count,
-                                           GLenum type,
+                                           gl::DrawElementsType type,
                                            const void *indices)
 {
     ANGLE_VK_UNREACHABLE(this);
@@ -573,7 +576,7 @@
 
 angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
                                               gl::PrimitiveMode mode,
-                                              GLenum type,
+                                              gl::DrawElementsType type,
                                               const void *indirect)
 {
     ANGLE_VK_UNREACHABLE(this);
@@ -1159,9 +1162,9 @@
         static_cast<float>(mDrawFramebuffer->getState().getDimensions().height) * 0.5f;
 
     // Allocate a new region in the dynamic buffer.
-    uint8_t *ptr            = nullptr;
-    VkBuffer buffer         = VK_NULL_HANDLE;
-    VkDeviceSize offset     = 0;
+    uint8_t *ptr        = nullptr;
+    VkBuffer buffer     = VK_NULL_HANDLE;
+    VkDeviceSize offset = 0;
     ANGLE_TRY(mDriverUniformsBuffer.allocate(this, sizeof(DriverUniforms), &ptr, &buffer, &offset,
                                              nullptr));
     float scaleY = isViewportFlipEnabledForDrawFBO() ? -1.0f : 1.0f;
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.h b/src/libANGLE/renderer/vulkan/ContextVk.h
index ad26954..9dcd31c 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -53,12 +53,12 @@
     angle::Result drawElements(const gl::Context *context,
                                gl::PrimitiveMode mode,
                                GLsizei count,
-                               GLenum type,
+                               gl::DrawElementsType type,
                                const void *indices) override;
     angle::Result drawElementsInstanced(const gl::Context *context,
                                         gl::PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        gl::DrawElementsType type,
                                         const void *indices,
                                         GLsizei instances) override;
     angle::Result drawRangeElements(const gl::Context *context,
@@ -66,14 +66,14 @@
                                     GLuint start,
                                     GLuint end,
                                     GLsizei count,
-                                    GLenum type,
+                                    gl::DrawElementsType type,
                                     const void *indices) override;
     angle::Result drawArraysIndirect(const gl::Context *context,
                                      gl::PrimitiveMode mode,
                                      const void *indirect) override;
     angle::Result drawElementsIndirect(const gl::Context *context,
                                        gl::PrimitiveMode mode,
-                                       GLenum type,
+                                       gl::DrawElementsType type,
                                        const void *indirect) override;
 
     // Device loss
@@ -215,21 +215,21 @@
                             gl::PrimitiveMode mode,
                             GLint firstVertex,
                             GLsizei vertexOrIndexCount,
-                            GLenum indexTypeOrNone,
+                            gl::DrawElementsType indexTypeOrInvalid,
                             const void *indices,
                             DirtyBits dirtyBitMask,
                             vk::CommandBuffer **commandBufferOut);
     angle::Result setupIndexedDraw(const gl::Context *context,
                                    gl::PrimitiveMode mode,
                                    GLsizei indexCount,
-                                   GLenum indexType,
+                                   gl::DrawElementsType indexType,
                                    const void *indices,
                                    vk::CommandBuffer **commandBufferOut);
     angle::Result setupLineLoopDraw(const gl::Context *context,
                                     gl::PrimitiveMode mode,
                                     GLint firstVertex,
                                     GLsizei vertexOrIndexCount,
-                                    GLenum indexTypeOrNone,
+                                    gl::DrawElementsType indexTypeOrInvalid,
                                     const void *indices,
                                     vk::CommandBuffer **commandBufferOut);
 
@@ -293,7 +293,7 @@
 
     // The offset we had the last time we bound the index buffer.
     const GLvoid *mLastIndexBufferOffset;
-    GLenum mCurrentDrawElementsType;
+    gl::DrawElementsType mCurrentDrawElementsType;
 
     // Cached clear value/mask for color and depth/stencil.
     VkClearValue mClearColorValue;
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 144761e..3bacd45 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -134,12 +134,12 @@
 }
 
 angle::Result VertexArrayVk::streamIndexData(ContextVk *contextVk,
-                                             GLenum indexType,
+                                             gl::DrawElementsType indexType,
                                              size_t indexCount,
                                              const void *sourcePointer,
                                              vk::DynamicBuffer *dynamicBuffer)
 {
-    ASSERT(!mState.getElementArrayBuffer() || indexType == GL_UNSIGNED_BYTE);
+    ASSERT(!mState.getElementArrayBuffer() || indexType == gl::DrawElementsType::UnsignedByte);
 
     dynamicBuffer->releaseRetainedBuffers(contextVk->getRenderer());
 
@@ -148,7 +148,7 @@
 
     ANGLE_TRY(dynamicBuffer->allocate(contextVk, amount, &dst, &mCurrentElementArrayBufferHandle,
                                       &mCurrentElementArrayBufferOffset, nullptr));
-    if (indexType == GL_UNSIGNED_BYTE)
+    if (indexType == gl::DrawElementsType::UnsignedByte)
     {
         // Unsigned bytes don't have direct support in Vulkan so we have to expand the
         // memory to a GLushort.
@@ -446,7 +446,7 @@
 angle::Result VertexArrayVk::updateClientAttribs(const gl::Context *context,
                                                  GLint firstVertex,
                                                  GLsizei vertexOrIndexCount,
-                                                 GLenum indexTypeOrNone,
+                                                 gl::DrawElementsType indexTypeOrInvalid,
                                                  const void *indices)
 {
     ContextVk *contextVk                    = vk::GetImpl(context);
@@ -456,8 +456,8 @@
 
     GLint startVertex;
     size_t vertexCount;
-    ANGLE_TRY(GetVertexRangeInfo(context, firstVertex, vertexOrIndexCount, indexTypeOrNone, indices,
-                                 0, &startVertex, &vertexCount));
+    ANGLE_TRY(GetVertexRangeInfo(context, firstVertex, vertexOrIndexCount, indexTypeOrInvalid,
+                                 indices, 0, &startVertex, &vertexCount));
 
     mDynamicVertexData.releaseRetainedBuffers(contextVk->getRenderer());
 
@@ -498,10 +498,10 @@
 angle::Result VertexArrayVk::handleLineLoop(ContextVk *contextVk,
                                             GLint firstVertex,
                                             GLsizei vertexOrIndexCount,
-                                            GLenum indexTypeOrNone,
+                                            gl::DrawElementsType indexTypeOrInvalid,
                                             const void *indices)
 {
-    if (indexTypeOrNone != GL_NONE)
+    if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
     {
         // Handle GL_LINE_LOOP drawElements.
         if (mDirtyLineLoopTranslation)
@@ -511,7 +511,7 @@
             if (!elementArrayBuffer)
             {
                 ANGLE_TRY(mLineLoopHelper.streamIndices(
-                    contextVk, indexTypeOrNone, vertexOrIndexCount,
+                    contextVk, indexTypeOrInvalid, vertexOrIndexCount,
                     reinterpret_cast<const uint8_t *>(indices), &mCurrentElementArrayBufferHandle,
                     &mCurrentElementArrayBufferOffset));
             }
@@ -521,7 +521,7 @@
                 intptr_t offset                = reinterpret_cast<intptr_t>(indices);
                 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
                 ANGLE_TRY(mLineLoopHelper.getIndexBufferForElementArrayBuffer(
-                    contextVk, elementArrayBufferVk, indexTypeOrNone, vertexOrIndexCount, offset,
+                    contextVk, elementArrayBufferVk, indexTypeOrInvalid, vertexOrIndexCount, offset,
                     &mCurrentElementArrayBufferHandle, &mCurrentElementArrayBufferOffset));
             }
         }
@@ -555,10 +555,10 @@
 
 angle::Result VertexArrayVk::updateIndexTranslation(ContextVk *contextVk,
                                                     GLsizei indexCount,
-                                                    GLenum type,
+                                                    gl::DrawElementsType type,
                                                     const void *indices)
 {
-    ASSERT(type != GL_NONE);
+    ASSERT(type != gl::DrawElementsType::InvalidEnum);
 
     gl::Buffer *glBuffer = mState.getElementArrayBuffer();
 
@@ -571,7 +571,7 @@
         // Needed before reading buffer or we could get stale data.
         ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
 
-        ASSERT(type == GL_UNSIGNED_BYTE);
+        ASSERT(type == gl::DrawElementsType::UnsignedByte);
         // Unsigned bytes don't have direct support in Vulkan so we have to expand the
         // memory to a GLushort.
         BufferVk *bufferVk   = vk::GetImpl(glBuffer);
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.h b/src/libANGLE/renderer/vulkan/VertexArrayVk.h
index 8cc606e..9688d51 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.h
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.h
@@ -46,13 +46,13 @@
     angle::Result updateClientAttribs(const gl::Context *context,
                                       GLint firstVertex,
                                       GLsizei vertexOrIndexCount,
-                                      GLenum indexTypeOrNone,
+                                      gl::DrawElementsType indexTypeOrInvalid,
                                       const void *indices);
 
     angle::Result handleLineLoop(ContextVk *contextVk,
                                  GLint firstVertex,
                                  GLsizei vertexOrIndexCount,
-                                 GLenum indexTypeOrNone,
+                                 gl::DrawElementsType indexTypeOrInvalid,
                                  const void *indices);
 
     const gl::AttribArray<VkBuffer> &getCurrentArrayBufferHandles() const
@@ -86,7 +86,7 @@
 
     angle::Result updateIndexTranslation(ContextVk *contextVk,
                                          GLsizei indexCount,
-                                         GLenum type,
+                                         gl::DrawElementsType type,
                                          const void *indices);
 
   private:
@@ -101,7 +101,7 @@
                                const gl::VertexAttribute &attrib);
 
     angle::Result streamIndexData(ContextVk *contextVk,
-                                  GLenum indexType,
+                                  gl::DrawElementsType indexType,
                                   size_t indexCount,
                                   const void *sourcePointer,
                                   vk::DynamicBuffer *dynamicBuffer);
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc b/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc
index 1637806..b9ac42d 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc
Binary files differ
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/PushConstantColor.frag.00000000.inc b/src/libANGLE/renderer/vulkan/shaders/gen/PushConstantColor.frag.00000000.inc
index 1933d7b..1099917 100644
--- a/src/libANGLE/renderer/vulkan/shaders/gen/PushConstantColor.frag.00000000.inc
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/PushConstantColor.frag.00000000.inc
Binary files differ
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index 08bc78d..afe17d9 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -777,13 +777,13 @@
 
 angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *contextVk,
                                                                   BufferVk *elementArrayBufferVk,
-                                                                  GLenum glIndexType,
+                                                                  gl::DrawElementsType glIndexType,
                                                                   int indexCount,
                                                                   intptr_t elementArrayOffset,
                                                                   VkBuffer *bufferHandleOut,
                                                                   VkDeviceSize *bufferOffsetOut)
 {
-    if (glIndexType == GL_UNSIGNED_BYTE)
+    if (glIndexType == gl::DrawElementsType::UnsignedByte)
     {
         // Needed before reading buffer or we could get stale data.
         ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
@@ -797,7 +797,7 @@
         return angle::Result::Continue();
     }
 
-    VkIndexType indexType = gl_vk::GetIndexType(glIndexType);
+    VkIndexType indexType = gl_vk::kIndexTypeMap[glIndexType];
     ASSERT(indexType == VK_INDEX_TYPE_UINT16 || indexType == VK_INDEX_TYPE_UINT32);
     uint32_t *indices = nullptr;
 
@@ -825,13 +825,13 @@
 }
 
 angle::Result LineLoopHelper::streamIndices(ContextVk *contextVk,
-                                            GLenum glIndexType,
+                                            gl::DrawElementsType glIndexType,
                                             GLsizei indexCount,
                                             const uint8_t *srcPtr,
                                             VkBuffer *bufferHandleOut,
                                             VkDeviceSize *bufferOffsetOut)
 {
-    VkIndexType indexType = gl_vk::GetIndexType(glIndexType);
+    VkIndexType indexType = gl_vk::kIndexTypeMap[glIndexType];
 
     uint8_t *indices = nullptr;
 
@@ -841,7 +841,7 @@
                                            reinterpret_cast<uint8_t **>(&indices), bufferHandleOut,
                                            bufferOffsetOut, nullptr));
 
-    if (glIndexType == GL_UNSIGNED_BYTE)
+    if (glIndexType == gl::DrawElementsType::UnsignedByte)
     {
         // Vulkan doesn't support uint8 index types, so we need to emulate it.
         ASSERT(indexType == VK_INDEX_TYPE_UINT16);
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index 869ebac..ce6a9ea 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -351,14 +351,14 @@
 
     angle::Result getIndexBufferForElementArrayBuffer(ContextVk *contextVk,
                                                       BufferVk *elementArrayBufferVk,
-                                                      GLenum glIndexType,
+                                                      gl::DrawElementsType glIndexType,
                                                       int indexCount,
                                                       intptr_t elementArrayOffset,
                                                       VkBuffer *bufferHandleOut,
                                                       VkDeviceSize *bufferOffsetOut);
 
     angle::Result streamIndices(ContextVk *contextVk,
-                                GLenum glIndexType,
+                                gl::DrawElementsType glIndexType,
                                 GLsizei indexCount,
                                 const uint8_t *srcPtr,
                                 VkBuffer *bufferHandleOut,
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.cpp b/src/libANGLE/renderer/vulkan/vk_utils.cpp
index 2f00580..e95a89a 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_utils.cpp
@@ -1462,21 +1462,6 @@
     }
 }
 
-VkIndexType GetIndexType(GLenum elementType)
-{
-    switch (elementType)
-    {
-        case GL_UNSIGNED_BYTE:
-        case GL_UNSIGNED_SHORT:
-            return VK_INDEX_TYPE_UINT16;
-        case GL_UNSIGNED_INT:
-            return VK_INDEX_TYPE_UINT32;
-        default:
-            UNREACHABLE();
-            return VK_INDEX_TYPE_MAX_ENUM;
-    }
-}
-
 void GetOffset(const gl::Offset &glOffset, VkOffset3D *vkOffset)
 {
     vkOffset->x = glOffset.x;
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index 90a724e..30b1532 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -865,7 +865,13 @@
 VkFrontFace GetFrontFace(GLenum frontFace, bool invertCullFace);
 VkSampleCountFlagBits GetSamples(GLint sampleCount);
 VkComponentSwizzle GetSwizzle(const GLenum swizzle);
-VkIndexType GetIndexType(GLenum elementType);
+
+constexpr angle::PackedEnumMap<gl::DrawElementsType, VkIndexType> kIndexTypeMap = {
+    {gl::DrawElementsType::UnsignedByte, VK_INDEX_TYPE_UINT16},
+    {gl::DrawElementsType::UnsignedShort, VK_INDEX_TYPE_UINT16},
+    {gl::DrawElementsType::UnsignedInt, VK_INDEX_TYPE_UINT32},
+};
+
 void GetOffset(const gl::Offset &glOffset, VkOffset3D *vkOffset);
 void GetExtent(const gl::Extents &glExtent, VkExtent3D *vkExtent);
 VkImageType GetImageType(gl::TextureType textureType);
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 3561600..cddee6c 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -633,7 +633,7 @@
 bool ValidateDrawElementsInstancedBase(Context *context,
                                        PrimitiveMode mode,
                                        GLsizei count,
-                                       GLenum type,
+                                       DrawElementsType type,
                                        const GLvoid *indices,
                                        GLsizei primcount)
 {
@@ -2959,23 +2959,19 @@
     return ValidateDrawInstancedANGLE(context);
 }
 
-bool ValidateDrawElementsBase(Context *context, PrimitiveMode mode, GLenum type)
+bool ValidateDrawElementsBase(Context *context, PrimitiveMode mode, DrawElementsType type)
 {
-    switch (type)
+    if (!context->getStateCache().isValidDrawElementsType(type))
     {
-        case GL_UNSIGNED_BYTE:
-        case GL_UNSIGNED_SHORT:
-            break;
-        case GL_UNSIGNED_INT:
-            if (context->getClientMajorVersion() < 3 && !context->getExtensions().elementIndexUint)
-            {
-                context->validationError(GL_INVALID_ENUM, kTypeNotUnsignedShortByte);
-                return false;
-            }
-            break;
-        default:
+        if (type == DrawElementsType::UnsignedInt)
+        {
             context->validationError(GL_INVALID_ENUM, kTypeNotUnsignedShortByte);
             return false;
+        }
+
+        ASSERT(type == DrawElementsType::InvalidEnum);
+        context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
+        return false;
     }
 
     const State &state = context->getGLState();
@@ -3012,7 +3008,7 @@
 bool ValidateDrawElementsCommon(Context *context,
                                 PrimitiveMode mode,
                                 GLsizei count,
-                                GLenum type,
+                                DrawElementsType type,
                                 const void *indices,
                                 GLsizei primcount)
 {
@@ -3029,7 +3025,7 @@
     const VertexArray *vao     = state.getVertexArray();
     Buffer *elementArrayBuffer = vao->getElementArrayBuffer();
 
-    GLuint typeBytes = GetTypeInfo(type).bytes;
+    GLuint typeBytes = GetDrawElementsTypeSize(type);
     ASSERT(isPow2(typeBytes) && typeBytes > 0);
 
     if (context->getExtensions().webglCompatibility)
@@ -3165,7 +3161,7 @@
 bool ValidateDrawElementsInstancedCommon(Context *context,
                                          PrimitiveMode mode,
                                          GLsizei count,
-                                         GLenum type,
+                                         DrawElementsType type,
                                          const void *indices,
                                          GLsizei primcount)
 {
@@ -3175,7 +3171,7 @@
 bool ValidateDrawElementsInstancedANGLE(Context *context,
                                         PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        DrawElementsType type,
                                         const void *indices,
                                         GLsizei primcount)
 {
diff --git a/src/libANGLE/validationES.h b/src/libANGLE/validationES.h
index 844b15b..dd6c2c9 100644
--- a/src/libANGLE/validationES.h
+++ b/src/libANGLE/validationES.h
@@ -303,24 +303,24 @@
                                       GLsizei count,
                                       GLsizei primcount);
 
-bool ValidateDrawElementsBase(Context *context, PrimitiveMode mode, GLenum type);
+bool ValidateDrawElementsBase(Context *context, PrimitiveMode mode, DrawElementsType type);
 bool ValidateDrawElementsCommon(Context *context,
                                 PrimitiveMode mode,
                                 GLsizei count,
-                                GLenum type,
+                                DrawElementsType type,
                                 const void *indices,
                                 GLsizei primcount);
 
 bool ValidateDrawElementsInstancedCommon(Context *context,
                                          PrimitiveMode mode,
                                          GLsizei count,
-                                         GLenum type,
+                                         DrawElementsType type,
                                          const void *indices,
                                          GLsizei primcount);
 bool ValidateDrawElementsInstancedANGLE(Context *context,
                                         PrimitiveMode mode,
                                         GLsizei count,
-                                        GLenum type,
+                                        DrawElementsType type,
                                         const void *indices,
                                         GLsizei primcount);
 bool ValidateDrawInstancedANGLE(Context *context);
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index af3628a..a7ffba6 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -5846,7 +5846,7 @@
 bool ValidateDrawElements(Context *context,
                           PrimitiveMode mode,
                           GLsizei count,
-                          GLenum type,
+                          DrawElementsType type,
                           const void *indices)
 {
     return ValidateDrawElementsCommon(context, mode, count, type, indices, 1);
@@ -6778,7 +6778,7 @@
 bool ValidateMultiDrawElementsANGLE(Context *context,
                                     PrimitiveMode mode,
                                     const GLsizei *counts,
-                                    GLenum type,
+                                    DrawElementsType type,
                                     const GLvoid *const *indices,
                                     GLsizei drawcount)
 {
diff --git a/src/libANGLE/validationES2_autogen.h b/src/libANGLE/validationES2_autogen.h
index e15f0d4..879b3ad 100644
--- a/src/libANGLE/validationES2_autogen.h
+++ b/src/libANGLE/validationES2_autogen.h
@@ -110,7 +110,7 @@
 bool ValidateDrawElements(Context *context,
                           PrimitiveMode modePacked,
                           GLsizei count,
-                          GLenum type,
+                          DrawElementsType typePacked,
                           const void *indices);
 bool ValidateEnable(Context *context, GLenum cap);
 bool ValidateEnableVertexAttribArray(Context *context, GLuint index);
diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp
index e33a2fd..fef519b 100644
--- a/src/libANGLE/validationES3.cpp
+++ b/src/libANGLE/validationES3.cpp
@@ -1413,7 +1413,7 @@
                                GLuint start,
                                GLuint end,
                                GLsizei count,
-                               GLenum type,
+                               DrawElementsType type,
                                const void *indices)
 {
     if (context->getClientMajorVersion() < 3)
@@ -3101,7 +3101,7 @@
 bool ValidateDrawElementsInstanced(Context *context,
                                    PrimitiveMode mode,
                                    GLsizei count,
-                                   GLenum type,
+                                   DrawElementsType type,
                                    const void *indices,
                                    GLsizei instanceCount)
 {
@@ -3152,7 +3152,7 @@
 bool ValidateMultiDrawElementsInstancedANGLE(Context *context,
                                              PrimitiveMode mode,
                                              const GLsizei *counts,
-                                             GLenum type,
+                                             DrawElementsType type,
                                              const GLvoid *const *indices,
                                              const GLsizei *instanceCounts,
                                              GLsizei drawcount)
diff --git a/src/libANGLE/validationES31.cpp b/src/libANGLE/validationES31.cpp
index 037f24e..5e8faff 100644
--- a/src/libANGLE/validationES31.cpp
+++ b/src/libANGLE/validationES31.cpp
@@ -520,7 +520,7 @@
 
 bool ValidateDrawElementsIndirect(Context *context,
                                   PrimitiveMode mode,
-                                  GLenum type,
+                                  DrawElementsType type,
                                   const void *indirect)
 {
     if (!ValidateDrawElementsBase(context, mode, type))
diff --git a/src/libANGLE/validationES31_autogen.h b/src/libANGLE/validationES31_autogen.h
index 21a5ac1..32154f8 100644
--- a/src/libANGLE/validationES31_autogen.h
+++ b/src/libANGLE/validationES31_autogen.h
@@ -45,7 +45,7 @@
 bool ValidateDrawArraysIndirect(Context *context, PrimitiveMode modePacked, const void *indirect);
 bool ValidateDrawElementsIndirect(Context *context,
                                   PrimitiveMode modePacked,
-                                  GLenum type,
+                                  DrawElementsType typePacked,
                                   const void *indirect);
 bool ValidateFramebufferParameteri(Context *context, GLenum target, GLenum pname, GLint param);
 bool ValidateGenProgramPipelines(Context *context, GLsizei n, GLuint *pipelines);
diff --git a/src/libANGLE/validationES3_autogen.h b/src/libANGLE/validationES3_autogen.h
index dbf08c9..8ca33ed 100644
--- a/src/libANGLE/validationES3_autogen.h
+++ b/src/libANGLE/validationES3_autogen.h
@@ -104,7 +104,7 @@
 bool ValidateDrawElementsInstanced(Context *context,
                                    PrimitiveMode modePacked,
                                    GLsizei count,
-                                   GLenum type,
+                                   DrawElementsType typePacked,
                                    const void *indices,
                                    GLsizei instancecount);
 bool ValidateDrawRangeElements(Context *context,
@@ -112,7 +112,7 @@
                                GLuint start,
                                GLuint end,
                                GLsizei count,
-                               GLenum type,
+                               DrawElementsType typePacked,
                                const void *indices);
 bool ValidateEndQuery(Context *context, QueryType targetPacked);
 bool ValidateEndTransformFeedback(Context *context);
diff --git a/src/libANGLE/validationESEXT_autogen.h b/src/libANGLE/validationESEXT_autogen.h
index f6311d4..f6e92be 100644
--- a/src/libANGLE/validationESEXT_autogen.h
+++ b/src/libANGLE/validationESEXT_autogen.h
@@ -78,7 +78,7 @@
 bool ValidateDrawElementsInstancedANGLE(Context *context,
                                         PrimitiveMode modePacked,
                                         GLsizei count,
-                                        GLenum type,
+                                        DrawElementsType typePacked,
                                         const void *indices,
                                         GLsizei primcount);
 bool ValidateVertexAttribDivisorANGLE(Context *context, GLuint index, GLuint divisor);
@@ -98,13 +98,13 @@
 bool ValidateMultiDrawElementsANGLE(Context *context,
                                     PrimitiveMode modePacked,
                                     const GLsizei *counts,
-                                    GLenum type,
+                                    DrawElementsType typePacked,
                                     const GLvoid *const *indices,
                                     GLsizei drawcount);
 bool ValidateMultiDrawElementsInstancedANGLE(Context *context,
                                              PrimitiveMode modePacked,
                                              const GLsizei *counts,
-                                             GLenum type,
+                                             DrawElementsType typePacked,
                                              const GLvoid *const *indices,
                                              const GLsizei *instanceCounts,
                                              GLsizei drawcount);
diff --git a/src/libGLESv2/entry_points_gles_2_0_autogen.cpp b/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
index 7450f09..bc10919 100644
--- a/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_2_0_autogen.cpp
@@ -736,11 +736,12 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawElements(context, modePacked, count, type, indices))
+            ValidateDrawElements(context, modePacked, count, typePacked, indices))
         {
-            context->drawElements(modePacked, count, type, indices);
+            context->drawElements(modePacked, count, typePacked, indices);
         }
     }
 }
diff --git a/src/libGLESv2/entry_points_gles_3_0_autogen.cpp b/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
index 820d39a..d3f854f 100644
--- a/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
@@ -495,11 +495,13 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawElementsInstanced(context, modePacked, count, type, indices, instancecount))
+            ValidateDrawElementsInstanced(context, modePacked, count, typePacked, indices,
+                                          instancecount))
         {
-            context->drawElementsInstanced(modePacked, count, type, indices, instancecount);
+            context->drawElementsInstanced(modePacked, count, typePacked, indices, instancecount);
         }
     }
 }
@@ -520,11 +522,12 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawRangeElements(context, modePacked, start, end, count, type, indices))
+            ValidateDrawRangeElements(context, modePacked, start, end, count, typePacked, indices))
         {
-            context->drawRangeElements(modePacked, start, end, count, type, indices);
+            context->drawRangeElements(modePacked, start, end, count, typePacked, indices);
         }
     }
 }
diff --git a/src/libGLESv2/entry_points_gles_3_1_autogen.cpp b/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
index a3533ef..b4bbcdf 100644
--- a/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_3_1_autogen.cpp
@@ -188,11 +188,12 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawElementsIndirect(context, modePacked, type, indirect))
+            ValidateDrawElementsIndirect(context, modePacked, typePacked, indirect))
         {
-            context->drawElementsIndirect(modePacked, type, indirect);
+            context->drawElementsIndirect(modePacked, typePacked, indirect);
         }
     }
 }
diff --git a/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
index 72b9b43..90d23d4 100644
--- a/src/libGLESv2/entry_points_gles_ext_autogen.cpp
+++ b/src/libGLESv2/entry_points_gles_ext_autogen.cpp
@@ -199,11 +199,13 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
-        if (context->skipValidation() || ValidateDrawElementsInstancedANGLE(
-                                             context, modePacked, count, type, indices, primcount))
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
+        if (context->skipValidation() ||
+            ValidateDrawElementsInstancedANGLE(context, modePacked, count, typePacked, indices,
+                                               primcount))
         {
-            context->drawElementsInstanced(modePacked, count, type, indices, primcount);
+            context->drawElementsInstanced(modePacked, count, typePacked, indices, primcount);
         }
     }
 }
@@ -287,11 +289,13 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateMultiDrawElementsANGLE(context, modePacked, counts, type, indices, drawcount))
+            ValidateMultiDrawElementsANGLE(context, modePacked, counts, typePacked, indices,
+                                           drawcount))
         {
-            context->multiDrawElements(modePacked, counts, type, indices, drawcount);
+            context->multiDrawElements(modePacked, counts, typePacked, indices, drawcount);
         }
     }
 }
@@ -312,13 +316,14 @@
     Context *context = GetValidGlobalContext();
     if (context)
     {
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateMultiDrawElementsInstancedANGLE(context, modePacked, counts, type, indices,
-                                                    instanceCounts, drawcount))
+            ValidateMultiDrawElementsInstancedANGLE(context, modePacked, counts, typePacked,
+                                                    indices, instanceCounts, drawcount))
         {
-            context->multiDrawElementsInstanced(modePacked, counts, type, indices, instanceCounts,
-                                                drawcount);
+            context->multiDrawElementsInstanced(modePacked, counts, typePacked, indices,
+                                                instanceCounts, drawcount);
         }
     }
 }
@@ -6821,11 +6826,12 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawElements(context, modePacked, count, type, indices))
+            ValidateDrawElements(context, modePacked, count, typePacked, indices))
         {
-            context->drawElements(modePacked, count, type, indices);
+            context->drawElements(modePacked, count, typePacked, indices);
         }
     }
 }
@@ -6843,11 +6849,12 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawElementsIndirect(context, modePacked, type, indirect))
+            ValidateDrawElementsIndirect(context, modePacked, typePacked, indirect))
         {
-            context->drawElementsIndirect(modePacked, type, indirect);
+            context->drawElementsIndirect(modePacked, typePacked, indirect);
         }
     }
 }
@@ -6869,11 +6876,13 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawElementsInstanced(context, modePacked, count, type, indices, instancecount))
+            ValidateDrawElementsInstanced(context, modePacked, count, typePacked, indices,
+                                          instancecount))
         {
-            context->drawElementsInstanced(modePacked, count, type, indices, instancecount);
+            context->drawElementsInstanced(modePacked, count, typePacked, indices, instancecount);
         }
     }
 }
@@ -6895,11 +6904,13 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
-        if (context->skipValidation() || ValidateDrawElementsInstancedANGLE(
-                                             context, modePacked, count, type, indices, primcount))
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
+        if (context->skipValidation() ||
+            ValidateDrawElementsInstancedANGLE(context, modePacked, count, typePacked, indices,
+                                               primcount))
         {
-            context->drawElementsInstanced(modePacked, count, type, indices, primcount);
+            context->drawElementsInstanced(modePacked, count, typePacked, indices, primcount);
         }
     }
 }
@@ -6922,11 +6933,12 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateDrawRangeElements(context, modePacked, start, end, count, type, indices))
+            ValidateDrawRangeElements(context, modePacked, start, end, count, typePacked, indices))
         {
-            context->drawRangeElements(modePacked, start, end, count, type, indices);
+            context->drawRangeElements(modePacked, start, end, count, typePacked, indices);
         }
     }
 }
@@ -17875,11 +17887,13 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateMultiDrawElementsANGLE(context, modePacked, counts, type, indices, drawcount))
+            ValidateMultiDrawElementsANGLE(context, modePacked, counts, typePacked, indices,
+                                           drawcount))
         {
-            context->multiDrawElements(modePacked, counts, type, indices, drawcount);
+            context->multiDrawElements(modePacked, counts, typePacked, indices, drawcount);
         }
     }
 }
@@ -17902,13 +17916,14 @@
     if (context)
     {
         ASSERT(context == GetValidGlobalContext());
-        PrimitiveMode modePacked = FromGLenum<PrimitiveMode>(mode);
+        PrimitiveMode modePacked    = FromGLenum<PrimitiveMode>(mode);
+        DrawElementsType typePacked = FromGLenum<DrawElementsType>(type);
         if (context->skipValidation() ||
-            ValidateMultiDrawElementsInstancedANGLE(context, modePacked, counts, type, indices,
-                                                    instanceCounts, drawcount))
+            ValidateMultiDrawElementsInstancedANGLE(context, modePacked, counts, typePacked,
+                                                    indices, instanceCounts, drawcount))
         {
-            context->multiDrawElementsInstanced(modePacked, counts, type, indices, instanceCounts,
-                                                drawcount);
+            context->multiDrawElementsInstanced(modePacked, counts, typePacked, indices,
+                                                instanceCounts, drawcount);
         }
     }
 }
diff --git a/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp b/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp
index 4d6426c..d2b01d4 100644
--- a/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp
+++ b/src/tests/gl_tests/D3D11EmulatedIndexedBufferTest.cpp
@@ -140,7 +140,7 @@
 {
     rx::SourceIndexData srcData = {nullptr, mubyteIndices.data(),
                                    static_cast<unsigned int>(mubyteIndices.size()),
-                                   GL_UNSIGNED_BYTE, false};
+                                   gl::DrawElementsType::UnsignedByte, false};
     emulateAndCompare(&srcData);
 }
 
@@ -150,7 +150,7 @@
 {
     rx::SourceIndexData srcData = {nullptr, mushortIndices.data(),
                                    static_cast<unsigned int>(mushortIndices.size()),
-                                   GL_UNSIGNED_SHORT, false};
+                                   gl::DrawElementsType::UnsignedShort, false};
     emulateAndCompare(&srcData);
 }
 
@@ -159,8 +159,8 @@
 TEST_P(D3D11EmulatedIndexedBufferTest, TestNativeToExpandedUsingGLuintIndices)
 {
     rx::SourceIndexData srcData = {nullptr, muintIndices.data(),
-                                   static_cast<unsigned int>(muintIndices.size()), GL_UNSIGNED_INT,
-                                   false};
+                                   static_cast<unsigned int>(muintIndices.size()),
+                                   gl::DrawElementsType::UnsignedInt, false};
     emulateAndCompare(&srcData);
 }
 
@@ -177,8 +177,8 @@
 
     // Do a basic exanded and compare test.
     rx::SourceIndexData srcData = {nullptr, muintIndices.data(),
-                                   static_cast<unsigned int>(muintIndices.size()), GL_UNSIGNED_INT,
-                                   false};
+                                   static_cast<unsigned int>(muintIndices.size()),
+                                   gl::DrawElementsType::UnsignedInt, false};
     emulateAndCompare(&srcData);
 
     const uint8_t *sourceBufferMem = nullptr;
diff --git a/src/tests/perf_tests/IndexDataManagerTest.cpp b/src/tests/perf_tests/IndexDataManagerTest.cpp
index 4f11e49..c7e72d7 100644
--- a/src/tests/perf_tests/IndexDataManagerTest.cpp
+++ b/src/tests/perf_tests/IndexDataManagerTest.cpp
@@ -25,30 +25,31 @@
 class MockIndexBuffer : public rx::IndexBuffer
 {
   public:
-    MockIndexBuffer(unsigned int bufferSize, GLenum indexType)
+    MockIndexBuffer(unsigned int bufferSize, gl::DrawElementsType indexType)
         : mBufferSize(bufferSize), mIndexType(indexType)
     {}
 
-    MOCK_METHOD4(initialize, angle::Result(const gl::Context *, unsigned int, GLenum, bool));
+    MOCK_METHOD4(initialize,
+                 angle::Result(const gl::Context *, unsigned int, gl::DrawElementsType, bool));
     MOCK_METHOD4(mapBuffer,
                  angle::Result(const gl::Context *, unsigned int, unsigned int, void **));
     MOCK_METHOD1(unmapBuffer, angle::Result(const gl::Context *));
     MOCK_METHOD1(discard, angle::Result(const gl::Context *));
-    MOCK_METHOD3(setSize, angle::Result(const gl::Context *, unsigned int, GLenum));
+    MOCK_METHOD3(setSize, angle::Result(const gl::Context *, unsigned int, gl::DrawElementsType));
 
     // inlined for speed
-    GLenum getIndexType() const override { return mIndexType; }
+    gl::DrawElementsType getIndexType() const override { return mIndexType; }
     unsigned int getBufferSize() const override { return mBufferSize; }
 
   private:
     unsigned int mBufferSize;
-    GLenum mIndexType;
+    gl::DrawElementsType mIndexType;
 };
 
 class MockBufferFactoryD3D : public rx::BufferFactoryD3D
 {
   public:
-    MockBufferFactoryD3D(unsigned int bufferSize, GLenum indexType)
+    MockBufferFactoryD3D(unsigned int bufferSize, gl::DrawElementsType indexType)
         : mBufferSize(bufferSize), mIndexType(indexType)
     {}
 
@@ -71,7 +72,7 @@
 
   private:
     unsigned int mBufferSize;
-    GLenum mIndexType;
+    gl::DrawElementsType mIndexType;
 };
 
 class MockBufferD3D : public rx::BufferD3D
@@ -161,7 +162,7 @@
       mIndexDataManager(&mMockBufferFactory),
       mIndexCount(4000),
       mBufferSize(mIndexCount * sizeof(GLushort)),
-      mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
+      mMockBufferFactory(mBufferSize, gl::DrawElementsType::UnsignedShort),
       mMockGLFactory(&mMockBufferFactory),
       mIndexBuffer(&mMockGLFactory, 1)
 {
@@ -182,11 +183,11 @@
     gl::IndexRange indexRange;
     for (unsigned int iteration = 0; iteration < kIterationsPerStep; ++iteration)
     {
-        (void)mIndexBuffer.getIndexRange(nullptr, GL_UNSIGNED_SHORT, 0, mIndexCount, false,
-                                         &indexRange);
-        (void)mIndexDataManager.prepareIndexData(nullptr, GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT,
-                                                 mIndexCount, &mIndexBuffer, nullptr,
-                                                 &translatedIndexData);
+        (void)mIndexBuffer.getIndexRange(nullptr, gl::DrawElementsType::UnsignedShort, 0,
+                                         mIndexCount, false, &indexRange);
+        (void)mIndexDataManager.prepareIndexData(nullptr, gl::DrawElementsType::UnsignedShort,
+                                                 gl::DrawElementsType::UnsignedShort, mIndexCount,
+                                                 &mIndexBuffer, nullptr, &translatedIndexData);
     }
 }