EGL: Ensure surfaces are disconnected when destroyed
When eglDestroySurface is called, remove all references to the surface
in all contexts. This ensures that the surface is disconnected
immediately.
Bug 27455025
Change-Id: I0edaf039d320dc40122657db32abdc418665841a
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index 6a9d7b6..d849693 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -89,6 +89,31 @@
return false;
}
+void egl_display_t::addContext(egl_context_t* context) {
+ Mutex::Autolock _l(lock);
+ contexts.add(context);
+}
+
+void egl_display_t::removeContext(egl_context_t* context) {
+ Mutex::Autolock _l(lock);
+ contexts.remove(context);
+}
+
+void egl_display_t::removeSurface(EGLSurface surface) const {
+ Mutex::Autolock _l(lock);
+ for (size_t i = 0; i < contexts.size(); i++) {
+ egl_context_t* context = contexts[i];
+ if (context->read == surface) {
+ SurfaceRef _r(get_surface(context->read));
+ _r.release();
+ }
+ if (context->draw == surface) {
+ SurfaceRef _d(get_surface(context->draw));
+ _d.release();
+ }
+ }
+}
+
EGLDisplay egl_display_t::getFromNativeDisplay(EGLNativeDisplayType disp) {
if (uintptr_t(disp) >= NUM_DISPLAYS)
return NULL;