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

Commit 9c4b79af authored by Romain Guy's avatar Romain Guy
Browse files

Discard framebuffer rendering queues when discarding layers

Bug #5581817

Change-Id: Ie30700a29059d2ea60eb7bd3f8bd20ac48a149ab
parent e98ae0a0
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 −5
Original line number Diff line number Diff line
@@ -10208,6 +10208,13 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal
        }
    }
    
    // Make sure the HardwareRenderer.validate() was invoked before calling this method
    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>
@@ -10220,6 +10227,8 @@ 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;
@@ -10293,12 +10302,15 @@ 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() && info.mHardwareRenderer.validate()) {
                mHardwareLayer.destroy();
                mHardwareLayer = null;
                invalidate(true);
                invalidateParentCaches();
            }
            return true;
        }
        return false;
+12 −0
Original line number Diff line number Diff line
@@ -2958,6 +2958,17 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
            mDrawLayers = enabled;
            invalidate(true);

            boolean flushLayers = !enabled;
            AttachInfo info = mAttachInfo;
            if (info != null && info.mHardwareRenderer != null &&
                    info.mHardwareRenderer.isEnabled()) {
                if (!info.mHardwareRenderer.validate()) {
                    flushLayers = false;
                }
            } else {
                flushLayers = 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 +2979,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 (flushLayers) child.flushLayer();
                    child.invalidate(true);
                }
            }
Loading