Index: tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp |
diff --git a/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp b/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp |
index 850adaaf257ace350b3962103bc05b5de5ead0cd..05a2a2b1f72af4c257dc23680cf1c15baa0b9b61 100644 |
--- a/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp |
+++ b/tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp |
@@ -140,41 +140,6 @@ static const GrGLInterface* create_command_buffer_interface() { |
return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc); |
} |
-// We use a poor man's garbage collector of EGLDisplays. They are only |
-// terminated when there are no more EGLDisplays in use. See crbug.com/603223 |
-SK_DECLARE_STATIC_MUTEX(gDisplayMutex); |
-static int gActiveDisplayCnt; |
-SkTArray<EGLDisplay> gRetiredDisplays; |
- |
-static EGLDisplay get_and_init_display() { |
- SkAutoMutexAcquire am(gDisplayMutex); |
- EGLDisplay dsp = gfGetDisplay(EGL_DEFAULT_DISPLAY); |
- if (dsp == EGL_NO_DISPLAY) { |
- return EGL_NO_DISPLAY; |
- } |
- EGLint major, minor; |
- if (!gfInitialize(dsp, &major, &minor)) { |
- gRetiredDisplays.push_back(dsp); |
- return EGL_NO_DISPLAY; |
- } |
- ++gActiveDisplayCnt; |
- return dsp; |
-} |
- |
-static void retire_display(EGLDisplay dsp) { |
- if (dsp == EGL_NO_DISPLAY) { |
- return; |
- } |
- SkAutoMutexAcquire am(gDisplayMutex); |
- gRetiredDisplays.push_back(dsp); |
- --gActiveDisplayCnt; |
- if (!gActiveDisplayCnt) { |
- for (EGLDisplay d : gRetiredDisplays) { |
- gfTerminate(d); |
- } |
- gRetiredDisplays.reset(); |
- } |
-} |
} // anonymous namespace |
namespace sk_gpu_test { |
@@ -232,12 +197,16 @@ void CommandBufferGLTestContext::initializeGLContext(void *nativeWindow, const i |
// Make sure CHROMIUM_path_rendering is enabled for NVPR support. |
sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering"); |
- fDisplay = get_and_init_display(); |
+ 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)) { |
+ SkDebugf("Command Buffer: Could not initialize EGL display.\n"); |
+ this->destroyGLContext(); |
+ return; |
+ } |
EGLint numConfigs; |
if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig *>(&fConfig), 1, |
&numConfigs) || numConfigs != 1) { |
@@ -303,22 +272,24 @@ void CommandBufferGLTestContext::destroyGLContext() { |
if (!gfFunctionsLoadedSuccessfully) { |
return; |
} |
- if (fDisplay) { |
- gfMakeCurrent(fDisplay, 0, 0, 0); |
- |
- if (fContext) { |
- gfDestroyContext(fDisplay, fContext); |
- fContext = EGL_NO_CONTEXT; |
- } |
- |
- if (fSurface) { |
- gfDestroySurface(fDisplay, fSurface); |
- fSurface = EGL_NO_SURFACE; |
- } |
- |
- retire_display(fDisplay); |
- fDisplay = EGL_NO_DISPLAY; |
+ if (EGL_NO_DISPLAY == fDisplay) { |
+ return; |
+ } |
+ 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; |
} |
+ fDisplay = EGL_NO_DISPLAY; |
} |
void CommandBufferGLTestContext::onPlatformMakeCurrent() const { |