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

Commit 67f27952 authored by Romain Guy's avatar Romain Guy
Browse files

Correctly release the OpenGL Canvas on EGL error.

Change-Id: Ib31fd8445f7ce5f7aa7e0205de0e7db80d024fc2
parent dbf78bdb
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ public abstract class HardwareRenderer {
    private boolean mRequested = true;

    /**
     * Indicates that the current process cannot use hardware rendering.
     * Invoke this method to disable hardware rendering in the current process.
     * 
     * @hide
     */
@@ -207,7 +207,7 @@ public abstract class HardwareRenderer {
        EGLSurface mEglSurface;
        
        GL mGl;
        GLES20Canvas mCanvas;
        HardwareCanvas mCanvas;

        final int mGlVersion;
        final boolean mTranslucent;
@@ -279,6 +279,9 @@ public abstract class HardwareRenderer {
                    if (error != EGL11.EGL_CONTEXT_LOST) {
                        // we'll try again if it was context lost
                        setRequested(false);
                    } else {
                        Log.w(LOG_TAG, "Mountain View, we've had a problem here. " 
                                + "Switching back to software rendering.");
                    }
                    Log.w(LOG_TAG, "EGL error: " + getEGLErrorString(error));
                }
@@ -653,6 +656,14 @@ public abstract class HardwareRenderer {
            mGlCanvas.onPostDraw();
        }

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

        @Override
        DisplayList createDisplayList() {
            return new GLES20DisplayList();
+39 −24
Original line number Diff line number Diff line
@@ -26,8 +26,13 @@ namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////

Program::Program(const char* vertex, const char* fragment) {
    mInitialized = false;

    vertexShader = buildShader(vertex, GL_VERTEX_SHADER);
    if (vertexShader) {

        fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER);
        if (fragmentShader) {

            id = glCreateProgram();
            glAttachShader(id, vertexShader);
@@ -37,29 +42,38 @@ Program::Program(const char* vertex, const char* fragment) {
            GLint status;
            glGetProgramiv(id, GL_LINK_STATUS, &status);
            if (status != GL_TRUE) {
                LOGE("Error while linking shaders:");
                GLint infoLen = 0;
                glGetProgramiv(id, GL_INFO_LOG_LENGTH, &infoLen);
                if (infoLen > 1) {
                    GLchar log[infoLen];
                    glGetProgramInfoLog(id, infoLen, 0, &log[0]);
            LOGE("Error while linking shaders: %s", log);
                    LOGE("%s", log);
                }
                glDeleteShader(vertexShader);
                glDeleteShader(fragmentShader);
                glDeleteProgram(id);
            } else {
                mInitialized = true;
            }
        }
    }

    mUse = false;

    if (mInitialized) {
        position = addAttrib("position");
        transform = addUniform("transform");
    }
}

Program::~Program() {
    if (mInitialized) {
        glDeleteShader(vertexShader);
        glDeleteShader(fragmentShader);
        glDeleteProgram(id);
    }
}

int Program::addAttrib(const char* name) {
    int slot = glGetAttribLocation(id, name);
@@ -103,6 +117,7 @@ GLuint Program::buildShader(const char* source, GLenum type) {
        glGetShaderInfoLog(shader, sizeof(log), 0, &log[0]);
        LOGE("Error while compiling shader: %s", log);
        glDeleteShader(shader);
        return 0;
    }

    return shader;
+8 −0
Original line number Diff line number Diff line
@@ -69,6 +69,13 @@ public:
        return mUse;
    }

    /**
     * Indicates whether this program was correctly compiled and linked.
     */
    inline bool isInitialized() const {
        return mInitialized;
    }

    /**
     * Binds the program with the specified projection, modelView and
     * transform matrices.
@@ -126,6 +133,7 @@ private:
    KeyedVector<const char*, int> uniforms;

    bool mUse;
    bool mInitialized;
}; // class Program

}; // namespace uirenderer
+2 −0
Original line number Diff line number Diff line
@@ -298,6 +298,8 @@ ProgramCache::~ProgramCache() {
///////////////////////////////////////////////////////////////////////////////

void ProgramCache::clear() {
    PROGRAM_LOGD("Clearing program cache");

    size_t count = mCache.size();
    for (size_t i = 0; i < count; i++) {
        delete mCache.valueAt(i);