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

Commit bdccfe4a authored by Chet Haase's avatar Chet Haase Committed by Android (Google) Code Review
Browse files

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

parents f3c3c4fd 5c13d89c
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