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

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

Discard framebuffer rendering queues when discarding layers

Bug #5581817

Change-Id: If612846ec5f7793710fc4df152791fb32c506551
parent 50a66f0e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -154,6 +154,7 @@ class GLES20Canvas extends HardwareCanvas {
    static native void nSetTextureLayerTransform(int layerId, int matrix);
    static native void nDestroyLayer(int layerId);
    static native void nDestroyLayerDeferred(int layerId);
    static native void nFlushLayer(int layerId);
    static native boolean nCopyLayer(int layerId, int bitmap);

    ///////////////////////////////////////////////////////////////////////////
+7 −0
Original line number Diff line number Diff line
@@ -61,6 +61,13 @@ abstract class GLES20Layer extends HardwareLayer {
        mLayer = 0;
    }
    
    @Override
    void flush() {
        if (mLayer != 0) {
            GLES20Canvas.nFlushLayer(mLayer);
        }
    }

    static class Finalizer {
        private int mLayerId;

+5 −0
Original line number Diff line number Diff line
@@ -115,6 +115,11 @@ abstract class HardwareLayer {
     */
    abstract void destroy();

    /**
     * Flush the render queue associated with this layer.
     */
    abstract void flush();

    /**
     * This must be invoked before drawing onto this layer.
     * @param currentCanvas
+17 −2
Original line number Diff line number Diff line
@@ -10147,6 +10147,12 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
        }
    }
    
    void flushLayer() {
        if (mLayerType == LAYER_TYPE_HARDWARE && mHardwareLayer != null) {
            mHardwareLayer.flush();
        }
    }
    /**
     * <p>Returns a hardware layer that can be used to draw this view again
     * without executing its draw method.</p>
@@ -10159,6 +10165,9 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
            return null;
        }
        
        if (!mAttachInfo.mHardwareRenderer.validate()) return null;
        
        final int width = mRight - mLeft;
        final int height = mBottom - mTop;
@@ -10232,8 +10241,14 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
     */
    boolean destroyLayer() {
        if (mHardwareLayer != null) {
            AttachInfo info = mAttachInfo;
            if (info != null && info.mHardwareRenderer != null &&
                    info.mHardwareRenderer.isEnabled()) {
                if (!info.mHardwareRenderer.validate()) {
                    mHardwareLayer.destroy();
                    mHardwareLayer = null;                    
                }
            }
            return true;
        }
        return false;
+11 −0
Original line number Diff line number Diff line
@@ -2958,6 +2958,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
            mDrawLayers = enabled;
            invalidate(true);
            
            AttachInfo info = mAttachInfo;
            if (info != null && info.mHardwareRenderer != null &&
                    info.mHardwareRenderer.isEnabled()) {
                if (!info.mHardwareRenderer.validate()) {
                    enabled = false;
                }
            } else {
                enabled = false;
            }

            // We need to invalidate any child with a layer. For instance,
            // if a child is backed by a hardware layer and we disable layers
            // the child is marked as not dirty (flags cleared the last time
@@ -2968,6 +2978,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
            for (int i = 0; i < mChildrenCount; i++) {
                View child = mChildren[i];
                if (child.mLayerType != LAYER_TYPE_NONE) {
                    if (!enabled) child.flushLayer();
                    child.invalidate(true);
                }
            }
Loading