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

Commit 57066eb6 authored by Romain Guy's avatar Romain Guy
Browse files

Cleanup GL objects on the correct thread.

Change-Id: Iddfea6e08a6591a4fab147151098ef27005f373d
parent 9454fe10
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -160,6 +160,7 @@ class GLES20Canvas extends HardwareCanvas {
    static native void nResizeLayer(int layerId, int layerTextureId, int width, int height,
            int[] layerInfo);
    static native void nDestroyLayer(int layerId, int layerTextureId);    
    static native void nDestroyLayerDeferred(int layerId, int layerTextureId);    

    ///////////////////////////////////////////////////////////////////////////
    // Canvas management
+1 −1
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ class GLES20Layer extends HardwareLayer {
        protected void finalize() throws Throwable {
            try {
                if (mLayerId != 0 || mLayerTextureId != 0) {
                    GLES20Canvas.nDestroyLayer(mLayerId, mLayerTextureId);
                    GLES20Canvas.nDestroyLayerDeferred(mLayerId, mLayerTextureId);
                }
            } finally {
                super.finalize();
+8 −2
Original line number Diff line number Diff line
@@ -501,6 +501,11 @@ static void android_view_GLES20Canvas_destroyLayer(JNIEnv* env,
    LayerRenderer::destroyLayer(layerId, layerTextureId);
}

static void android_view_GLES20Canvas_destroyLayerDeferred(JNIEnv* env,
        jobject clazz, jint layerId, jint layerTextureId) {
    LayerRenderer::destroyLayerDeferred(layerId, layerTextureId);
}

static void android_view_GLES20Canvas_drawLayer(JNIEnv* env,
        jobject canvas, OpenGLRenderer* renderer,
        jfloat left, jfloat top, jfloat right, jfloat bottom,
@@ -600,6 +605,7 @@ static JNINativeMethod gMethods[] = {
    { "nCreateLayer",            "(II[I)I",    (void*) android_view_GLES20Canvas_createLayer },
    { "nResizeLayer",            "(IIII[I)V",  (void*) android_view_GLES20Canvas_resizeLayer },
    { "nDestroyLayer",           "(II)V",      (void*) android_view_GLES20Canvas_destroyLayer },
    { "nDestroyLayerDeferred",   "(II)V",      (void*) android_view_GLES20Canvas_destroyLayerDeferred },
    { "nDrawLayer",              "(IFFFFIFFI)V",
            (void*) android_view_GLES20Canvas_drawLayer },

+26 −0
Original line number Diff line number Diff line
@@ -106,6 +106,32 @@ void Caches::clearGarbage() {
    textureCache.clearGarbage();
    gradientCache.clearGarbage();
    pathCache.clearGarbage();

    Mutex::Autolock _l(mGarbageLock);

    size_t count = mFboGarbage.size();
    for (size_t i = 0; i < count; i++) {
        GLuint fbo = mFboGarbage.itemAt(i);
        if (fbo) glDeleteFramebuffers(1, &fbo);
    }
    mFboGarbage.clear();

    count = mTextureGarbage.size();
    for (size_t i = 0; i < count; i++) {
        GLuint texture = mTextureGarbage.itemAt(i);
        if (texture) glDeleteTextures(1, &texture);
    }
    mTextureGarbage.clear();
}

void Caches::deleteFboDeferred(GLuint fbo) {
    Mutex::Autolock _l(mGarbageLock);
    mFboGarbage.push(fbo);
}

void Caches::deleteTextureDeferred(GLuint texture) {
    Mutex::Autolock _l(mGarbageLock);
    mTextureGarbage.push(texture);
}

///////////////////////////////////////////////////////////////////////////////
+14 −0
Original line number Diff line number Diff line
@@ -90,6 +90,10 @@ class Caches: public Singleton<Caches> {
    TextureVertex* mRegionMesh;
    GLuint mRegionMeshIndices;

    mutable Mutex mGarbageLock;
    Vector<GLuint> mFboGarbage;
    Vector<GLuint> mTextureGarbage;

public:
    /**
     * Indicates whether the renderer is in debug mode.
@@ -105,6 +109,16 @@ public:
     */
    void clearGarbage();

    /**
     * Can be used to delete an FBO from a non EGL thread.
     */
    void deleteFboDeferred(GLuint fbo);

    /**
     * Can be used to delete a texture from a non EGL thread.
     */
    void deleteTextureDeferred(GLuint texture);

    /**
     * Binds the VBO used to render simple textured quads.
     */
Loading