OSDN Git Service

EGL: Disconnect native window in eglDestroySurface
authorPablo Ceballos <pceballos@google.com>
Mon, 2 May 2016 18:24:13 +0000 (11:24 -0700)
committerPablo Ceballos <pceballos@google.com>
Tue, 3 May 2016 17:06:03 +0000 (10:06 -0700)
Bug 27455025

Change-Id: I7549a3acb724e749925a8249feb180088aec7f3c

opengl/libs/EGL/egl_object.cpp
opengl/libs/EGL/egl_object.h

index 918faa8..90f27d1 100644 (file)
@@ -67,7 +67,8 @@ bool egl_object_t::get(egl_display_t const* display, egl_object_t* object) {
 egl_surface_t::egl_surface_t(egl_display_t* dpy, EGLConfig config,
         EGLNativeWindowType win, EGLSurface surface,
         egl_connection_t const* cnx) :
-    egl_object_t(dpy), surface(surface), config(config), win(win), cnx(cnx)
+    egl_object_t(dpy), surface(surface), config(config), win(win), cnx(cnx),
+    connected(true)
 {
     if (win) {
         getDisplay()->onWindowSurfaceCreated();
@@ -77,14 +78,27 @@ egl_surface_t::egl_surface_t(egl_display_t* dpy, EGLConfig config,
 egl_surface_t::~egl_surface_t() {
     ANativeWindow* const window = win.get();
     if (window != NULL) {
+        disconnect();
+        getDisplay()->onWindowSurfaceDestroyed();
+    }
+}
+
+void egl_surface_t::disconnect() {
+    ANativeWindow* const window = win.get();
+    if (window != NULL && connected) {
         native_window_set_buffers_format(window, 0);
         if (native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL)) {
             ALOGW("EGLNativeWindowType %p disconnect failed", window);
         }
-        getDisplay()->onWindowSurfaceDestroyed();
+        connected = false;
     }
 }
 
+void egl_surface_t::terminate() {
+    disconnect();
+    egl_object_t::terminate();
+}
+
 // ----------------------------------------------------------------------------
 
 egl_context_t::egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
index 17a8304..673b7da 100644 (file)
@@ -45,6 +45,7 @@ class egl_object_t {
 
 protected:
     virtual ~egl_object_t();
+    virtual void terminate();
 
 public:
     egl_object_t(egl_display_t* display);
@@ -55,7 +56,6 @@ public:
     inline egl_display_t* getDisplay() const { return display; }
 
 private:
-    void terminate();
     static bool get(egl_display_t const* display, egl_object_t* object);
 
 public:
@@ -127,6 +127,7 @@ void egl_object_t::LocalRef<N,T>::terminate() {
 class egl_surface_t : public egl_object_t {
 protected:
     ~egl_surface_t();
+    void terminate() override;
 public:
     typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
 
@@ -138,6 +139,9 @@ public:
     EGLConfig config;
     sp<ANativeWindow> win;
     egl_connection_t const* cnx;
+private:
+    bool connected;
+    void disconnect();
 };
 
 class egl_context_t: public egl_object_t {