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

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

Merge "Correctly release the OpenGL Canvas on EGL error."

parents d00e1162 67f27952
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);