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; |