skia: Add ANGLE with GL backend to nanobench/DM

This will allow us to test this without hacking it in, might be useful
for others too.

Review URL: https://codereview.chromium.org/1338003002
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index a5a70d9..e7019dc 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -443,6 +443,7 @@
         GPU_CONFIG(nullgpu, kNull_GLContextType, 0, false)
 #ifdef SK_ANGLE
         GPU_CONFIG(angle, kANGLE_GLContextType, 0, false)
+        GPU_CONFIG(angle-gl, kANGLE_GL_GLContextType, 0, false)
 #endif
 #ifdef SK_COMMAND_BUFFER
         GPU_CONFIG(commandbuffer, kCommandBuffer_GLContextType, 0, false)
diff --git a/dm/DM.cpp b/dm/DM.cpp
index accc934..7d8d610 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -566,6 +566,7 @@
         SINK("nvprmsaa16",    GPUSink, Gr::kNVPR_GLContextType,          api, 16,  true, FLAGS_gpu_threading);
     #if SK_ANGLE
         SINK("angle",         GPUSink, Gr::kANGLE_GLContextType,         api,  0, false, FLAGS_gpu_threading);
+        SINK("angle-gl",      GPUSink, Gr::kANGLE_GL_GLContextType,      api,  0, false, FLAGS_gpu_threading);
     #endif
     #if SK_COMMAND_BUFFER
         SINK("commandbuffer", GPUSink, Gr::kCommandBuffer_GLContextType, api,  0, false, FLAGS_gpu_threading);
diff --git a/dm/DMGpuSupport.h b/dm/DMGpuSupport.h
index 0b9596e..9e10231 100644
--- a/dm/DMGpuSupport.h
+++ b/dm/DMGpuSupport.h
@@ -65,6 +65,7 @@
     typedef int GLContextType;
 
     static const GLContextType kANGLE_GLContextType         = 0,
+                               kANGLE_GL_GLContextType      = 0,
                                kCommandBuffer_GLContextType = 0,
                                kDebug_GLContextType         = 0,
                                kMESA_GLContextType          = 0,
diff --git a/include/gpu/gl/angle/SkANGLEGLContext.h b/include/gpu/gl/angle/SkANGLEGLContext.h
index 6590c76..8d5f830 100644
--- a/include/gpu/gl/angle/SkANGLEGLContext.h
+++ b/include/gpu/gl/angle/SkANGLEGLContext.h
@@ -16,11 +16,11 @@
 public:
     ~SkANGLEGLContext() override;
 
-    static SkANGLEGLContext* Create(GrGLStandard forcedGpuAPI) {
+    static SkANGLEGLContext* Create(GrGLStandard forcedGpuAPI, bool useGLBackend) {
         if (kGL_GrGLStandard == forcedGpuAPI) {
             return NULL;
         }
-        SkANGLEGLContext* ctx = new SkANGLEGLContext;
+        SkANGLEGLContext* ctx = new SkANGLEGLContext(useGLBackend);
         if (!ctx->isValid()) {
             delete ctx;
             return NULL;
@@ -29,10 +29,10 @@
     }
 
     // The param is an EGLNativeDisplayType and the return is an EGLDispay.
-    static void* GetD3DEGLDisplay(void* nativeDisplay);
+    static void* GetD3DEGLDisplay(void* nativeDisplay, bool useGLBackend);
 
 private:
-    SkANGLEGLContext();
+    SkANGLEGLContext(bool preferGLBackend);
     void destroyGLContext();
 
     void onPlatformMakeCurrent() const override;
diff --git a/src/gpu/GrContextFactory.cpp b/src/gpu/GrContextFactory.cpp
index 0fe01df..acd5d93 100755
--- a/src/gpu/GrContextFactory.cpp
+++ b/src/gpu/GrContextFactory.cpp
@@ -43,7 +43,10 @@
             break;
 #ifdef SK_ANGLE
         case kANGLE_GLContextType:
-            glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI));
+            glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI, false));
+            break;
+        case kANGLE_GL_GLContextType:
+            glCtx.reset(SkANGLEGLContext::Create(forcedGpuAPI, true));
             break;
 #endif
 #ifdef SK_COMMAND_BUFFER
diff --git a/src/gpu/GrContextFactory.h b/src/gpu/GrContextFactory.h
index 2accd73..130c333 100644
--- a/src/gpu/GrContextFactory.h
+++ b/src/gpu/GrContextFactory.h
@@ -33,6 +33,7 @@
       kNative_GLContextType,
 #if SK_ANGLE
       kANGLE_GLContextType,
+      kANGLE_GL_GLContextType,
 #endif
 #if SK_COMMAND_BUFFER
       kCommandBuffer_GLContextType,
@@ -70,6 +71,8 @@
 #if SK_ANGLE
             case kANGLE_GLContextType:
                 return "angle";
+            case kANGLE_GL_GLContextType:
+                return "angle-gl";
 #endif
 #if SK_COMMAND_BUFFER
             case kCommandBuffer_GLContextType:
diff --git a/src/gpu/gl/angle/SkANGLEGLContext.cpp b/src/gpu/gl/angle/SkANGLEGLContext.cpp
index 8ebdcb6..64a3bde 100644
--- a/src/gpu/gl/angle/SkANGLEGLContext.cpp
+++ b/src/gpu/gl/angle/SkANGLEGLContext.cpp
@@ -15,8 +15,9 @@
 #define EGL_PLATFORM_ANGLE_TYPE_ANGLE           0x3203
 #define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE      0x3207
 #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE     0x3208
+#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE    0x320D
 
-void* SkANGLEGLContext::GetD3DEGLDisplay(void* nativeDisplay) {
+void* SkANGLEGLContext::GetD3DEGLDisplay(void* nativeDisplay, bool useGLBackend) {
     PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
     eglGetPlatformDisplayEXT =
         (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
@@ -25,29 +26,44 @@
         return eglGetDisplay(static_cast<EGLNativeDisplayType>(nativeDisplay));
     }
 
-    // Try for an ANGLE D3D11 context, fall back to D3D9.
-    EGLint attribs[2][3] = {
-        {
-            EGL_PLATFORM_ANGLE_TYPE_ANGLE,
-            EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
-            EGL_NONE
-        },
-        {
-            EGL_PLATFORM_ANGLE_TYPE_ANGLE,
-            EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,
-            EGL_NONE
-        }
-    };
-
     EGLDisplay display = EGL_NO_DISPLAY;
-    for (int i = 0; i < 2 && display == EGL_NO_DISPLAY; ++i) {
+    if (useGLBackend) {
+        // Try for an ANGLE D3D11 context, fall back to D3D9.
+        EGLint attribs[3] = {
+              EGL_PLATFORM_ANGLE_TYPE_ANGLE,
+              EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
+              EGL_NONE
+        };
         display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
-                                            nativeDisplay, attribs[i]);
+                                            nativeDisplay, attribs);
+    } else {
+        // Try for an ANGLE D3D11 context, fall back to D3D9, and finally GL.
+        EGLint attribs[3][3] = {
+            {
+                EGL_PLATFORM_ANGLE_TYPE_ANGLE,
+                EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
+                EGL_NONE
+            },
+            {
+                EGL_PLATFORM_ANGLE_TYPE_ANGLE,
+                EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,
+                EGL_NONE
+            },
+            {
+                EGL_PLATFORM_ANGLE_TYPE_ANGLE,
+                EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
+                EGL_NONE
+            }
+        };
+        for (int i = 0; i < 3 && display == EGL_NO_DISPLAY; ++i) {
+            display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
+                                                nativeDisplay, attribs[i]);
+        }
     }
     return display;
 }
 
-SkANGLEGLContext::SkANGLEGLContext()
+SkANGLEGLContext::SkANGLEGLContext(bool useGLBackend)
     : fContext(EGL_NO_CONTEXT)
     , fDisplay(EGL_NO_DISPLAY)
     , fSurface(EGL_NO_SURFACE) {
@@ -63,7 +79,7 @@
         EGL_NONE
     };
 
-    fDisplay = GetD3DEGLDisplay(EGL_DEFAULT_DISPLAY);
+    fDisplay = GetD3DEGLDisplay(EGL_DEFAULT_DISPLAY, useGLBackend);
     if (EGL_NO_DISPLAY == fDisplay) {
         SkDebugf("Could not create EGL display!");
         return;
diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp
index 2fb9155..aba5a6f 100644
--- a/src/views/win/SkOSWindow_win.cpp
+++ b/src/views/win/SkOSWindow_win.cpp
@@ -418,7 +418,7 @@
         EGL_NONE, EGL_NONE
     };
 
-    EGLDisplay display = SkANGLEGLContext::GetD3DEGLDisplay(GetDC(hWnd));
+    EGLDisplay display = SkANGLEGLContext::GetD3DEGLDisplay(GetDC(hWnd), false);
 
     if (EGL_NO_DISPLAY == display) {
         SkDebugf("Could not create ANGLE egl display!\n");
diff --git a/tests/SkpSkGrTest.cpp b/tests/SkpSkGrTest.cpp
index da19843..98c54e0 100644
--- a/tests/SkpSkGrTest.cpp
+++ b/tests/SkpSkGrTest.cpp
@@ -260,7 +260,6 @@
 typedef GrContextFactory::GLContextType GLContextType;
 #ifdef SK_BUILD_FOR_WIN
 static const GLContextType kAngle = GrContextFactory::kANGLE_GLContextType;
-static const GLContextType kCommandBuffer = GrContextFactory::kCommandBuffer_GLContextType;
 #else
 static const GLContextType kNative = GrContextFactory::kNative_GLContextType;
 #endif