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

Commit 5c13d89c authored by Chet Haase's avatar Chet Haase
Browse files

Optimizing display lists by referencing pointers to resources instead of copying them

Change-Id: I81ad3551d74aa1e5bb64d69e33d2eb29a6c1eb6a
parent a376d030
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ package android.animation;
public interface TimeInterpolator {

    /**
     * Maps a value representing the elapsed fraciton of an animation to a value that represents
     * Maps a value representing the elapsed fraction of an animation to a value that represents
     * the interpolated fraction. This interpolated value is then multiplied by the change in
     * value of an animation to derive the animated value at the current elapsed animation time.
     *
+1 −1
Original line number Diff line number Diff line
@@ -523,7 +523,6 @@ public class ValueAnimator extends Animator {
            for (int i = 0; i < numValues; ++i) {
                mValues[i].init();
            }
            mCurrentIteration = 0;
            mInitialized = true;
        }
    }
@@ -933,6 +932,7 @@ public class ValueAnimator extends Animator {
            // This sets the initial value of the animation, prior to actually starting it running
            setCurrentPlayTime(getCurrentPlayTime());
        }
        mCurrentIteration = 0;
        mPlayingState = STOPPED;
        mStartedDelay = false;
        sPendingAnimations.add(this);
+0 −6
Original line number Diff line number Diff line
@@ -38,12 +38,6 @@ abstract class DisplayList {
     */
    abstract void end();

    /**
     * Frees resources taken by this display list. This method must be called
     * before releasing all references.
     */
    abstract void destroy();

    /**
     * Indicates whether this display list can be replayed or not.
     * 
+26 −8
Original line number Diff line number Diff line
@@ -34,6 +34,11 @@ import android.text.GraphicsOperations;
import android.text.SpannableString;
import android.text.SpannedString;
import android.text.TextUtils;
import android.util.Finalizers;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * An implementation of Canvas on top of OpenGL ES 2.0.
@@ -84,22 +89,35 @@ class GLES20Canvas extends HardwareCanvas {
       
        if (mRenderer == 0) {
            throw new IllegalStateException("Could not create GLES20Canvas renderer");
        } else {
            new CanvasFinalizer(this);
        }
    }

    private native int nCreateRenderer();    
    private native int nCreateDisplayListRenderer();    

    private static native void nDestroyRenderer(int renderer);

    private static class CanvasFinalizer extends Finalizers.ReclaimableReference<GLES20Canvas> {
        private static final Set<CanvasFinalizer> sFinalizers = Collections.synchronizedSet(
                new HashSet<CanvasFinalizer>());

        private int mRenderer;

        CanvasFinalizer(GLES20Canvas canvas) {
            super(canvas, Finalizers.getQueue());
            mRenderer = canvas.mRenderer;
            sFinalizers.add(this);
        }

        @Override
    public synchronized void destroy() {
        if (mRenderer != 0) {
        public void reclaim() {
            nDestroyRenderer(mRenderer);
            mRenderer = 0;
            sFinalizers.remove(this);
        }
    }

    private native void nDestroyRenderer(int renderer);

    ///////////////////////////////////////////////////////////////////////////
    // Canvas management
    ///////////////////////////////////////////////////////////////////////////
@@ -178,11 +196,11 @@ class GLES20Canvas extends HardwareCanvas {

    private native int nCreateDisplayList(int renderer);
    
    void destroyDisplayList(int displayList) {
    static void destroyDisplayList(int displayList) {
        nDestroyDisplayList(displayList);
    }

    private native void nDestroyDisplayList(int displayList);
    private static native void nDestroyDisplayList(int displayList);

    @Override
    public void drawDisplayList(DisplayList displayList) {
+26 −17
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@

package android.view;

import android.util.Finalizers;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * An implementation of display list for OpenGL ES 2.0.
 */
@@ -33,8 +39,6 @@ class GLES20DisplayList extends DisplayList {
            throw new IllegalStateException("Recording has already started");
        }

        destroyCanvas();

        mCanvas = new GLES20Canvas(true, true);
        mStarted = true;
        mRecorded = false;
@@ -42,16 +46,6 @@ class GLES20DisplayList extends DisplayList {
        return mCanvas;
    }

    private void destroyCanvas() {
        if (mCanvas != null) {
            mCanvas.destroyDisplayList(mNativeDisplayList);
            mCanvas.destroy();

            mCanvas = null;
            mNativeDisplayList = 0;
        }
    }

    @Override
    void end() {
        if (mCanvas != null) {
@@ -59,16 +53,31 @@ class GLES20DisplayList extends DisplayList {
            mRecorded = true;

            mNativeDisplayList = mCanvas.getDisplayList();
            new DisplayListFinalizer(this);
        }
    }

    @Override
    void destroy() {
        destroyCanvas();
    boolean isReady() {
        return !mStarted && mRecorded;
    }

    private static class DisplayListFinalizer extends Finalizers.ReclaimableReference<DisplayList> {
        private static final Set<DisplayListFinalizer> sFinalizers = Collections.synchronizedSet(
                new HashSet<DisplayListFinalizer>());

        private int mNativeDisplayList;

        DisplayListFinalizer(GLES20DisplayList displayList) {
            super(displayList, Finalizers.getQueue());
            mNativeDisplayList = displayList.mNativeDisplayList;
            sFinalizers.add(this);
        }

        @Override
    boolean isReady() {
        return !mStarted && mRecorded;
        public void reclaim() {
            GLES20Canvas.destroyDisplayList(mNativeDisplayList);
            sFinalizers.remove(this);
        }
    }
}
Loading