Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f857b78 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change I32d41651 into eclair

* changes:
  Allow a GLThread to release and reacquire the EGL Surface as needed.
parents 96fce6e1 32d41651
Loading
Loading
Loading
Loading
+46 −32
Original line number Diff line number Diff line
@@ -971,17 +971,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
             * accesses EGL.
             */
            try {
                try {
                    sGLThreadManager.start(this);
                } catch (InterruptedException e) {
                    return;
                }
                guardedRun();
            } catch (InterruptedException e) {
                // fall thru and exit normally
            } finally {
                try {
                    sGLThreadManager.end(this);
            } finally {
                synchronized(this) {
                    if (LOG_THREADS) {
@@ -992,12 +984,28 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
                }
            }
        }

        private void startEgl() throws InterruptedException {
            if (! mHaveEgl) {
                mHaveEgl = true;
                sGLThreadManager.start(this);
                mEglHelper.start();
            }
        }

        private void stopEgl() {
            if (mHaveEgl) {
                mHaveEgl = false;
                mEglHelper.destroySurface();
                mEglHelper.finish();
                sGLThreadManager.end(this);
            }
        }

        private void guardedRun() throws InterruptedException {
            mEglHelper = new EglHelper();
            try {
                mEglHelper.start();
                startEgl();

                GL10 gl = null;
                boolean tellRendererSurfaceCreated = true;
@@ -1021,20 +1029,30 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
                            r.run();
                        }
                        if (mPaused) {
                            mEglHelper.destroySurface();
                            mEglHelper.finish();
                            stopEgl();
                            needStart = true;
                        }
                        while (needToWait()) {
                            if (LOG_THREADS) {
                                Log.i("GLThread", "needToWait tid=" + getId());
                            }
                        while(true) {
                            if (!mHasSurface) {
                                if (!mWaitingForSurface) {
                                    mEglHelper.destroySurface();
                                    stopEgl();
                                    mWaitingForSurface = true;
                                    notifyAll();
                                }
                            } else {
                                boolean shouldHaveEgl = sGLThreadManager.shouldHaveEgl(this);
                                if (mHaveEgl && (!shouldHaveEgl)) {
                                    stopEgl();
                                } else if ((!mHaveEgl) && shouldHaveEgl) {
                                    startEgl();
                                    needStart = true;
                                }
                            }
                            if (!needToWait()) {
                                break;
                            }
                            if (LOG_THREADS) {
                                Log.i("GLThread", "needToWait tid=" + getId());
                            }
                            wait();
                        }
@@ -1053,7 +1071,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
                        }
                    }
                    if (needStart) {
                        mEglHelper.start();
                        startEgl();
                        tellRendererSurfaceCreated = true;
                        changed = true;
                    }
@@ -1084,21 +1102,16 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
                /*
                 * clean-up everything...
                 */
                mEglHelper.destroySurface();
                mEglHelper.finish();
                stopEgl();
            }
        }

        private boolean needToWait() {
            if (sGLThreadManager.shouldQuit(this)) {
                mDone = true;
                notifyAll();
            }
            if (mDone) {
                return false;
            }

            if (mPaused || (! mHasSurface)) {
            if (mPaused || (! mHasSurface) || (! mHaveEgl)) {
                return true;
            }

@@ -1223,6 +1236,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
        private boolean mPaused;
        private boolean mHasSurface;
        private boolean mWaitingForSurface;
        private boolean mHaveEgl;
        private int mWidth;
        private int mHeight;
        private int mRenderMode;
@@ -1273,9 +1287,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
    }

    static class GLThreadManager {
        public boolean shouldQuit(GLThread thread) {
        public boolean shouldHaveEgl(GLThread thread) {
            synchronized(this) {
                return thread != mMostRecentGLThread;
                return thread == mMostRecentGLThread || mMostRecentGLThread == null;
            }
        }
        public void start(GLThread thread) throws InterruptedException {