diff options
| author | Tinja Paavoseppä <tinja.paavoseppa@qt.io> | 2024-04-09 16:31:24 +0300 |
|---|---|---|
| committer | Petri Virkkunen <petri.virkkunen@qt.io> | 2024-10-02 09:12:45 +0300 |
| commit | 9343d1ab6e1a5df3166d211809f2eb0e5a3cd878 (patch) | |
| tree | 30fc0863f2ef0957cb1e9260185264b6dbd0e7e0 /src/plugins/platforms/android/qandroidplatformopenglwindow.cpp | |
| parent | e5513a9447771dc722ca27e553fd3e966ee7d44a (diff) | |
Android: clean up Surface resources when it is destroyed
Clean up any resources using the Android Surface when it
has been destroyed. Previously the resource clean up was done
only after Qt app state changed to Hidden or below and we initiate
the removal of the Surface. However, in the case of QtSurface
which is a SurfaceView, it will destroy its Surface before
we ever get to that part, leading to the resources holding
a reference to a destroyed Surface.
Task-number: QTBUG-118231
Pick-to: 6.8
Change-Id: I282ddcc2813bf0a4e19cbb906376258dd2b4004f
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformopenglwindow.cpp')
| -rw-r--r-- | src/plugins/platforms/android/qandroidplatformopenglwindow.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp index 77b486cce88..05a9ea1b342 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp @@ -33,7 +33,7 @@ QAndroidPlatformOpenGLWindow::~QAndroidPlatformOpenGLWindow() m_surfaceWaitCondition.wakeOne(); lockSurface(); destroySurface(); - clearEgl(); + clearSurface(); unlockSurface(); } @@ -58,13 +58,15 @@ EGLSurface QAndroidPlatformOpenGLWindow::eglSurface(EGLConfig config) QGuiApplication::applicationState() == Qt::ApplicationSuspended) { return m_eglSurface; } - + // If we haven't called createSurface() yet, call it and wait until Android has created + // the Surface if (!m_surfaceCreated) { AndroidDeadlockProtector protector; if (!protector.acquire()) return m_eglSurface; createSurface(); + qCDebug(lcQpaWindow) << "called createSurface(), waiting for Surface to be ready..."; m_surfaceWaitCondition.wait(&m_surfaceMutex); } @@ -79,7 +81,7 @@ EGLSurface QAndroidPlatformOpenGLWindow::eglSurface(EGLConfig config) bool QAndroidPlatformOpenGLWindow::checkNativeSurface(EGLConfig config) { // Either no surface created, or the m_eglSurface already wraps the active Surface - // -> makeCurrent is NOT needed. + // -> makeCurrent is NOT needed, and we should not create a new EGL surface if (!m_surfaceCreated || !m_androidSurfaceObject.isValid()) return false; @@ -96,14 +98,14 @@ void QAndroidPlatformOpenGLWindow::applicationStateChanged(Qt::ApplicationState if (state <= Qt::ApplicationHidden) { lockSurface(); destroySurface(); - clearEgl(); + clearSurface(); unlockSurface(); } } void QAndroidPlatformOpenGLWindow::createEgl(EGLConfig config) { - clearEgl(); + clearSurface(); QJniEnvironment env; m_nativeWindow = ANativeWindow_fromSurface(env.jniEnv(), m_androidSurfaceObject.object()); m_androidSurfaceObject = QJniObject(); @@ -124,7 +126,7 @@ QSurfaceFormat QAndroidPlatformOpenGLWindow::format() const return m_format; } -void QAndroidPlatformOpenGLWindow::clearEgl() +void QAndroidPlatformOpenGLWindow::clearSurface() { if (m_eglSurface != EGL_NO_SURFACE) { eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); @@ -134,7 +136,7 @@ void QAndroidPlatformOpenGLWindow::clearEgl() if (m_nativeWindow) { ANativeWindow_release(m_nativeWindow); - m_nativeWindow = 0; + m_nativeWindow = nullptr; } } |
