Encapsulate GL version and standard into a struct and enum.

Change-Id: I9f51971c1bfd51424605b2687b5fd107d58c9a67
Reviewed-on: https://chromium-review.googlesource.com/273139
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/273572
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/FunctionsGL.cpp b/src/libANGLE/renderer/gl/FunctionsGL.cpp
index 035dde6..da08392 100644
--- a/src/libANGLE/renderer/gl/FunctionsGL.cpp
+++ b/src/libANGLE/renderer/gl/FunctionsGL.cpp
@@ -16,8 +16,7 @@
 namespace rx
 {
 
-static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, GLuint *outMajorVersion, GLuint *outMinorVersion,
-                         bool *outIsES)
+static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, gl::Version *outVersion, StandardGL *outStandard)
 {
     const std::string version = reinterpret_cast<const char*>(getStringFunction(GL_VERSION));
     if (version.find("OpenGL ES") == std::string::npos)
@@ -27,17 +26,15 @@
         // The version number is either of the form major number.minor number or major
         // number.minor number.release number, where the numbers all have one or more
         // digits
-        *outIsES = false;
-        *outMajorVersion = version[0] - '0';
-        *outMinorVersion = version[2] - '0';
+        *outStandard = STANDARD_GL_DESKTOP;
+        *outVersion = gl::Version(version[0] - '0', version[2] - '0');
     }
     else
     {
         // ES spec states that the GL_VERSION string will be in the following format:
         // "OpenGL ES N.M vendor-specific information"
-        *outIsES = true;
-        *outMajorVersion = version[10] - '0';
-        *outMinorVersion = version[12] - '0';
+        *outStandard = STANDARD_GL_ES;
+        *outVersion = gl::Version(version[10] - '0', version[12] - '0');
     }
 }
 
@@ -83,9 +80,8 @@
 }
 
 FunctionsGL::FunctionsGL()
-    : majorVersion(0),
-      minorVersion(0),
-      openGLES(false),
+    : version(),
+      standard(),
       extensions(),
 
       blendFunc(nullptr),
@@ -777,10 +773,10 @@
 {
     // Grab the version number
     AssignGLEntryPoint(loadProcAddress("glGetString"), &getString);
-    GetGLVersion(getString, &majorVersion, &minorVersion, &openGLES);
+    GetGLVersion(getString, &version, &standard);
 
     // Grab the GL extensions
-    if (majorVersion >= 3)
+    if (isAtLeastGL(gl::Version(3, 0)))
     {
         AssignGLEntryPoint(loadProcAddress("glGetIntegerv"), &getIntegerv);
         AssignGLEntryPoint(loadProcAddress("glGetStringi"), &getStringi);
@@ -793,7 +789,7 @@
     }
 
     // 1.0
-    if (majorVersion >= 1)
+    if (isAtLeastGL(gl::Version(1, 0)))
     {
         AssignGLEntryPoint(loadProcAddress("glBlendFunc"), &blendFunc);
         AssignGLEntryPoint(loadProcAddress("glClear"), &clear);
@@ -846,7 +842,7 @@
     }
 
     // 1.1
-    if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 1))
+    if (isAtLeastGL(gl::Version(1, 1)))
     {
         AssignGLEntryPoint(loadProcAddress("glBindTexture"), &bindTexture);
         AssignGLEntryPoint(loadProcAddress("glCopyTexImage1D"), &copyTexImage1D);
@@ -879,7 +875,7 @@
     }
 
     // 1.2
-    if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 2))
+    if (isAtLeastGL(gl::Version(1, 2)))
     {
         AssignGLEntryPoint(loadProcAddress("glBlendColor"), &blendColor);
         AssignGLEntryPoint(loadProcAddress("glBlendEquation"), &blendEquation);
@@ -906,7 +902,7 @@
     }
 
     // 1.3
-    if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 3))
+    if (isAtLeastGL(gl::Version(1, 3)))
     {
         AssignGLEntryPoint(loadProcAddress("glActiveTexture"), &activeTexture);
         AssignGLEntryPoint(loadProcAddress("glCompressedTexImage1D"), &compressedTexImage1D);
@@ -920,7 +916,7 @@
     }
 
     // 1.4
-    if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 4))
+    if (isAtLeastGL(gl::Version(1, 4)))
     {
         AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparate"), &blendFuncSeparate);
         AssignGLEntryPoint(loadProcAddress("glMultiDrawArrays"), &multiDrawArrays);
@@ -932,7 +928,7 @@
     }
 
     // 1.5
-    if (majorVersion > 1 || (majorVersion == 1 && minorVersion >= 5))
+    if (isAtLeastGL(gl::Version(1, 5)))
     {
         AssignGLEntryPoint(loadProcAddress("glBeginQuery"), &beginQuery);
         AssignGLEntryPoint(loadProcAddress("glBindBuffer"), &bindBuffer);
@@ -956,7 +952,7 @@
     }
 
     // 2.0
-    if (majorVersion >= 2)
+    if (isAtLeastGL(gl::Version(2, 0)))
     {
         AssignGLEntryPoint(loadProcAddress("glAttachShader"), &attachShader);
         AssignGLEntryPoint(loadProcAddress("glBindAttribLocation"), &bindAttribLocation);
@@ -1054,7 +1050,7 @@
     }
 
     // 2.1
-    if (majorVersion > 2 || (majorVersion == 2 && minorVersion >= 1))
+    if (isAtLeastGL(gl::Version(2, 1)))
     {
         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x3fv"), &uniformMatrix2x3fv);
         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x4fv"), &uniformMatrix2x4fv);
@@ -1065,7 +1061,7 @@
     }
 
     // 3.0
-    if (majorVersion >= 3)
+    if (isAtLeastGL(gl::Version(3, 0)))
     {
         AssignGLEntryPoint(loadProcAddress("glBeginConditionalRender"), &beginConditionalRender);
         AssignGLEntryPoint(loadProcAddress("glBeginTransformFeedback"), &beginTransformFeedback);
@@ -1157,7 +1153,7 @@
     }
 
     // 3.1
-    if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 1))
+    if (isAtLeastGL(gl::Version(3, 1)))
     {
         AssignGLEntryPoint(loadProcAddress("glCopyBufferSubData"), &copyBufferSubData);
         AssignGLEntryPoint(loadProcAddress("glDrawArraysInstanced"), &drawArraysInstanced);
@@ -1184,7 +1180,7 @@
     }
 
     // 3.2
-    if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 2))
+    if (isAtLeastGL(gl::Version(3, 2)))
     {
         AssignGLEntryPoint(loadProcAddress("glClientWaitSync"), &clientWaitSync);
         AssignGLEntryPoint(loadProcAddress("glDeleteSync"), &deleteSync);
@@ -1208,7 +1204,7 @@
     }
 
     // 3.3
-    if (majorVersion > 3 || (majorVersion == 3 && minorVersion >= 3))
+    if (isAtLeastGL(gl::Version(3, 3)))
     {
         AssignGLEntryPoint(loadProcAddress("glBindFragDataLocationIndexed"), &bindFragDataLocationIndexed);
         AssignGLEntryPoint(loadProcAddress("glBindSampler"), &bindSampler);
@@ -1241,7 +1237,7 @@
     }
 
     // 4.0
-    if (majorVersion >= 4)
+    if (isAtLeastGL(gl::Version(4, 0)))
     {
         AssignGLEntryPoint(loadProcAddress("glBeginQueryIndexed"), &beginQueryIndexed);
         AssignGLEntryPoint(loadProcAddress("glBindTransformFeedback"), &bindTransformFeedback);
@@ -1292,7 +1288,7 @@
     }
 
     // 4.1
-    if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 1))
+    if (isAtLeastGL(gl::Version(4, 1)))
     {
         AssignGLEntryPoint(loadProcAddress("glActiveShaderProgram"), &activeShaderProgram);
         AssignGLEntryPoint(loadProcAddress("glBindProgramPipeline"), &bindProgramPipeline);
@@ -1385,7 +1381,7 @@
     }
 
     // 4.2
-    if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 2))
+    if (isAtLeastGL(gl::Version(4, 2)))
     {
         AssignGLEntryPoint(loadProcAddress("glBindImageTexture"), &bindImageTexture);
         AssignGLEntryPoint(loadProcAddress("glDrawArraysInstancedBaseInstance"), &drawArraysInstancedBaseInstance);
@@ -1402,7 +1398,7 @@
     }
 
     // 4.3
-    if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 3))
+    if (isAtLeastGL(gl::Version(4, 3)))
     {
         AssignGLEntryPoint(loadProcAddress("glBindVertexBuffer"), &bindVertexBuffer);
         AssignGLEntryPoint(loadProcAddress("glClearBufferData"), &clearBufferData);
@@ -1451,7 +1447,7 @@
     }
 
     // 4.4
-    if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 4))
+    if (isAtLeastGL(gl::Version(4, 4)))
     {
         AssignGLEntryPoint(loadProcAddress("glBindBuffersBase"), &bindBuffersBase);
         AssignGLEntryPoint(loadProcAddress("glBindBuffersRange"), &bindBuffersRange);
@@ -1465,7 +1461,7 @@
     }
 
     // 4.5
-    if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 5))
+    if (isAtLeastGL(gl::Version(4, 5)))
     {
         AssignGLEntryPoint(loadProcAddress("glBindTextureUnit"), &bindTextureUnit);
         AssignGLEntryPoint(loadProcAddress("glBlitNamedFramebuffer"), &blitNamedFramebuffer);
@@ -1580,6 +1576,16 @@
     }
 }
 
+bool FunctionsGL::isAtLeastGL(const gl::Version &glVersion) const
+{
+    return standard == STANDARD_GL_DESKTOP && version >= glVersion;
+}
+
+bool FunctionsGL::isAtLeastGLES(const gl::Version &glesVersion) const
+{
+    return standard == STANDARD_GL_ES && version >= glesVersion;
+}
+
 bool FunctionsGL::hasExtension(const std::string &ext) const
 {
     return std::find(extensions.begin(), extensions.end(), ext) != extensions.end();