OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "gl/angle/SkANGLEGLContext.h" | 9 #include "gl/angle/SkANGLEGLContext.h" |
10 | 10 |
| 11 #define EGL_PLATFORM_ANGLE_ANGLE 0x3201 |
| 12 #define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3202 |
| 13 #define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3206 |
| 14 #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3207 |
| 15 |
| 16 EGLDisplay SkANGLEGLContext::GetD3DEGLDisplay(EGLNativeDisplayType nativeDisplay
) { |
| 17 |
| 18 typedef EGLDisplay (*EGLGetPlatformDisplayEXT)(EGLenum platform, |
| 19 void *native_display, |
| 20 const EGLint *attrib_list); |
| 21 EGLGetPlatformDisplayEXT eglGetPlatformDisplayEXT; |
| 22 eglGetPlatformDisplayEXT = |
| 23 (EGLGetPlatformDisplayEXT) eglGetProcAddress("eglGetPlatformDisplayEXT")
; |
| 24 |
| 25 if (!eglGetPlatformDisplayEXT) { |
| 26 return eglGetDisplay(nativeDisplay); |
| 27 } |
| 28 |
| 29 // Try for an ANGLE D3D11 context, fall back to D3D9. |
| 30 EGLint attribs[2][3] = { |
| 31 { |
| 32 EGL_PLATFORM_ANGLE_TYPE_ANGLE, |
| 33 EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, |
| 34 EGL_NONE |
| 35 }, |
| 36 { |
| 37 EGL_PLATFORM_ANGLE_TYPE_ANGLE, |
| 38 EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, |
| 39 EGL_NONE |
| 40 } |
| 41 }; |
| 42 |
| 43 EGLDisplay display = EGL_NO_DISPLAY; |
| 44 for (int i = 0; i < 2 && display == EGL_NO_DISPLAY; ++i) { |
| 45 display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, |
| 46 nativeDisplay, attribs[i]); |
| 47 } |
| 48 return display; |
| 49 } |
| 50 |
11 SkANGLEGLContext::SkANGLEGLContext() | 51 SkANGLEGLContext::SkANGLEGLContext() |
12 : fContext(EGL_NO_CONTEXT) | 52 : fContext(EGL_NO_CONTEXT) |
13 , fDisplay(EGL_NO_DISPLAY) | 53 , fDisplay(EGL_NO_DISPLAY) |
14 , fSurface(EGL_NO_SURFACE) { | 54 , fSurface(EGL_NO_SURFACE) { |
15 fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); | |
16 | |
17 EGLint majorVersion; | |
18 EGLint minorVersion; | |
19 eglInitialize(fDisplay, &majorVersion, &minorVersion); | |
20 | 55 |
21 EGLint numConfigs; | 56 EGLint numConfigs; |
22 static const EGLint configAttribs[] = { | 57 static const EGLint configAttribs[] = { |
23 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, | 58 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, |
24 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, | 59 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, |
25 EGL_RED_SIZE, 8, | 60 EGL_RED_SIZE, 8, |
26 EGL_GREEN_SIZE, 8, | 61 EGL_GREEN_SIZE, 8, |
27 EGL_BLUE_SIZE, 8, | 62 EGL_BLUE_SIZE, 8, |
28 EGL_ALPHA_SIZE, 8, | 63 EGL_ALPHA_SIZE, 8, |
29 EGL_NONE | 64 EGL_NONE |
30 }; | 65 }; |
31 | 66 |
| 67 fDisplay = GetD3DEGLDisplay(EGL_DEFAULT_DISPLAY); |
| 68 if (EGL_NO_DISPLAY == fDisplay) { |
| 69 SkDebugf("Could not create EGL display!"); |
| 70 return; |
| 71 } |
| 72 |
| 73 EGLint majorVersion; |
| 74 EGLint minorVersion; |
| 75 eglInitialize(fDisplay, &majorVersion, &minorVersion); |
| 76 |
32 EGLConfig surfaceConfig; | 77 EGLConfig surfaceConfig; |
33 eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs); | 78 eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs); |
34 | 79 |
35 static const EGLint contextAttribs[] = { | 80 static const EGLint contextAttribs[] = { |
36 EGL_CONTEXT_CLIENT_VERSION, 2, | 81 EGL_CONTEXT_CLIENT_VERSION, 2, |
37 EGL_NONE | 82 EGL_NONE |
38 }; | 83 }; |
39 fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs); | 84 fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs); |
40 | 85 |
41 | 86 |
42 static const EGLint surfaceAttribs[] = { | 87 static const EGLint surfaceAttribs[] = { |
43 EGL_WIDTH, 1, | 88 EGL_WIDTH, 1, |
44 EGL_HEIGHT, 1, | 89 EGL_HEIGHT, 1, |
45 EGL_NONE | 90 EGL_NONE |
46 }; | 91 }; |
| 92 |
47 fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); | 93 fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); |
48 | 94 |
49 eglMakeCurrent(fDisplay, fSurface, fSurface, fContext); | 95 eglMakeCurrent(fDisplay, fSurface, fSurface, fContext); |
50 | 96 |
51 fGL.reset(GrGLCreateANGLEInterface()); | 97 fGL.reset(GrGLCreateANGLEInterface()); |
52 if (NULL == fGL.get()) { | 98 if (NULL == fGL.get()) { |
53 SkDebugf("Could not create ANGLE GL interface!\n"); | 99 SkDebugf("Could not create ANGLE GL interface!\n"); |
54 this->destroyGLContext(); | 100 this->destroyGLContext(); |
55 return; | 101 return; |
56 } | 102 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { | 135 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { |
90 SkDebugf("Could not set the context.\n"); | 136 SkDebugf("Could not set the context.\n"); |
91 } | 137 } |
92 } | 138 } |
93 | 139 |
94 void SkANGLEGLContext::swapBuffers() const { | 140 void SkANGLEGLContext::swapBuffers() const { |
95 if (!eglSwapBuffers(fDisplay, fSurface)) { | 141 if (!eglSwapBuffers(fDisplay, fSurface)) { |
96 SkDebugf("Could not complete eglSwapBuffers.\n"); | 142 SkDebugf("Could not complete eglSwapBuffers.\n"); |
97 } | 143 } |
98 } | 144 } |
OLD | NEW |