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

Commit ca8eb243 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Re-jigger layers" into lmp-preview-dev

parents 94fec83d d72e0a33
Loading
Loading
Loading
Loading
+8 −14
Original line number Original line Diff line number Diff line
@@ -178,7 +178,7 @@ public class GLRenderer extends HardwareRenderer {
    private static EGLSurface sPbuffer;
    private static EGLSurface sPbuffer;
    private static final Object[] sPbufferLock = new Object[0];
    private static final Object[] sPbufferLock = new Object[0];


    private List<HardwareLayer> mAttachedLayers = new ArrayList<HardwareLayer>();
    private List<HardwareLayer> mLayerUpdates = new ArrayList<HardwareLayer>();


    private static class GLRendererEglContext extends ManagedEGLContext {
    private static class GLRendererEglContext extends ManagedEGLContext {
        final Handler mHandler = new Handler();
        final Handler mHandler = new Handler();
@@ -471,7 +471,7 @@ public class GLRenderer extends HardwareRenderer {


    @Override
    @Override
    void pushLayerUpdate(HardwareLayer layer) {
    void pushLayerUpdate(HardwareLayer layer) {
        mGlCanvas.pushLayerUpdate(layer);
        mLayerUpdates.add(layer);
    }
    }


    @Override
    @Override
@@ -494,11 +494,6 @@ public class GLRenderer extends HardwareRenderer {
        return HardwareLayer.createDisplayListLayer(this, width, height);
        return HardwareLayer.createDisplayListLayer(this, width, height);
    }
    }


    @Override
    void onLayerCreated(HardwareLayer hardwareLayer) {
        mAttachedLayers.add(hardwareLayer);
    }

    boolean hasContext() {
    boolean hasContext() {
        return sEgl != null && mEglContext != null
        return sEgl != null && mEglContext != null
                && mEglContext.equals(sEgl.eglGetCurrentContext());
                && mEglContext.equals(sEgl.eglGetCurrentContext());
@@ -509,11 +504,7 @@ public class GLRenderer extends HardwareRenderer {
        if (mGlCanvas != null) {
        if (mGlCanvas != null) {
            mGlCanvas.cancelLayerUpdate(layer);
            mGlCanvas.cancelLayerUpdate(layer);
        }
        }
        if (hasContext()) {
        mLayerUpdates.remove(layer);
            long backingLayer = layer.detachBackingLayer();
            nDestroyLayer(backingLayer);
        }
        mAttachedLayers.remove(layer);
    }
    }


    @Override
    @Override
@@ -1198,16 +1189,19 @@ public class GLRenderer extends HardwareRenderer {


    private void flushLayerChanges() {
    private void flushLayerChanges() {
        // Loop through and apply any pending layer changes
        // Loop through and apply any pending layer changes
        for (int i = 0; i < mAttachedLayers.size(); i++) {
        for (int i = 0; i < mLayerUpdates.size(); i++) {
            HardwareLayer layer = mAttachedLayers.get(i);
            HardwareLayer layer = mLayerUpdates.get(i);
            layer.flushChanges();
            layer.flushChanges();
            if (!layer.isValid()) {
            if (!layer.isValid()) {
                // The layer was removed from mAttachedLayers, rewind i by 1
                // The layer was removed from mAttachedLayers, rewind i by 1
                // Note that this shouldn't actually happen as View.getHardwareLayer()
                // Note that this shouldn't actually happen as View.getHardwareLayer()
                // is already flushing for error checking reasons
                // is already flushing for error checking reasons
                i--;
                i--;
            } else if (layer.hasDisplayList()) {
                mCanvas.pushLayerUpdate(layer);
            }
            }
        }
        }
        mLayerUpdates.clear();
    }
    }


    @Override
    @Override
+29 −76
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.graphics.SurfaceTexture;


import com.android.internal.util.VirtualRefBasePtr;

/**
/**
 * A hardware layer can be used to render graphics operations into a hardware
 * A hardware layer can be used to render graphics operations into a hardware
 * friendly buffer. For instance, with an OpenGL backend a hardware layer
 * friendly buffer. For instance, with an OpenGL backend a hardware layer
@@ -36,7 +38,7 @@ final class HardwareLayer {
    private static final int LAYER_TYPE_DISPLAY_LIST = 2;
    private static final int LAYER_TYPE_DISPLAY_LIST = 2;


    private HardwareRenderer mRenderer;
    private HardwareRenderer mRenderer;
    private Finalizer mFinalizer;
    private VirtualRefBasePtr mFinalizer;
    private RenderNode mDisplayList;
    private RenderNode mDisplayList;
    private final int mLayerType;
    private final int mLayerType;


@@ -47,10 +49,7 @@ final class HardwareLayer {
        }
        }
        mRenderer = renderer;
        mRenderer = renderer;
        mLayerType = type;
        mLayerType = type;
        mFinalizer = new Finalizer(deferredUpdater);
        mFinalizer = new VirtualRefBasePtr(deferredUpdater);

        // Layer is considered initialized at this point, notify the HardwareRenderer
        mRenderer.onLayerCreated(this);
    }
    }


    private void assertType(int type) {
    private void assertType(int type) {
@@ -59,6 +58,10 @@ final class HardwareLayer {
        }
        }
    }
    }


    boolean hasDisplayList() {
        return mDisplayList != null;
    }

    /**
    /**
     * Update the paint used when drawing this layer.
     * Update the paint used when drawing this layer.
     *
     *
@@ -66,7 +69,8 @@ final class HardwareLayer {
     * @see View#setLayerPaint(android.graphics.Paint)
     * @see View#setLayerPaint(android.graphics.Paint)
     */
     */
    public void setLayerPaint(Paint paint) {
    public void setLayerPaint(Paint paint) {
        nSetLayerPaint(mFinalizer.mDeferredUpdater, paint.mNativePaint);
        nSetLayerPaint(mFinalizer.get(), paint.mNativePaint);
        mRenderer.pushLayerUpdate(this);
    }
    }


    /**
    /**
@@ -75,7 +79,7 @@ final class HardwareLayer {
     * @return True if the layer can be rendered into, false otherwise
     * @return True if the layer can be rendered into, false otherwise
     */
     */
    public boolean isValid() {
    public boolean isValid() {
        return mFinalizer != null && mFinalizer.mDeferredUpdater != 0;
        return mFinalizer != null && mFinalizer.get() != 0;
    }
    }


    /**
    /**
@@ -91,35 +95,14 @@ final class HardwareLayer {
            mDisplayList.destroyDisplayListData();
            mDisplayList.destroyDisplayListData();
            mDisplayList = null;
            mDisplayList = null;
        }
        }
        if (mRenderer != null) {
        mRenderer.onLayerDestroyed(this);
        mRenderer.onLayerDestroyed(this);
        mRenderer = null;
        mRenderer = null;
        }
        mFinalizer.release();
        doDestroyLayerUpdater();
        mFinalizer = null;
    }
    }


    public long getDeferredLayerUpdater() {
    public long getDeferredLayerUpdater() {
        return mFinalizer.mDeferredUpdater;
        return mFinalizer.get();
    }

    /**
     * Destroys the deferred layer updater but not the backing layer. The
     * backing layer is instead returned and is the caller's responsibility
     * to destroy/recycle as appropriate.
     *
     * It is safe to call this in onLayerDestroyed only
     */
    public long detachBackingLayer() {
        long backingLayer = nDetachBackingLayer(mFinalizer.mDeferredUpdater);
        doDestroyLayerUpdater();
        return backingLayer;
    }

    private void doDestroyLayerUpdater() {
        if (mFinalizer != null) {
            mFinalizer.destroy();
            mFinalizer = null;
        }
    }
    }


    public RenderNode startRecording() {
    public RenderNode startRecording() {
@@ -132,7 +115,7 @@ final class HardwareLayer {
    }
    }


    public void endRecording(Rect dirtyRect) {
    public void endRecording(Rect dirtyRect) {
        nUpdateRenderLayer(mFinalizer.mDeferredUpdater, mDisplayList.getNativeDisplayList(),
        nUpdateRenderLayer(mFinalizer.get(), mDisplayList.getNativeDisplayList(),
                dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom);
                dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom);
        mRenderer.pushLayerUpdate(this);
        mRenderer.pushLayerUpdate(this);
    }
    }
@@ -160,7 +143,7 @@ final class HardwareLayer {
     *         match the desired values.
     *         match the desired values.
     */
     */
    public boolean prepare(int width, int height, boolean isOpaque) {
    public boolean prepare(int width, int height, boolean isOpaque) {
        return nPrepare(mFinalizer.mDeferredUpdater, width, height, isOpaque);
        return nPrepare(mFinalizer.get(), width, height, isOpaque);
    }
    }


    /**
    /**
@@ -169,7 +152,8 @@ final class HardwareLayer {
     * @param matrix The transform to apply to the layer.
     * @param matrix The transform to apply to the layer.
     */
     */
    public void setTransform(Matrix matrix) {
    public void setTransform(Matrix matrix) {
        nSetTransform(mFinalizer.mDeferredUpdater, matrix.native_instance);
        nSetTransform(mFinalizer.get(), matrix.native_instance);
        mRenderer.pushLayerUpdate(this);
    }
    }


    /**
    /**
@@ -183,7 +167,7 @@ final class HardwareLayer {
                surface.detachFromGLContext();
                surface.detachFromGLContext();
                // SurfaceTexture owns the texture name and detachFromGLContext
                // SurfaceTexture owns the texture name and detachFromGLContext
                // should have deleted it
                // should have deleted it
                nOnTextureDestroyed(mFinalizer.mDeferredUpdater);
                nOnTextureDestroyed(mFinalizer.get());
            }
            }
        });
        });
    }
    }
@@ -200,24 +184,26 @@ final class HardwareLayer {
            return;
            return;
        }
        }


        boolean success = nFlushChanges(mFinalizer.mDeferredUpdater);
        boolean success = nFlushChanges(mFinalizer.get());
        if (!success) {
        if (!success) {
            destroy();
            destroy();
        }
        }
    }
    }


    public long getLayer() {
    public long getLayer() {
        return nGetLayer(mFinalizer.mDeferredUpdater);
        return nGetLayer(mFinalizer.get());
    }
    }


    public void setSurfaceTexture(SurfaceTexture surface) {
    public void setSurfaceTexture(SurfaceTexture surface) {
        assertType(LAYER_TYPE_TEXTURE);
        assertType(LAYER_TYPE_TEXTURE);
        nSetSurfaceTexture(mFinalizer.mDeferredUpdater, surface, false);
        nSetSurfaceTexture(mFinalizer.get(), surface, false);
        mRenderer.pushLayerUpdate(this);
    }
    }


    public void updateSurfaceTexture() {
    public void updateSurfaceTexture() {
        assertType(LAYER_TYPE_TEXTURE);
        assertType(LAYER_TYPE_TEXTURE);
        nUpdateSurfaceTexture(mFinalizer.mDeferredUpdater);
        nUpdateSurfaceTexture(mFinalizer.get());
        mRenderer.pushLayerUpdate(this);
    }
    }


    /**
    /**
@@ -225,8 +211,8 @@ final class HardwareLayer {
     */
     */
    SurfaceTexture createSurfaceTexture() {
    SurfaceTexture createSurfaceTexture() {
        assertType(LAYER_TYPE_TEXTURE);
        assertType(LAYER_TYPE_TEXTURE);
        SurfaceTexture st = new SurfaceTexture(nGetTexName(mFinalizer.mDeferredUpdater));
        SurfaceTexture st = new SurfaceTexture(nGetTexName(mFinalizer.get()));
        nSetSurfaceTexture(mFinalizer.mDeferredUpdater, st, true);
        nSetSurfaceTexture(mFinalizer.get(), st, true);
        return st;
        return st;
    }
    }


@@ -258,15 +244,6 @@ final class HardwareLayer {
    private static native long nCreateRenderLayer(int width, int height);
    private static native long nCreateRenderLayer(int width, int height);


    private static native void nOnTextureDestroyed(long layerUpdater);
    private static native void nOnTextureDestroyed(long layerUpdater);
    private static native long nDetachBackingLayer(long layerUpdater);

    /** This also destroys the underlying layer if it is still attached.
     *  Note it does not recycle the underlying layer, but instead queues it
     *  for deferred deletion.
     *  The HardwareRenderer should use detachBackingLayer() in the
     *  onLayerDestroyed() callback to do recycling if desired.
     */
    private static native void nDestroyLayerUpdater(long layerUpdater);


    private static native boolean nPrepare(long layerUpdater, int width, int height, boolean isOpaque);
    private static native boolean nPrepare(long layerUpdater, int width, int height, boolean isOpaque);
    private static native void nSetLayerPaint(long layerUpdater, long paint);
    private static native void nSetLayerPaint(long layerUpdater, long paint);
@@ -281,28 +258,4 @@ final class HardwareLayer {


    private static native long nGetLayer(long layerUpdater);
    private static native long nGetLayer(long layerUpdater);
    private static native int nGetTexName(long layerUpdater);
    private static native int nGetTexName(long layerUpdater);

    private static class Finalizer {
        private long mDeferredUpdater;

        public Finalizer(long deferredUpdater) {
            mDeferredUpdater = deferredUpdater;
        }

        @Override
        protected void finalize() throws Throwable {
            try {
                destroy();
            } finally {
                super.finalize();
            }
        }

        void destroy() {
            if (mDeferredUpdater != 0) {
                nDestroyLayerUpdater(mDeferredUpdater);
                mDeferredUpdater = 0;
            }
        }
    }
}
}
+0 −6
Original line number Original line Diff line number Diff line
@@ -322,12 +322,6 @@ public abstract class HardwareRenderer {
     */
     */
    abstract void pushLayerUpdate(HardwareLayer layer);
    abstract void pushLayerUpdate(HardwareLayer layer);


    /**
     * Tells the HardwareRenderer that a layer was created. The renderer should
     * make sure to apply any pending layer changes at the start of a new frame
     */
    abstract void onLayerCreated(HardwareLayer hardwareLayer);

    /**
    /**
     * Tells the HardwareRenderer that the layer is destroyed. The renderer
     * Tells the HardwareRenderer that the layer is destroyed. The renderer
     * should remove the layer from any update queues.
     * should remove the layer from any update queues.
+4 −8
Original line number Original line Diff line number Diff line
@@ -294,12 +294,7 @@ public class ThreadedRenderer extends HardwareRenderer {


    @Override
    @Override
    void pushLayerUpdate(HardwareLayer layer) {
    void pushLayerUpdate(HardwareLayer layer) {
        // TODO: Remove this, it's not needed outside of GLRenderer
        nPushLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
    }

    @Override
    void onLayerCreated(HardwareLayer layer) {
        // TODO: Is this actually useful?
    }
    }


    @Override
    @Override
@@ -309,7 +304,7 @@ public class ThreadedRenderer extends HardwareRenderer {


    @Override
    @Override
    void onLayerDestroyed(HardwareLayer layer) {
    void onLayerDestroyed(HardwareLayer layer) {
        nDestroyLayer(mNativeProxy, layer.getDeferredLayerUpdater());
        nCancelLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
    }
    }


    @Override
    @Override
@@ -398,7 +393,8 @@ public class ThreadedRenderer extends HardwareRenderer {
    private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);
    private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);
    private static native long nCreateTextureLayer(long nativeProxy);
    private static native long nCreateTextureLayer(long nativeProxy);
    private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
    private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
    private static native void nDestroyLayer(long nativeProxy, long layer);
    private static native void nPushLayerUpdate(long nativeProxy, long layer);
    private static native void nCancelLayerUpdate(long nativeProxy, long layer);


    private static native void nFlushCaches(long nativeProxy, int flushMode);
    private static native void nFlushCaches(long nativeProxy, int flushMode);


+8 −2
Original line number Original line Diff line number Diff line
@@ -32,11 +32,17 @@ public final class VirtualRefBasePtr {
        return mNativePtr;
        return mNativePtr;
    }
    }


    public void release() {
        if (mNativePtr != 0) {
            nDecStrong(mNativePtr);
            mNativePtr = 0;
        }
    }

    @Override
    @Override
    protected void finalize() throws Throwable {
    protected void finalize() throws Throwable {
        try {
        try {
            nDecStrong(mNativePtr);
            release();
            mNativePtr = 0;
        } finally {
        } finally {
            super.finalize();
            super.finalize();
        }
        }
Loading