| Index: src/views/win/SkOSWindow_win.cpp
 | 
| diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp
 | 
| index 8b0211d64bfb5e35ddc33341c80e64781cdc5c15..e94832314e1af3ef269fb4ca5c0dd9fa27c494b0 100644
 | 
| --- a/src/views/win/SkOSWindow_win.cpp
 | 
| +++ b/src/views/win/SkOSWindow_win.cpp
 | 
| @@ -20,27 +20,23 @@
 | 
|  #include "SkGraphics.h"
 | 
|  
 | 
|  #if SK_ANGLE
 | 
| -#include "gl/angle/SkANGLEGLContext.h"
 | 
| +#include "gl/GrGLAssembleInterface.h"
 | 
|  #include "gl/GrGLInterface.h"
 | 
|  #include "GLES2/gl2.h"
 | 
| -
 | 
| -#define ANGLE_GL_CALL(IFACE, X)                                 \
 | 
| -    do {                                                        \
 | 
| -        (IFACE)->fFunctions.f##X;                               \
 | 
| -    } while (false)
 | 
| -
 | 
| +#include <EGL/egl.h>
 | 
| +#include <EGL/eglext.h>
 | 
|  #endif // SK_ANGLE
 | 
|  
 | 
|  #if SK_COMMAND_BUFFER
 | 
|  #include "gl/command_buffer/SkCommandBufferGLContext.h"
 | 
| +#endif // SK_COMMAND_BUFFER
 | 
|  
 | 
| -#define COMMAND_BUFFER_GL_CALL(IFACE, X)                                 \
 | 
| -    do {                                                        \
 | 
| -        (IFACE)->fFunctions.f##X;                               \
 | 
| +#define GL_CALL(IFACE, X)                                 \
 | 
| +    SkASSERT(IFACE);                                      \
 | 
| +    do {                                                  \
 | 
| +        (IFACE)->fFunctions.f##X;                         \
 | 
|      } while (false)
 | 
|  
 | 
| -#endif // SK_COMMAND_BUFFER
 | 
| -
 | 
|  #define WM_EVENT_CALLBACK (WM_USER+0)
 | 
|  
 | 
|  void post_skwinevent(HWND hwnd)
 | 
| @@ -395,6 +391,69 @@ void SkOSWindow::presentGL() {
 | 
|  
 | 
|  #if SK_ANGLE
 | 
|  
 | 
| +static void* get_angle_egl_display(void* nativeDisplay) {
 | 
| +    PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
 | 
| +    eglGetPlatformDisplayEXT =
 | 
| +        (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
 | 
| +
 | 
| +    // We expect ANGLE to support this extension
 | 
| +    if (!eglGetPlatformDisplayEXT) {
 | 
| +        return EGL_NO_DISPLAY;
 | 
| +    }
 | 
| +
 | 
| +    EGLDisplay display = EGL_NO_DISPLAY;
 | 
| +    // 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
 | 
| +        },
 | 
| +    };
 | 
| +    for (int i = 0; i < 3 && display == EGL_NO_DISPLAY; ++i) {
 | 
| +        display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,nativeDisplay, attribs[i]);
 | 
| +    }
 | 
| +    return display;
 | 
| +}
 | 
| +
 | 
| +struct ANGLEAssembleContext {
 | 
| +    ANGLEAssembleContext() {
 | 
| +        fEGL = GetModuleHandle("libEGL.dll");
 | 
| +        fGL = GetModuleHandle("libEGLESv2.dll");
 | 
| +    }
 | 
| +
 | 
| +    bool isValid() const { return SkToBool(fEGL) && SkToBool(fGL); }
 | 
| +
 | 
| +    HMODULE fEGL;
 | 
| +    HMODULE fGL;
 | 
| +};
 | 
| +
 | 
| +static GrGLFuncPtr angle_get_gl_proc(void* ctx, const char name[]) {
 | 
| +    const ANGLEAssembleContext& context = *reinterpret_cast<const ANGLEAssembleContext*>(ctx);
 | 
| +    GrGLFuncPtr proc = (GrGLFuncPtr) GetProcAddress(context.fGL, name);
 | 
| +    if (proc) {
 | 
| +        return proc;
 | 
| +    }
 | 
| +    proc = (GrGLFuncPtr) GetProcAddress(context.fEGL, name);
 | 
| +    if (proc) {
 | 
| +        return proc;
 | 
| +    }
 | 
| +    return eglGetProcAddress(name);
 | 
| +}
 | 
| +
 | 
| +static const GrGLInterface* get_angle_gl_interface() {
 | 
| +    ANGLEAssembleContext context;
 | 
| +    if (!context.isValid()) {
 | 
| +        return nullptr;
 | 
| +    }
 | 
| +    return GrGLAssembleGLESInterface(&context, angle_get_gl_proc);
 | 
| +}
 | 
| +
 | 
|  bool create_ANGLE(EGLNativeWindowType hWnd,
 | 
|                    int msaaSampleCount,
 | 
|                    EGLDisplay* eglDisplay,
 | 
| @@ -418,7 +477,7 @@ bool create_ANGLE(EGLNativeWindowType hWnd,
 | 
|          EGL_NONE, EGL_NONE
 | 
|      };
 | 
|  
 | 
| -    EGLDisplay display = SkANGLEGLContext::GetD3DEGLDisplay(GetDC(hWnd), false);
 | 
| +    EGLDisplay display = get_angle_egl_display(GetDC(hWnd));
 | 
|  
 | 
|      if (EGL_NO_DISPLAY == display) {
 | 
|          SkDebugf("Could not create ANGLE egl display!\n");
 | 
| @@ -500,32 +559,31 @@ bool SkOSWindow::attachANGLE(int msaaSampleCount, AttachmentInfo* info) {
 | 
|          if (false == bResult) {
 | 
|              return false;
 | 
|          }
 | 
| -        SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
 | 
| -
 | 
| -        if (intf) {
 | 
| -            ANGLE_GL_CALL(intf, ClearStencil(0));
 | 
| -            ANGLE_GL_CALL(intf, ClearColor(0, 0, 0, 0));
 | 
| -            ANGLE_GL_CALL(intf, StencilMask(0xffffffff));
 | 
| -            ANGLE_GL_CALL(intf, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_BUFFER_BIT));
 | 
| +        fANGLEInterface.reset(get_angle_gl_interface());
 | 
| +        if (!fANGLEInterface) {
 | 
| +            this->detachANGLE();
 | 
| +            return false;
 | 
| +        }
 | 
| +        GL_CALL(fANGLEInterface, ClearStencil(0));
 | 
| +        GL_CALL(fANGLEInterface, ClearColor(0, 0, 0, 0));
 | 
| +        GL_CALL(fANGLEInterface, StencilMask(0xffffffff));
 | 
| +        GL_CALL(fANGLEInterface, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_BUFFER_BIT));
 | 
| +        if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
 | 
| +            this->detachANGLE();
 | 
| +            return false;
 | 
|          }
 | 
| -    }
 | 
| -    if (eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
 | 
|          eglGetConfigAttrib(fDisplay, fConfig, EGL_STENCIL_SIZE, &info->fStencilBits);
 | 
|          eglGetConfigAttrib(fDisplay, fConfig, EGL_SAMPLES, &info->fSampleCount);
 | 
|  
 | 
| -        SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
 | 
| -
 | 
| -        if (intf ) {
 | 
| -            ANGLE_GL_CALL(intf, Viewport(0, 0,
 | 
| -                                         SkScalarRoundToInt(this->width()),
 | 
| -                                         SkScalarRoundToInt(this->height())));
 | 
| -        }
 | 
| +        GL_CALL(fANGLEInterface, Viewport(0, 0, SkScalarRoundToInt(this->width()),
 | 
| +                                                SkScalarRoundToInt(this->height())));
 | 
|          return true;
 | 
|      }
 | 
|      return false;
 | 
|  }
 | 
|  
 | 
|  void SkOSWindow::detachANGLE() {
 | 
| +    fANGLEInterface.reset(nullptr);
 | 
|      eglMakeCurrent(fDisplay, EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT);
 | 
|  
 | 
|      eglDestroyContext(fDisplay, fContext);
 | 
| @@ -539,11 +597,7 @@ void SkOSWindow::detachANGLE() {
 | 
|  }
 | 
|  
 | 
|  void SkOSWindow::presentANGLE() {
 | 
| -    SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
 | 
| -
 | 
| -    if (intf) {
 | 
| -        ANGLE_GL_CALL(intf, Flush());
 | 
| -    }
 | 
| +    GL_CALL(fANGLEInterface, Flush());
 | 
|  
 | 
|      eglSwapBuffers(fDisplay, fSurface);
 | 
|  }
 | 
| @@ -559,10 +613,10 @@ bool SkOSWindow::attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info)
 | 
|  
 | 
|          SkAutoTUnref<const GrGLInterface> intf(GrGLCreateCommandBufferInterface());
 | 
|          if (intf) {
 | 
| -            COMMAND_BUFFER_GL_CALL(intf, ClearStencil(0));
 | 
| -            COMMAND_BUFFER_GL_CALL(intf, ClearColor(0, 0, 0, 0));
 | 
| -            COMMAND_BUFFER_GL_CALL(intf, StencilMask(0xffffffff));
 | 
| -            COMMAND_BUFFER_GL_CALL(intf, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_BUFFER_BIT));
 | 
| +            GL_CALL(intf, ClearStencil(0));
 | 
| +            GL_CALL(intf, ClearColor(0, 0, 0, 0));
 | 
| +            GL_CALL(intf, StencilMask(0xffffffff));
 | 
| +            GL_CALL(intf, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_BUFFER_BIT));
 | 
|          }
 | 
|      }
 | 
|  
 | 
| @@ -573,8 +627,7 @@ bool SkOSWindow::attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info)
 | 
|          SkAutoTUnref<const GrGLInterface> intf(GrGLCreateCommandBufferInterface());
 | 
|  
 | 
|          if (intf ) {
 | 
| -            COMMAND_BUFFER_GL_CALL(intf, Viewport(0, 0,
 | 
| -                                         SkScalarRoundToInt(this->width()),
 | 
| +            GL_CALL(intf, Viewport(0, 0, SkScalarRoundToInt(this->width()),
 | 
|                                           SkScalarRoundToInt(this->height())));
 | 
|          }
 | 
|          return true;
 | 
| 
 |