aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gyp/gpu.gypi2
-rw-r--r--gyp/views.gyp1
-rw-r--r--include/gpu/gl/angle/SkANGLEGLContext.h (renamed from src/gpu/gl/angle/SkANGLEGLContext.h)2
-rw-r--r--src/gpu/gl/angle/SkANGLEGLContext.cpp64
-rw-r--r--src/views/win/SkOSWindow_win.cpp11
5 files changed, 66 insertions, 14 deletions
diff --git a/gyp/gpu.gypi b/gyp/gpu.gypi
index fe21d830cf..9803c42019 100644
--- a/gyp/gpu.gypi
+++ b/gyp/gpu.gypi
@@ -352,8 +352,8 @@
'<(skia_src_path)/gpu/gl/angle/GrGLCreateANGLEInterface.cpp',
# Sk files
+ '<(skia_include_path)/gpu/gl/angle/SkANGLEGLContext.h',
'<(skia_src_path)/gpu/gl/angle/SkANGLEGLContext.cpp',
- '<(skia_src_path)/gpu/gl/angle/SkANGLEGLContext.h',
],
'skgpu_debug_gl_sources': [
'<(skia_src_path)/gpu/gl/debug/GrGLCreateDebugInterface.cpp',
diff --git a/gyp/views.gyp b/gyp/views.gyp
index 381e125393..7f53637c12 100644
--- a/gyp/views.gyp
+++ b/gyp/views.gyp
@@ -18,6 +18,7 @@
'include_dirs': [
'../include/views',
'../include/views/unix',
+ '../src/gpu',
],
'sources': [
'../include/views/SkApplication.h',
diff --git a/src/gpu/gl/angle/SkANGLEGLContext.h b/include/gpu/gl/angle/SkANGLEGLContext.h
index 604de42b37..774e0a215d 100644
--- a/src/gpu/gl/angle/SkANGLEGLContext.h
+++ b/include/gpu/gl/angle/SkANGLEGLContext.h
@@ -33,6 +33,8 @@ public:
return ctx;
}
+ static EGLDisplay GetD3DEGLDisplay(EGLNativeDisplayType nativeDisplay);
+
private:
SkANGLEGLContext();
void destroyGLContext();
diff --git a/src/gpu/gl/angle/SkANGLEGLContext.cpp b/src/gpu/gl/angle/SkANGLEGLContext.cpp
index 2cff750fa0..9470bf0360 100644
--- a/src/gpu/gl/angle/SkANGLEGLContext.cpp
+++ b/src/gpu/gl/angle/SkANGLEGLContext.cpp
@@ -8,15 +8,50 @@
#include "gl/angle/SkANGLEGLContext.h"
+#define EGL_PLATFORM_ANGLE_ANGLE 0x3201
+#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3202
+#define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3206
+#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3207
+
+EGLDisplay SkANGLEGLContext::GetD3DEGLDisplay(EGLNativeDisplayType nativeDisplay) {
+
+ typedef EGLDisplay (*EGLGetPlatformDisplayEXT)(EGLenum platform,
+ void *native_display,
+ const EGLint *attrib_list);
+ EGLGetPlatformDisplayEXT eglGetPlatformDisplayEXT;
+ eglGetPlatformDisplayEXT =
+ (EGLGetPlatformDisplayEXT) eglGetProcAddress("eglGetPlatformDisplayEXT");
+
+ if (!eglGetPlatformDisplayEXT) {
+ return eglGetDisplay(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) {
+ display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
+ nativeDisplay, attribs[i]);
+ }
+ return display;
+}
+
SkANGLEGLContext::SkANGLEGLContext()
: fContext(EGL_NO_CONTEXT)
, fDisplay(EGL_NO_DISPLAY)
, fSurface(EGL_NO_SURFACE) {
- fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
- EGLint majorVersion;
- EGLint minorVersion;
- eglInitialize(fDisplay, &majorVersion, &minorVersion);
EGLint numConfigs;
static const EGLint configAttribs[] = {
@@ -29,6 +64,16 @@ SkANGLEGLContext::SkANGLEGLContext()
EGL_NONE
};
+ fDisplay = GetD3DEGLDisplay(EGL_DEFAULT_DISPLAY);
+ if (EGL_NO_DISPLAY == fDisplay) {
+ SkDebugf("Could not create EGL display!");
+ return;
+ }
+
+ EGLint majorVersion;
+ EGLint minorVersion;
+ eglInitialize(fDisplay, &majorVersion, &minorVersion);
+
EGLConfig surfaceConfig;
eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs);
@@ -40,10 +85,11 @@ SkANGLEGLContext::SkANGLEGLContext()
static const EGLint surfaceAttribs[] = {
- EGL_WIDTH, 1,
- EGL_HEIGHT, 1,
- EGL_NONE
- };
+ EGL_WIDTH, 1,
+ EGL_HEIGHT, 1,
+ EGL_NONE
+ };
+
fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs);
eglMakeCurrent(fDisplay, fSurface, fSurface, fContext);
diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp
index 315ac2b05a..08bbdd3a9e 100644
--- a/src/views/win/SkOSWindow_win.cpp
+++ b/src/views/win/SkOSWindow_win.cpp
@@ -21,8 +21,8 @@
#include "SkGraphics.h"
#if SK_ANGLE
+#include "gl/angle/SkANGLEGLContext.h"
#include "gl/GrGLInterface.h"
-
#include "GLES2/gl2.h"
#define ANGLE_GL_CALL(IFACE, X) \
@@ -384,6 +384,7 @@ void SkOSWindow::presentGL() {
}
#if SK_ANGLE
+
bool create_ANGLE(EGLNativeWindowType hWnd,
int msaaSampleCount,
EGLDisplay* eglDisplay,
@@ -407,9 +408,11 @@ bool create_ANGLE(EGLNativeWindowType hWnd,
EGL_NONE, EGL_NONE
};
- EGLDisplay display = eglGetDisplay(GetDC(hWnd));
- if (display == EGL_NO_DISPLAY ) {
- return false;
+ EGLDisplay display = SkANGLEGLContext::GetD3DEGLDisplay(GetDC(hWnd));
+
+ if (EGL_NO_DISPLAY == display) {
+ SkDebugf("Could not create ANGLE egl display!\n");
+ return false;
}
// Initialize EGL