GrGLES: unify MakeNativeInterface_{android,egl}

BUG=skia:3508
Change-Id: Ibc98ea3e579cb545635c28d345cae24f57d0c2a3
Reviewed-on: https://skia-review.googlesource.com/114471
Commit-Queue: Hal Canary <halcanary@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 0fd1251..7262034 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -585,7 +585,7 @@
                            "abspath")
   libs = []
   if (is_android) {
-    sources += [ "src/gpu/gl/android/GrGLMakeNativeInterface_android.cpp" ]
+    sources += [ "src/gpu/gl/egl/GrGLMakeNativeInterface_egl.cpp" ]
 
     # this lib is required to link against AHardwareBuffer
     if (defined(ndk_api) && ndk_api >= 26) {
@@ -898,6 +898,9 @@
 
   if (is_linux) {
     sources += [ "src/ports/SkDebug_stdio.cpp" ]
+    if (skia_use_egl) {
+      libs += [ "GLESv2" ]
+    }
   }
 
   if (is_mac) {
diff --git a/src/gpu/gl/android/GrGLMakeNativeInterface_android.cpp b/src/gpu/gl/android/GrGLMakeNativeInterface_android.cpp
index a8732d7..5e5d4c2 100644
--- a/src/gpu/gl/android/GrGLMakeNativeInterface_android.cpp
+++ b/src/gpu/gl/android/GrGLMakeNativeInterface_android.cpp
@@ -4,140 +4,4 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "SkTypes.h"
-#if defined(SK_BUILD_FOR_ANDROID)
-
-#include "gl/GrGLInterface.h"
-#include "gl/GrGLAssembleInterface.h"
-#include "gl/GrGLUtil.h"
-
-#include <EGL/egl.h>
-#ifndef GL_GLEXT_PROTOTYPES
-#define GL_GLEXT_PROTOTYPES
-#endif
-#include <GLES2/gl2.h>
-
-static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) {
-    SkASSERT(nullptr == ctx);
-    // Some older drivers on Android have busted eglGetProcAdddress Functions that
-    // will return the wrong pointer for built in GLES2 functions. This set of functions
-    // was generated on a Xoom by finding mismatches between the function pulled in via gl2.h and
-    // the address returned by eglGetProcAddress.
-
-    #define M(X) if (0 == strcmp(#X, name)) { return (GrGLFuncPtr) X; }
-    M(eglGetCurrentDisplay);
-    M(eglQueryString);
-    M(glActiveTexture);
-    M(glAttachShader);
-    M(glBindAttribLocation);
-    M(glBindBuffer);
-    M(glBindFramebuffer);
-    M(glBindRenderbuffer);
-    M(glBindTexture);
-    M(glBlendColor);
-    M(glBlendEquation);
-    M(glBlendFunc);
-    M(glBufferData);
-    M(glBufferSubData);
-    M(glCheckFramebufferStatus);
-    M(glClear);
-    M(glClearColor);
-    M(glClearStencil);
-    M(glColorMask);
-    M(glCompileShader);
-    M(glCompressedTexImage2D);
-    M(glCompressedTexSubImage2D);
-    M(glCopyTexSubImage2D);
-    M(glCreateProgram);
-    M(glCreateShader);
-    M(glCullFace);
-    M(glDeleteBuffers);
-    M(glDeleteFramebuffers);
-    M(glDeleteProgram);
-    M(glDeleteRenderbuffers);
-    M(glDeleteShader);
-    M(glDeleteTextures);
-    M(glDepthMask);
-    M(glDisable);
-    M(glDisableVertexAttribArray);
-    M(glDrawArrays);
-    M(glDrawElements);
-    M(glEnable);
-    M(glEnableVertexAttribArray);
-    M(glFinish);
-    M(glFlush);
-    M(glFramebufferRenderbuffer);
-    M(glFramebufferTexture2D);
-    M(glFrontFace);
-    M(glGenBuffers);
-    M(glGenFramebuffers);
-    M(glGenRenderbuffers);
-    M(glGenTextures);
-    M(glGenerateMipmap);
-    M(glGetBufferParameteriv);
-    M(glGetError);
-    M(glGetFramebufferAttachmentParameteriv);
-    M(glGetIntegerv);
-    M(glGetProgramInfoLog);
-    M(glGetProgramiv);
-    M(glGetRenderbufferParameteriv);
-    M(glGetShaderInfoLog);
-    M(glGetShaderPrecisionFormat);
-    M(glGetShaderiv);
-    M(glGetString);
-    M(glGetUniformLocation);
-    M(glIsTexture);
-    M(glLineWidth);
-    M(glLinkProgram);
-    M(glPixelStorei);
-    M(glReadPixels);
-    M(glRenderbufferStorage);
-    M(glScissor);
-    M(glShaderSource);
-    M(glStencilFunc);
-    M(glStencilFuncSeparate);
-    M(glStencilMask);
-    M(glStencilMaskSeparate);
-    M(glStencilOp);
-    M(glStencilOpSeparate);
-    M(glTexImage2D);
-    M(glTexParameteri);
-    M(glTexParameteriv);
-    M(glTexSubImage2D);
-    M(glUniform1f);
-    M(glUniform1fv);
-    M(glUniform1i);
-    M(glUniform1iv);
-    M(glUniform2f);
-    M(glUniform2fv);
-    M(glUniform2i);
-    M(glUniform2iv);
-    M(glUniform3f);
-    M(glUniform3fv);
-    M(glUniform3i);
-    M(glUniform3iv);
-    M(glUniform4f);
-    M(glUniform4fv);
-    M(glUniform4i);
-    M(glUniform4iv);
-    M(glUniformMatrix2fv);
-    M(glUniformMatrix3fv);
-    M(glUniformMatrix4fv);
-    M(glUseProgram);
-    M(glVertexAttrib1f);
-    M(glVertexAttrib2fv);
-    M(glVertexAttrib3fv);
-    M(glVertexAttrib4fv);
-    M(glVertexAttribPointer);
-    M(glViewport);
-    #undef M
-    return eglGetProcAddress(name);
-}
-
-sk_sp<const GrGLInterface> GrGLMakeNativeInterface() {
-    return GrGLMakeAssembledInterface(nullptr, android_get_gl_proc);
-}
-
-const GrGLInterface* GrGLCreateNativeInterface() { return GrGLMakeNativeInterface().release(); }
-
-#endif//defined(SK_BUILD_FOR_ANDROID)
+#include "../egl/GrGLMakeNativeInterface_egl.cpp"
diff --git a/src/gpu/gl/egl/GrGLMakeNativeInterface_egl.cpp b/src/gpu/gl/egl/GrGLMakeNativeInterface_egl.cpp
index e50d9cd..de1b1bb 100644
--- a/src/gpu/gl/egl/GrGLMakeNativeInterface_egl.cpp
+++ b/src/gpu/gl/egl/GrGLMakeNativeInterface_egl.cpp
@@ -9,19 +9,123 @@
 #include "gl/GrGLUtil.h"
 
 #include <EGL/egl.h>
+#ifndef GL_GLEXT_PROTOTYPES
+#define GL_GLEXT_PROTOTYPES
+#endif
 #include <GLES2/gl2.h>
 
 static GrGLFuncPtr egl_get_gl_proc(void* ctx, const char name[]) {
     SkASSERT(nullptr == ctx);
-    GrGLFuncPtr ptr = eglGetProcAddress(name);
-    if (!ptr) {
-        if (0 == strcmp("eglQueryString", name)) {
-            return (GrGLFuncPtr)eglQueryString;
-        } else if (0 == strcmp("eglGetCurrentDisplay", name)) {
-            return (GrGLFuncPtr)eglGetCurrentDisplay;
-        }
-    }
-    return ptr;
+    // https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_get_all_proc_addresses.txt
+    // eglGetProcAddress() is not guaranteed to support the querying of non-extension EGL functions.
+    #define M(X) if (0 == strcmp(#X, name)) { return (GrGLFuncPtr) X; }
+    M(eglGetCurrentDisplay);
+    M(eglQueryString);
+    M(glActiveTexture);
+    M(glAttachShader);
+    M(glBindAttribLocation);
+    M(glBindBuffer);
+    M(glBindFramebuffer);
+    M(glBindRenderbuffer);
+    M(glBindTexture);
+    M(glBlendColor);
+    M(glBlendEquation);
+    M(glBlendFunc);
+    M(glBufferData);
+    M(glBufferSubData);
+    M(glCheckFramebufferStatus);
+    M(glClear);
+    M(glClearColor);
+    M(glClearStencil);
+    M(glColorMask);
+    M(glCompileShader);
+    M(glCompressedTexImage2D);
+    M(glCompressedTexSubImage2D);
+    M(glCopyTexSubImage2D);
+    M(glCreateProgram);
+    M(glCreateShader);
+    M(glCullFace);
+    M(glDeleteBuffers);
+    M(glDeleteFramebuffers);
+    M(glDeleteProgram);
+    M(glDeleteRenderbuffers);
+    M(glDeleteShader);
+    M(glDeleteTextures);
+    M(glDepthMask);
+    M(glDisable);
+    M(glDisableVertexAttribArray);
+    M(glDrawArrays);
+    M(glDrawElements);
+    M(glEnable);
+    M(glEnableVertexAttribArray);
+    M(glFinish);
+    M(glFlush);
+    M(glFramebufferRenderbuffer);
+    M(glFramebufferTexture2D);
+    M(glFrontFace);
+    M(glGenBuffers);
+    M(glGenFramebuffers);
+    M(glGenRenderbuffers);
+    M(glGenTextures);
+    M(glGenerateMipmap);
+    M(glGetBufferParameteriv);
+    M(glGetError);
+    M(glGetFramebufferAttachmentParameteriv);
+    M(glGetIntegerv);
+    M(glGetProgramInfoLog);
+    M(glGetProgramiv);
+    M(glGetRenderbufferParameteriv);
+    M(glGetShaderInfoLog);
+    M(glGetShaderPrecisionFormat);
+    M(glGetShaderiv);
+    M(glGetString);
+    M(glGetUniformLocation);
+    M(glIsTexture);
+    M(glLineWidth);
+    M(glLinkProgram);
+    M(glPixelStorei);
+    M(glReadPixels);
+    M(glRenderbufferStorage);
+    M(glScissor);
+    M(glShaderSource);
+    M(glStencilFunc);
+    M(glStencilFuncSeparate);
+    M(glStencilMask);
+    M(glStencilMaskSeparate);
+    M(glStencilOp);
+    M(glStencilOpSeparate);
+    M(glTexImage2D);
+    M(glTexParameteri);
+    M(glTexParameteriv);
+    M(glTexSubImage2D);
+    M(glUniform1f);
+    M(glUniform1fv);
+    M(glUniform1i);
+    M(glUniform1iv);
+    M(glUniform2f);
+    M(glUniform2fv);
+    M(glUniform2i);
+    M(glUniform2iv);
+    M(glUniform3f);
+    M(glUniform3fv);
+    M(glUniform3i);
+    M(glUniform3iv);
+    M(glUniform4f);
+    M(glUniform4fv);
+    M(glUniform4i);
+    M(glUniform4iv);
+    M(glUniformMatrix2fv);
+    M(glUniformMatrix3fv);
+    M(glUniformMatrix4fv);
+    M(glUseProgram);
+    M(glVertexAttrib1f);
+    M(glVertexAttrib2fv);
+    M(glVertexAttrib3fv);
+    M(glVertexAttrib4fv);
+    M(glVertexAttribPointer);
+    M(glViewport);
+    #undef M
+    return eglGetProcAddress(name);
 }
 
 sk_sp<const GrGLInterface> GrGLMakeNativeInterface() {