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

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

Don't destroy the same texture twice

Bug #7221449

SurfaceTexture already deletes the GL texture when detachFromContext
is invoked. The newly introduced refcount would casue the Layer
object to be destroyed later and attempt to delete the GL texture
again. By the time the second cleanup occurs, the texture name
might have been reused by somebody else, resulting in erroneous
behaviors.

Change-Id: I257c589fea64b34c00f46fbfaa7732e6854a5e41
parent 509e2ced
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ class GLES20Canvas extends HardwareCanvas {
    static native void nSetLayerColorFilter(int layerId, int nativeColorFilter);
    static native void nUpdateTextureLayer(int layerId, int width, int height, boolean opaque,
            SurfaceTexture surface);
    static native void nClearLayerTexture(int layerId);
    static native void nSetTextureLayerTransform(int layerId, int matrix);
    static native void nDestroyLayer(int layerId);
    static native void nDestroyLayerDeferred(int layerId);
+5 −0
Original line number Diff line number Diff line
@@ -66,6 +66,11 @@ abstract class GLES20Layer extends HardwareLayer {
        mLayer = 0;
    }

    @Override
    void clearStorage() {
        if (mLayer != 0) GLES20Canvas.nClearLayerTexture(mLayer);
    }

    static class Finalizer {
        private int mLayerId;

+5 −0
Original line number Diff line number Diff line
@@ -204,4 +204,9 @@ abstract class HardwareLayer {
     * @param dirtyRect The dirty region of the layer that needs to be redrawn
     */
    abstract void redrawLater(DisplayList displayList, Rect dirtyRect);

    /**
     * Indicates that this layer has lost its underlying storage.
     */
    abstract void clearStorage();
}
+1 −0
Original line number Diff line number Diff line
@@ -224,6 +224,7 @@ public class TextureView extends View {
    private void destroySurface() {
        if (mLayer != null) {
            mSurface.detachFromGLContext();
            mLayer.clearStorage();

            boolean shouldRelease = true;
            if (mListener != null) {
+6 −0
Original line number Diff line number Diff line
@@ -822,6 +822,11 @@ static void android_view_GLES20Canvas_updateRenderLayer(JNIEnv* env, jobject cla
    layer->updateDeferred(renderer, displayList, left, top, right, bottom);
}

static void android_view_GLES20Canvas_clearLayerTexture(JNIEnv* env, jobject clazz,
        Layer* layer) {
    layer->clearTexture();
}

static void android_view_GLES20Canvas_setTextureLayerTransform(JNIEnv* env, jobject clazz,
        Layer* layer, SkMatrix* matrix) {

@@ -1016,6 +1021,7 @@ static JNINativeMethod gMethods[] = {
    { "nUpdateTextureLayer",     "(IIIZLandroid/graphics/SurfaceTexture;)V",
            (void*) android_view_GLES20Canvas_updateTextureLayer },
    { "nUpdateRenderLayer",      "(IIIIIII)V", (void*) android_view_GLES20Canvas_updateRenderLayer },
    { "nClearLayerTexture",      "(I)V",       (void*) android_view_GLES20Canvas_clearLayerTexture },
    { "nDestroyLayer",           "(I)V",       (void*) android_view_GLES20Canvas_destroyLayer },
    { "nDestroyLayerDeferred",   "(I)V",       (void*) android_view_GLES20Canvas_destroyLayerDeferred },
    { "nDrawLayer",              "(IIFFI)V",   (void*) android_view_GLES20Canvas_drawLayer },
Loading