diff options
Diffstat (limited to 'tools/gpu/gl/angle/GLTestContext_angle.cpp')
-rw-r--r-- | tools/gpu/gl/angle/GLTestContext_angle.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/tools/gpu/gl/angle/GLTestContext_angle.cpp b/tools/gpu/gl/angle/GLTestContext_angle.cpp index 52cc5128da..3b55c40bac 100644 --- a/tools/gpu/gl/angle/GLTestContext_angle.cpp +++ b/tools/gpu/gl/angle/GLTestContext_angle.cpp @@ -34,6 +34,16 @@ struct Libs { void* fEGLLib; }; +std::function<void()> context_restorer() { + auto display = eglGetCurrentDisplay(); + auto dsurface = eglGetCurrentSurface(EGL_DRAW); + auto rsurface = eglGetCurrentSurface(EGL_READ); + auto context = eglGetCurrentContext(); + return [display, dsurface, rsurface, context] { + eglMakeCurrent(display, dsurface, rsurface, context); + }; +} + static GrGLFuncPtr angle_get_gl_proc(void* ctx, const char name[]) { const Libs* libs = reinterpret_cast<const Libs*>(ctx); GrGLFuncPtr proc = (GrGLFuncPtr) GetProcedureAddress(libs->fGLLib, name); @@ -87,6 +97,7 @@ private: void destroyGLContext(); void onPlatformMakeCurrent() const override; + std::function<void()> onPlatformGetAutoContextRestore() const override; void onPlatformSwapBuffers() const override; GrGLFuncPtr onPlatformGetProcAddress(const char* name) const override; @@ -214,6 +225,7 @@ ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version, fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); + SkScopeExit restorer(context_restorer()); if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("Could not set the context."); this->destroyGLContext(); @@ -320,7 +332,10 @@ std::unique_ptr<sk_gpu_test::GLTestContext> ANGLEGLContext::makeNew() const { void ANGLEGLContext::destroyGLContext() { if (EGL_NO_DISPLAY != fDisplay) { - eglMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (eglGetCurrentContext() == fContext) { + // This will ensure that the context is immediately deleted. + eglMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } if (EGL_NO_CONTEXT != fContext) { eglDestroyContext(fDisplay, fContext); @@ -355,6 +370,13 @@ void ANGLEGLContext::onPlatformMakeCurrent() const { } } +std::function<void()> ANGLEGLContext::onPlatformGetAutoContextRestore() const { + if (eglGetCurrentContext() == fContext) { + return nullptr; + } + return context_restorer(); +} + void ANGLEGLContext::onPlatformSwapBuffers() const { if (!eglSwapBuffers(fDisplay, fSurface)) { SkDebugf("Could not complete eglSwapBuffers.\n"); |