| Index: src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
|
| diff --git a/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp b/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
|
| index 946cd4af2c1c190dc1afedfc52e88045167bc6f8..cf9da9365b195a43775305e8f0f98d08d3511eef 100644
|
| --- a/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
|
| +++ b/src/gpu/gl/command_buffer/SkCommandBufferGLContext.cpp
|
| @@ -33,7 +33,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void);
|
| #define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0)
|
| #define EGL_SURFACE_TYPE 0x3033
|
| #define EGL_PBUFFER_BIT 0x0001
|
| -#define EGL_WINDOW_BIT 0x0004
|
| #define EGL_RENDERABLE_TYPE 0x3040
|
| #define EGL_RED_SIZE 0x3024
|
| #define EGL_GREEN_SIZE 0x3023
|
| @@ -53,11 +52,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void);
|
|
|
| #endif
|
|
|
| -#ifndef EGL_OPENGL_ES3_BIT
|
| -// Part of EGL 1.5, typical headers are 1.4.
|
| -#define EGL_OPENGL_ES3_BIT 0x0040
|
| -#endif
|
| -
|
| typedef EGLDisplay (*GetDisplayProc)(EGLNativeDisplayType display_id);
|
| typedef EGLBoolean (*InitializeProc)(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
| typedef EGLBoolean (*TerminateProc)(EGLDisplay dpy);
|
| @@ -143,15 +137,14 @@ const GrGLInterface* GrGLCreateCommandBufferInterface() {
|
| return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc);
|
| }
|
|
|
| -SkCommandBufferGLContext::SkCommandBufferGLContext(ContextVersion minContextVersion)
|
| +SkCommandBufferGLContext::SkCommandBufferGLContext()
|
| : fContext(EGL_NO_CONTEXT)
|
| , fDisplay(EGL_NO_DISPLAY)
|
| , fSurface(EGL_NO_SURFACE) {
|
|
|
| static const EGLint configAttribs[] = {
|
| EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
|
| - EGL_RENDERABLE_TYPE, minContextVersion == kGLES3_ContextVersion ? EGL_OPENGL_ES3_BIT
|
| - : EGL_OPENGL_ES2_BIT,
|
| + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
| EGL_RED_SIZE, 8,
|
| EGL_GREEN_SIZE, 8,
|
| EGL_BLUE_SIZE, 8,
|
| @@ -165,15 +158,13 @@ SkCommandBufferGLContext::SkCommandBufferGLContext(ContextVersion minContextVers
|
| EGL_NONE
|
| };
|
|
|
| - initializeGLContext(minContextVersion, nullptr, configAttribs, surfaceAttribs);
|
| + initializeGLContext(nullptr, configAttribs, surfaceAttribs);
|
| }
|
|
|
| SkCommandBufferGLContext::SkCommandBufferGLContext(void* nativeWindow, int msaaSampleCount) {
|
| static const EGLint surfaceAttribs[] = { EGL_NONE };
|
|
|
| EGLint configAttribs[] = {
|
| - EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
| - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
| EGL_RED_SIZE, 8,
|
| EGL_GREEN_SIZE, 8,
|
| EGL_BLUE_SIZE, 8,
|
| @@ -188,11 +179,10 @@ SkCommandBufferGLContext::SkCommandBufferGLContext(void* nativeWindow, int msaaS
|
| configAttribs[12] = EGL_NONE;
|
| }
|
|
|
| - initializeGLContext(kGLES2_ContextVersion, nativeWindow, configAttribs, surfaceAttribs);
|
| + initializeGLContext(nativeWindow, configAttribs, surfaceAttribs);
|
| }
|
|
|
| -void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVersion,
|
| - void* nativeWindow, const int* configAttribs,
|
| +void SkCommandBufferGLContext::initializeGLContext(void* nativeWindow, const int* configAttribs,
|
| const int* surfaceAttribs) {
|
| LoadCommandBufferOnce();
|
| if (!gfFunctionsLoadedSuccessfully) {
|
| @@ -201,14 +191,16 @@ void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVers
|
| }
|
|
|
| // Make sure CHROMIUM_path_rendering is enabled for NVPR support.
|
| - sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering --enable-unsafe-es3-apis");
|
| + sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering");
|
| fDisplay = gfGetDisplay(EGL_DEFAULT_DISPLAY);
|
| if (EGL_NO_DISPLAY == fDisplay) {
|
| SkDebugf("Command Buffer: Could not create EGL display.\n");
|
| return;
|
| }
|
|
|
| - if (!gfInitialize(fDisplay, nullptr, nullptr)) {
|
| + EGLint majorVersion;
|
| + EGLint minorVersion;
|
| + if (!gfInitialize(fDisplay, &majorVersion, &minorVersion)) {
|
| SkDebugf("Command Buffer: Could not initialize EGL display.\n");
|
| this->destroyGLContext();
|
| return;
|
| @@ -216,7 +208,7 @@ void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVers
|
|
|
| EGLint numConfigs;
|
| if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig*>(&fConfig), 1,
|
| - &numConfigs) || numConfigs < 1) {
|
| + &numConfigs) || numConfigs != 1) {
|
| SkDebugf("Command Buffer: Could not choose EGL config.\n");
|
| this->destroyGLContext();
|
| return;
|
| @@ -239,7 +231,7 @@ void SkCommandBufferGLContext::initializeGLContext(ContextVersion minContextVers
|
| }
|
|
|
| static const EGLint contextAttribs[] = {
|
| - EGL_CONTEXT_CLIENT_VERSION, minContextVersion == kGLES3_ContextVersion ? 3 : 2,
|
| + EGL_CONTEXT_CLIENT_VERSION, 2,
|
| EGL_NONE
|
| };
|
| fContext = gfCreateContext(fDisplay, static_cast<EGLConfig>(fConfig), nullptr, contextAttribs);
|
| @@ -279,28 +271,22 @@ void SkCommandBufferGLContext::destroyGLContext() {
|
| if (!gfFunctionsLoadedSuccessfully) {
|
| return;
|
| }
|
| - if (EGL_NO_DISPLAY == fDisplay) {
|
| - return;
|
| - }
|
| + if (fDisplay) {
|
| + gfMakeCurrent(fDisplay, 0, 0, 0);
|
|
|
| - if (EGL_NO_CONTEXT != fContext) {
|
| - gfDestroyContext(fDisplay, fContext);
|
| - fContext = EGL_NO_CONTEXT;
|
| - }
|
| - // Call MakeCurrent after destroying the context, so that the EGL implementation knows
|
| - // that the context is not used anymore after it is released from being current.
|
| - // This way command buffer does not need to abandon the context before destruction, and no
|
| - // client-side errors are printed.
|
| - gfMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
| -
|
| - if (EGL_NO_SURFACE != fSurface) {
|
| - gfDestroySurface(fDisplay, fSurface);
|
| - fSurface = EGL_NO_SURFACE;
|
| + if (fContext) {
|
| + gfDestroyContext(fDisplay, fContext);
|
| + fContext = EGL_NO_CONTEXT;
|
| + }
|
| +
|
| + if (fSurface) {
|
| + gfDestroySurface(fDisplay, fSurface);
|
| + fSurface = EGL_NO_SURFACE;
|
| + }
|
| +
|
| + gfTerminate(fDisplay);
|
| + fDisplay = EGL_NO_DISPLAY;
|
| }
|
| - // The display is likely to be used again for another test, do not call gfTerminate. Also,
|
| - // terminating could imply terminating the "host" EGL inside command buffer. This would
|
| - // terminate also EGL that this thread might use outside of command buffer.
|
| - fDisplay = EGL_NO_DISPLAY;
|
| }
|
|
|
| void SkCommandBufferGLContext::onPlatformMakeCurrent() const {
|
|
|