Add support for EGL on linux

Allow setting skia_egl=1 to build skia against EGL instead of GLX on unix

R=bsalomon@google.com, djsollen@google.com

Author: derekf@osg.samsung.com

Review URL: https://codereview.chromium.org/543363004
diff --git a/gyp/common_variables.gypi b/gyp/common_variables.gypi
index 6d791c9..b13b475 100644
--- a/gyp/common_variables.gypi
+++ b/gyp/common_variables.gypi
@@ -50,6 +50,7 @@
         'skia_arch_type%': 'x86',
         'arm_version%': 0,
         'arm_neon%': 0,
+        'skia_egl%': 0,
       },
 
       # Re-define all variables defined within the level-3 'variables' dict,
@@ -59,6 +60,7 @@
       'skia_arch_type%': '<(skia_arch_type)',
       'arm_version%': '<(arm_version)',
       'arm_neon%': '<(arm_neon)',
+      'skia_egl%': '<(skia_egl)',
 
       'conditions': [
         [ 'skia_android_framework == 1', {
@@ -87,6 +89,7 @@
         }],
         [ 'skia_os == "android"', {
           'skia_static_initializers%': 0,
+          'skia_egl%': 1,
         }, {
           'skia_static_initializers%': 1,
         }],
@@ -95,6 +98,9 @@
           'arm_version%': 7,
           'arm_neon%': 0, # neon asm files known not to work with the ios build
         }],
+        [ 'skia_os in "nacl"', {
+          'skia_egl%': 1,
+        }],
         [ 'skia_os in ["android", "nacl"] and not skia_android_framework',
           # skia_freetype_static - on OS variants that normally would
           #     dynamically link the system FreeType library, don't do
@@ -233,6 +239,7 @@
     'skia_disable_inlining%': 0,
     'skia_moz2d%': 0,
     'skia_is_bot%': '<!(python -c "import os; print os.environ.get(\'CHROME_HEADLESS\', 0)")',
+    'skia_egl%': '<(skia_egl)',
 
     # These are referenced by our .gypi files that list files (e.g. core.gypi)
     #
diff --git a/gyp/gpu.gyp b/gyp/gpu.gyp
index 7bb61f0..8cf9f76 100644
--- a/gyp/gpu.gyp
+++ b/gyp/gpu.gyp
@@ -12,6 +12,7 @@
       }],
       ['skia_os != "linux" and skia_os != "chromeos"', {
         'sources/': [ ['exclude', '_unix.(h|cpp)$'],
+                      ['exclude', 'GrGLCreateNativeInterface_egl.cpp'],
         ],
       }],
       ['skia_os != "ios"', {
@@ -26,6 +27,14 @@
         'sources/': [ ['exclude', '_nacl.(h|cpp)$'],
         ],
       }],
+      ['skia_os == "nacl" or skia_egl == 0', {
+        'sources/': [ ['exclude', '_egl.(h|cpp)$'],
+        ],
+      }],
+      ['skia_egl == 1', {
+        'sources/': [ ['exclude', '_unix.(h|cpp)$'],
+        ],
+      }],
       # nullify the targets in this gyp file if skia_gpu is 0
       [ 'skia_gpu == 0', {
         'sources/': [
@@ -140,6 +149,16 @@
             '../src/gpu/gl/GrGLDefaultInterface_none.cpp',
             '../src/gpu/gl/GrGLCreateNativeInterface_none.cpp',
           ],
+        }],
+        [ '(skia_os == "linux" or skia_os == "chromeos") and skia_egl == 1', {
+          'link_settings': {
+            'libraries': [
+              '-lEGL',
+              '-lGLESv2',
+            ],
+          },
+        }],
+        [ '(skia_os == "linux" or skia_os == "chromeos") and skia_egl == 0', {
           'link_settings': {
             'libraries': [
               '-lGL',
@@ -155,6 +174,11 @@
             ],
           },
         }],
+        [ 'skia_egl==1', {
+          'defines': [
+            'SK_EGL',
+          ],
+        }],
         [ 'skia_mesa and skia_os == "linux"', {
           'link_settings': {
             'libraries': [
diff --git a/gyp/gpu.gypi b/gyp/gpu.gypi
index ebc07b2..3b2d801 100644
--- a/gyp/gpu.gypi
+++ b/gyp/gpu.gypi
@@ -297,6 +297,7 @@
       '<(skia_src_path)/gpu/gl/mac/GrGLCreateNativeInterface_mac.cpp',
       '<(skia_src_path)/gpu/gl/win/GrGLCreateNativeInterface_win.cpp',
       '<(skia_src_path)/gpu/gl/unix/GrGLCreateNativeInterface_unix.cpp',
+      '<(skia_src_path)/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp',
       '<(skia_src_path)/gpu/gl/iOS/GrGLCreateNativeInterface_iOS.cpp',
       '<(skia_src_path)/gpu/gl/android/GrGLCreateNativeInterface_android.cpp',
 
@@ -306,7 +307,7 @@
       '<(skia_src_path)/gpu/gl/nacl/SkNativeGLContext_nacl.cpp',
       '<(skia_src_path)/gpu/gl/win/SkNativeGLContext_win.cpp',
       '<(skia_src_path)/gpu/gl/unix/SkNativeGLContext_unix.cpp',
-      '<(skia_src_path)/gpu/gl/android/SkNativeGLContext_android.cpp',
+      '<(skia_src_path)/gpu/gl/egl/SkNativeGLContext_egl.cpp',
       '<(skia_src_path)/gpu/gl/iOS/SkNativeGLContext_iOS.mm',
     ],
     'skgpu_mesa_gl_sources': [
diff --git a/include/gpu/gl/SkNativeGLContext.h b/include/gpu/gl/SkNativeGLContext.h
index 3bb6530..14062db 100644
--- a/include/gpu/gl/SkNativeGLContext.h
+++ b/include/gpu/gl/SkNativeGLContext.h
@@ -35,7 +35,7 @@
 
 #if defined(SK_BUILD_FOR_MAC)
     #include <OpenGL/OpenGL.h>
-#elif defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_NACL)
+#elif defined(SK_EGL)
     #include <GLES2/gl2.h>
     #include <EGL/egl.h>
 #elif defined(SK_BUILD_FOR_UNIX)
@@ -64,7 +64,7 @@
     private:
     #if defined(SK_BUILD_FOR_MAC)
         CGLContextObj fOldCGLContext;
-    #elif defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_NACL)
+    #elif defined(SK_EGL)
         EGLContext fOldEGLContext;
         EGLDisplay fOldDisplay;
         EGLSurface fOldSurface;
@@ -88,7 +88,7 @@
 private:
 #if defined(SK_BUILD_FOR_MAC)
     CGLContextObj fContext;
-#elif defined(SK_BUILD_FOR_ANDROID) || defined(SK_BUILD_FOR_NACL)
+#elif defined(SK_EGL)
     EGLContext fContext;
     EGLDisplay fDisplay;
     EGLSurface fSurface;
diff --git a/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp b/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp
new file mode 100644
index 0000000..ddc9e69
--- /dev/null
+++ b/src/gpu/gl/egl/GrGLCreateNativeInterface_egl.cpp
@@ -0,0 +1,22 @@
+
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "gl/GrGLInterface.h"
+#include "gl/GrGLAssembleInterface.h"
+#include "gl/GrGLUtil.h"
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+
+static GrGLFuncPtr egl_get_gl_proc(void* ctx, const char name[]) {
+    SkASSERT(NULL == ctx);
+    return eglGetProcAddress(name);
+}
+
+const GrGLInterface* GrGLCreateNativeInterface() {
+    return GrGLAssembleInterface(NULL, egl_get_gl_proc);
+}
diff --git a/src/gpu/gl/android/SkNativeGLContext_android.cpp b/src/gpu/gl/egl/SkNativeGLContext_egl.cpp
similarity index 100%
rename from src/gpu/gl/android/SkNativeGLContext_android.cpp
rename to src/gpu/gl/egl/SkNativeGLContext_egl.cpp