Add support for ES31 context creation

The dEQP test for context creation passes.

SH_WEBGL3_SPEC has been added, but it should be considered whether we
should keep it, remove it or rename it. It was added so that there is
a webgl mapping to es 310 shaders. Check Compiler.cpp. The bison file
has been modified so that some tokens from es3 can be also used in
es31 as well.

A separate macro ES3_1_ONLY is added so that some tokens are limited
only for es 310 shaders.

BUG=angleproject:1442
TEST=angle_unittests

Change-Id: I2e5ca227c96046c30dc796ab934f3fda9c533eba
Reviewed-on: https://chromium-review.googlesource.com/360300
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index f96ad6d..2a8c61b 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -123,7 +123,7 @@
 
       case GL_PRIMITIVE_RESTART_FIXED_INDEX:
       case GL_RASTERIZER_DISCARD:
-        return (context->getClientVersion() >= 3);
+          return (context->getClientMajorVersion() >= 3);
 
       case GL_DEBUG_OUTPUT_SYNCHRONOUS:
       case GL_DEBUG_OUTPUT:
@@ -144,7 +144,7 @@
 
       case GL_TEXTURE_3D:
       case GL_TEXTURE_2D_ARRAY:
-        return (context->getClientVersion() >= 3);
+          return (context->getClientMajorVersion() >= 3);
 
       default:
         return false;
@@ -170,7 +170,7 @@
     {
         case GL_TEXTURE_3D:
         case GL_TEXTURE_2D_ARRAY:
-            return (context->getClientVersion() >= 3);
+            return (context->getClientMajorVersion() >= 3);
 
         default:
             return false;
@@ -243,13 +243,14 @@
 
       case GL_PIXEL_PACK_BUFFER:
       case GL_PIXEL_UNPACK_BUFFER:
-          return (context->getExtensions().pixelBufferObject || context->getClientVersion() >= 3);
+          return (context->getExtensions().pixelBufferObject ||
+                  context->getClientMajorVersion() >= 3);
 
       case GL_COPY_READ_BUFFER:
       case GL_COPY_WRITE_BUFFER:
       case GL_TRANSFORM_FEEDBACK_BUFFER:
       case GL_UNIFORM_BUFFER:
-        return (context->getClientVersion() >= 3);
+          return (context->getClientMajorVersion() >= 3);
 
       default:
         return false;
@@ -271,14 +272,15 @@
 
       case GL_BUFFER_MAPPED:
         static_assert(GL_BUFFER_MAPPED == GL_BUFFER_MAPPED_OES, "GL enums should be equal.");
-        return (context->getClientVersion() >= 3) || extensions.mapBuffer || extensions.mapBufferRange;
+        return (context->getClientMajorVersion() >= 3) || extensions.mapBuffer ||
+               extensions.mapBufferRange;
 
       // GL_BUFFER_MAP_POINTER is a special case, and may only be
       // queried with GetBufferPointerv
       case GL_BUFFER_ACCESS_FLAGS:
       case GL_BUFFER_MAP_OFFSET:
       case GL_BUFFER_MAP_LENGTH:
-        return (context->getClientVersion() >= 3) || extensions.mapBufferRange;
+          return (context->getClientMajorVersion() >= 3) || extensions.mapBufferRange;
 
       default:
         return false;
@@ -403,7 +405,7 @@
       case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
         return true;
       case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
-        return (context->getClientVersion() >= 3);
+          return (context->getClientMajorVersion() >= 3);
       case GL_TIME_ELAPSED_EXT:
           return context->getExtensions().disjointTimerQuery;
       case GL_COMMANDS_COMPLETED_CHROMIUM:
@@ -477,19 +479,19 @@
         {
           case GL_DEPTH_ATTACHMENT:
           case GL_STENCIL_ATTACHMENT:
-            break;
+              break;
 
           case GL_DEPTH_STENCIL_ATTACHMENT:
-            if (context->getClientVersion() < 3)
-            {
-                context->handleError(Error(GL_INVALID_ENUM));
-                return false;
-            }
-            break;
+              if (context->getClientMajorVersion() < 3)
+              {
+                  context->handleError(Error(GL_INVALID_ENUM));
+                  return false;
+              }
+              break;
 
           default:
               context->handleError(Error(GL_INVALID_ENUM));
-            return false;
+              return false;
         }
     }
 
@@ -565,7 +567,7 @@
     // the specified storage. This is different than ES 3.0 in which a sample number higher
     // than the maximum sample number supported  by this format generates a GL_INVALID_VALUE.
     // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
-    if (context->getClientVersion() >= 3)
+    if (context->getClientMajorVersion() >= 3)
     {
         const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
         if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
@@ -823,26 +825,26 @@
       case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
       case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
       case GL_CURRENT_VERTEX_ATTRIB:
-        return true;
+          return true;
 
       case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
-        // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
-        // the same constant.
-        static_assert(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE,
-                      "ANGLE extension enums not equal to GL enums.");
-        return true;
+          // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
+          // the same constant.
+          static_assert(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE,
+                        "ANGLE extension enums not equal to GL enums.");
+          return true;
 
       case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-        if (context->getClientVersion() < 3)
-        {
-            context->handleError(Error(GL_INVALID_ENUM));
-            return false;
-        }
-        return true;
+          if (context->getClientMajorVersion() < 3)
+          {
+              context->handleError(Error(GL_INVALID_ENUM));
+              return false;
+          }
+          return true;
 
       default:
           context->handleError(Error(GL_INVALID_ENUM));
-        return false;
+          return false;
     }
 }
 
@@ -861,19 +863,19 @@
       case GL_TEXTURE_COMPARE_FUNC:
       case GL_TEXTURE_MIN_LOD:
       case GL_TEXTURE_MAX_LOD:
-          if (context->getClientVersion() < 3)
-        {
-            context->handleError(Error(GL_INVALID_ENUM));
-            return false;
-        }
-        if (target == GL_TEXTURE_EXTERNAL_OES && !context->getExtensions().eglImageExternalEssl3)
-        {
-            context->handleError(Error(GL_INVALID_ENUM,
-                                       "ES3 texture parameters are not available without "
-                                       "GL_OES_EGL_image_external_essl3."));
-            return false;
-        }
-        break;
+          if (context->getClientMajorVersion() < 3)
+          {
+              context->handleError(Error(GL_INVALID_ENUM));
+              return false;
+          }
+          if (target == GL_TEXTURE_EXTERNAL_OES && !context->getExtensions().eglImageExternalEssl3)
+          {
+              context->handleError(Error(GL_INVALID_ENUM,
+                                         "ES3 texture parameters are not available without "
+                                         "GL_OES_EGL_image_external_essl3."));
+              return false;
+          }
+          break;
 
       default: break;
     }
@@ -1111,7 +1113,7 @@
     GLenum currentFormat = framebuffer->getImplementationColorReadFormat();
     GLenum currentType = framebuffer->getImplementationColorReadType();
     GLenum currentInternalFormat = readBuffer->getInternalFormat();
-    GLuint clientVersion = context->getClientVersion();
+    GLuint clientVersion         = context->getClientMajorVersion();
 
     bool validReadFormat = (clientVersion < 3) ? ValidES2ReadFormatType(context, format, type) :
                                                  ValidES3ReadFormatType(context, currentInternalFormat, format, type);
@@ -1488,7 +1490,8 @@
 bool ValidateUniform(gl::Context *context, GLenum uniformType, GLint location, GLsizei count)
 {
     // Check for ES3 uniform entry points
-    if (VariableComponentType(uniformType) == GL_UNSIGNED_INT && context->getClientVersion() < 3)
+    if (VariableComponentType(uniformType) == GL_UNSIGNED_INT &&
+        context->getClientMajorVersion() < 3)
     {
         context->handleError(Error(GL_INVALID_OPERATION));
         return false;
@@ -1517,13 +1520,13 @@
     // Check for ES3 uniform entry points
     int rows = VariableRowCount(matrixType);
     int cols = VariableColumnCount(matrixType);
-    if (rows != cols && context->getClientVersion() < 3)
+    if (rows != cols && context->getClientMajorVersion() < 3)
     {
         context->handleError(Error(GL_INVALID_OPERATION));
         return false;
     }
 
-    if (transpose != GL_FALSE && context->getClientVersion() < 3)
+    if (transpose != GL_FALSE && context->getClientMajorVersion() < 3)
     {
         context->handleError(Error(GL_INVALID_VALUE));
         return false;
@@ -1748,7 +1751,7 @@
             return false;
         }
 
-        if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
+        if (!formatInfo.textureSupport(context->getClientMajorVersion(), context->getExtensions()))
         {
             context->handleError(Error(GL_INVALID_ENUM));
             return false;
@@ -1980,17 +1983,17 @@
     {
       case GL_UNSIGNED_BYTE:
       case GL_UNSIGNED_SHORT:
-        break;
+          break;
       case GL_UNSIGNED_INT:
-          if (context->getClientVersion() < 3 && !context->getExtensions().elementIndexUint)
-        {
-            context->handleError(Error(GL_INVALID_ENUM));
-            return false;
-        }
-        break;
+          if (context->getClientMajorVersion() < 3 && !context->getExtensions().elementIndexUint)
+          {
+              context->handleError(Error(GL_INVALID_ENUM));
+              return false;
+          }
+          break;
       default:
           context->handleError(Error(GL_INVALID_ENUM));
-        return false;
+          return false;
     }
 
     const State &state = context->getGLState();
@@ -2178,7 +2181,8 @@
                                   GLenum textarget, GLuint texture, GLint level)
 {
     // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap extension
-    if (context->getClientVersion() < 3 && !context->getExtensions().fboRenderMipmap && level != 0)
+    if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
+        level != 0)
     {
         context->handleError(Error(GL_INVALID_VALUE));
         return false;
@@ -2644,13 +2648,13 @@
                             GLsizei height,
                             GLint border)
 {
-    if (context->getClientVersion() < 3)
+    if (context->getClientMajorVersion() < 3)
     {
         return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
                                                  0, x, y, width, height, border);
     }
 
-    ASSERT(context->getClientVersion() == 3);
+    ASSERT(context->getClientMajorVersion() == 3);
     return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
                                                0, x, y, width, height, border);
 }
@@ -2755,7 +2759,7 @@
                                GLsizei width,
                                GLsizei height)
 {
-    if (context->getClientVersion() < 3)
+    if (context->getClientMajorVersion() < 3)
     {
         return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
                                                  yoffset, x, y, width, height, 0);
@@ -2999,7 +3003,7 @@
     }
 
     // GL_EXT_sRGB does not support mipmap generation on sRGB textures
-    if (context->getClientVersion() == 2 && formatInfo.colorEncoding == GL_SRGB)
+    if (context->getClientMajorVersion() == 2 && formatInfo.colorEncoding == GL_SRGB)
     {
         context->handleError(Error(GL_INVALID_OPERATION));
         return false;
@@ -3010,7 +3014,7 @@
         (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
          !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
     {
-        ASSERT(context->getClientVersion() <= 2 &&
+        ASSERT(context->getClientMajorVersion() <= 2 &&
                (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
         context->handleError(Error(GL_INVALID_OPERATION));
         return false;