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

Commit b8c0de2c authored by Romain Guy's avatar Romain Guy
Browse files

Improve error detection in HardwareRenderer.draw().

Bug #3280872

This should avoid crashes before we detect a GL error and we switch over to
software rendering.

Change-Id: Ieb4992576d20014e194aab863a456f09c5e19672
parent 14b0a6bc
Loading
Loading
Loading
Loading
+38 −28
Original line number Diff line number Diff line
@@ -478,8 +478,7 @@ public abstract class HardwareRenderer {
                    startTime = SystemClock.elapsedRealtime();
                }

                checkCurrent();

                if (checkCurrent()) {
                    onPreDraw();
    
                    Canvas canvas = mCanvas;
@@ -505,8 +504,9 @@ public abstract class HardwareRenderer {
                    checkEglErrors();
                }
            }
        }

        private void checkCurrent() {
        private boolean checkCurrent() {
            // TODO: Don't check the current context when we have one per UI thread
            // TODO: Use a threadlocal flag to know whether the surface has changed
            if (sEgl.eglGetCurrentContext() != sEglContext ||
@@ -515,8 +515,10 @@ public abstract class HardwareRenderer {
                    fallback(true);
                    Log.e(LOG_TAG, "eglMakeCurrent failed " +
                            getEGLErrorString(sEgl.eglGetError()));
                    return false;
                }
            }
            return true;
        }

        static abstract class EglConfigChooser {
@@ -650,6 +652,11 @@ public abstract class HardwareRenderer {
            return mGlCanvas = new GLES20Canvas(mTranslucent);
        }
        
        @Override
        boolean canDraw() {
            return super.canDraw() && mGlCanvas != null;
        }                

        @Override
        void onPreDraw() {
            mGlCanvas.onPreDraw();
@@ -662,11 +669,14 @@ public abstract class HardwareRenderer {

        @Override
        void destroy(boolean full) {
            try {
                super.destroy(full);
            } finally {
                if (full && mGlCanvas != null) {
                    mGlCanvas = null;
                }
            }
        }

        @Override
        DisplayList createDisplayList() {