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

Commit 359ef798 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Fix crash with OpenGL wallpaper Bug #5216751"

parents bf446c2a f929629e
Loading
Loading
Loading
Loading
+13 −6
Original line number Original line Diff line number Diff line
@@ -300,7 +300,9 @@ public class ImageWallpaper extends WallpaperService {
            }
            }


            if (mIsHwAccelerated) {
            if (mIsHwAccelerated) {
                drawWallpaperWithOpenGL(sh, availw, availh, xPixels, yPixels);
                if (!drawWallpaperWithOpenGL(sh, availw, availh, xPixels, yPixels)) {
                    drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
                }
            } else {
            } else {
                drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
                drawWallpaperWithCanvas(sh, availw, availh, xPixels, yPixels);
            }
            }
@@ -367,8 +369,8 @@ public class ImageWallpaper extends WallpaperService {
            }
            }
        }
        }


        private void drawWallpaperWithOpenGL(SurfaceHolder sh, int w, int h, int left, int top) {
        private boolean drawWallpaperWithOpenGL(SurfaceHolder sh, int w, int h, int left, int top) {
            initGL(sh);
            if (!initGL(sh)) return false;


            final float right = left + mBackgroundWidth;
            final float right = left + mBackgroundWidth;
            final float bottom = top + mBackgroundHeight;
            final float bottom = top + mBackgroundHeight;
@@ -423,6 +425,8 @@ public class ImageWallpaper extends WallpaperService {
            checkEglError();
            checkEglError();
    
    
            finishGL();
            finishGL();

            return true;
        }
        }


        private FloatBuffer createMesh(int left, int top, float right, float bottom) {
        private FloatBuffer createMesh(int left, int top, float right, float bottom) {
@@ -533,11 +537,12 @@ public class ImageWallpaper extends WallpaperService {
        }
        }
    
    
        private void finishGL() {
        private void finishGL() {
            mEgl.eglDestroyContext(mEglDisplay, mEglContext);
            mEgl.eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
            mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
            mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
            mEgl.eglDestroyContext(mEglDisplay, mEglContext);
        }
        }
        
        
        private void initGL(SurfaceHolder surfaceHolder) {
        private boolean initGL(SurfaceHolder surfaceHolder) {
            mEgl = (EGL10) EGLContext.getEGL();
            mEgl = (EGL10) EGLContext.getEGL();
    
    
            mEglDisplay = mEgl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
            mEglDisplay = mEgl.eglGetDisplay(EGL_DEFAULT_DISPLAY);
@@ -565,7 +570,7 @@ public class ImageWallpaper extends WallpaperService {
                int error = mEgl.eglGetError();
                int error = mEgl.eglGetError();
                if (error == EGL_BAD_NATIVE_WINDOW) {
                if (error == EGL_BAD_NATIVE_WINDOW) {
                    Log.e(GL_LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
                    Log.e(GL_LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
                    return;
                    return false;
                }
                }
                throw new RuntimeException("createWindowSurface failed " +
                throw new RuntimeException("createWindowSurface failed " +
                        GLUtils.getEGLErrorString(error));
                        GLUtils.getEGLErrorString(error));
@@ -577,6 +582,8 @@ public class ImageWallpaper extends WallpaperService {
            }
            }
    
    
            mGL = mEglContext.getGL();
            mGL = mEglContext.getGL();

            return true;
        }
        }