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

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

Merge "Restore buildLayer()'s old behavior; it's synchronous again Bug #9193833"

parents 512d8fbe 40543602
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -162,6 +162,11 @@ class GLES20Canvas extends HardwareCanvas {
        nPushLayerUpdate(mRenderer, ((GLES20RenderLayer) layer).mLayer);
    }

    @Override
    void flushLayerUpdates() {
        nFlushLayerUpdates(mRenderer);
    }

    @Override
    void clearLayerUpdates() {
        nClearLayerUpdates(mRenderer);
@@ -184,6 +189,7 @@ class GLES20Canvas extends HardwareCanvas {
    static native boolean nCopyLayer(int layerId, int bitmap);

    private static native void nClearLayerUpdates(int renderer);
    private static native void nFlushLayerUpdates(int renderer);
    private static native void nPushLayerUpdate(int renderer, int layer);

    ///////////////////////////////////////////////////////////////////////////
+9 −0
Original line number Diff line number Diff line
@@ -201,6 +201,15 @@ public abstract class HardwareCanvas extends Canvas {
     */
    abstract void pushLayerUpdate(HardwareLayer layer);

    /**
     * Immediately executes all enqueued layer updates.
     *
     * @see #pushLayerUpdate(HardwareLayer)
     *
     * @hide
     */
    abstract void flushLayerUpdates();

    /**
     * Removes all enqueued layer updates.
     * 
+14 −0
Original line number Diff line number Diff line
@@ -449,9 +449,18 @@ public abstract class HardwareRenderer {
     * as soon as possible.
     * 
     * @param layer The hardware layer that needs an update
     *
     * @see #flushLayerUpdates()
     */
    abstract void pushLayerUpdate(HardwareLayer layer);

    /**
     * Forces all enqueued layer updates to be executed immediately.
     *
     * @see #pushLayerUpdate(HardwareLayer)
     */
    abstract void flushLayerUpdates();

    /**
     * Interface used to receive callbacks whenever a view is drawn by
     * a hardware renderer instance.
@@ -2123,6 +2132,11 @@ public abstract class HardwareRenderer {
            mGlCanvas.pushLayerUpdate(layer);
        }

        @Override
        void flushLayerUpdates() {
            mGlCanvas.flushLayerUpdates();
        }

        @Override
        public DisplayList createDisplayList(String name) {
            return new GLES20DisplayList(name);
+6 −4
Original line number Diff line number Diff line
@@ -12615,16 +12615,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    public void buildLayer() {
        if (mLayerType == LAYER_TYPE_NONE) return;
        if (mAttachInfo == null) {
        final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo == null) {
            throw new IllegalStateException("This view must be attached to a window first");
        }
        switch (mLayerType) {
            case LAYER_TYPE_HARDWARE:
                if (mAttachInfo.mHardwareRenderer != null &&
                        mAttachInfo.mHardwareRenderer.isEnabled() &&
                        mAttachInfo.mHardwareRenderer.validate()) {
                if (attachInfo.mHardwareRenderer != null &&
                        attachInfo.mHardwareRenderer.isEnabled() &&
                        attachInfo.mHardwareRenderer.validate()) {
                    getHardwareLayer();
                    attachInfo.mViewRootImpl.dispatchFlushHardwareLayerUpdates();
                }
                break;
            case LAYER_TYPE_SOFTWARE:
+18 −0
Original line number Diff line number Diff line
@@ -640,6 +640,18 @@ public final class ViewRootImpl implements ViewParent,
        }
    }

    void flushHardwareLayerUpdates() {
        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled() &&
                mAttachInfo.mHardwareRenderer.validate()) {
            mAttachInfo.mHardwareRenderer.flushLayerUpdates();
        }
    }

    void dispatchFlushHardwareLayerUpdates() {
        mHandler.removeMessages(MSG_FLUSH_LAYER_UPDATES);
        mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_FLUSH_LAYER_UPDATES));
    }

    public boolean attachFunctor(int functor) {
        //noinspection SimplifiableIfStatement
        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
@@ -2900,6 +2912,7 @@ public final class ViewRootImpl implements ViewParent,
    private final static int MSG_DISPATCH_DONE_ANIMATING = 22;
    private final static int MSG_INVALIDATE_WORLD = 23;
    private final static int MSG_WINDOW_MOVED = 24;
    private final static int MSG_FLUSH_LAYER_UPDATES = 25;

    final class ViewRootHandler extends Handler {
        @Override
@@ -2949,6 +2962,8 @@ public final class ViewRootImpl implements ViewParent,
                    return "MSG_DISPATCH_DONE_ANIMATING";
                case MSG_WINDOW_MOVED:
                    return "MSG_WINDOW_MOVED";
                case MSG_FLUSH_LAYER_UPDATES:
                    return "MSG_FLUSH_LAYER_UPDATES";
            }
            return super.getMessageName(message);
        }
@@ -3171,6 +3186,9 @@ public final class ViewRootImpl implements ViewParent,
                    invalidateWorld(mView);
                }
            } break;
            case MSG_FLUSH_LAYER_UPDATES: {
                flushHardwareLayerUpdates();
            } break;
            }
        }
    }
Loading