Loading core/java/android/view/GLRenderer.java +8 −14 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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 Loading @@ -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()); Loading @@ -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 Loading Loading @@ -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 Loading core/java/android/view/HardwareLayer.java +29 −76 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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) { Loading @@ -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. * * Loading @@ -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); } } /** /** Loading @@ -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; } } /** /** Loading @@ -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() { Loading @@ -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); } } Loading Loading @@ -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); } } /** /** Loading @@ -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); } } /** /** Loading @@ -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()); } } }); }); } } Loading @@ -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); } } /** /** Loading @@ -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; } } Loading Loading @@ -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); Loading @@ -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; } } } } } core/java/android/view/HardwareRenderer.java +0 −6 Original line number Original line Diff line number Diff line Loading @@ -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. Loading core/java/android/view/ThreadedRenderer.java +4 −8 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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); Loading core/java/com/android/internal/util/VirtualRefBasePtr.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
core/java/android/view/GLRenderer.java +8 −14 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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 Loading @@ -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()); Loading @@ -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 Loading Loading @@ -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 Loading
core/java/android/view/HardwareLayer.java +29 −76 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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) { Loading @@ -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. * * Loading @@ -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); } } /** /** Loading @@ -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; } } /** /** Loading @@ -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() { Loading @@ -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); } } Loading Loading @@ -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); } } /** /** Loading @@ -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); } } /** /** Loading @@ -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()); } } }); }); } } Loading @@ -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); } } /** /** Loading @@ -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; } } Loading Loading @@ -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); Loading @@ -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; } } } } }
core/java/android/view/HardwareRenderer.java +0 −6 Original line number Original line Diff line number Diff line Loading @@ -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. Loading
core/java/android/view/ThreadedRenderer.java +4 −8 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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); Loading
core/java/com/android/internal/util/VirtualRefBasePtr.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -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