Loading core/java/android/view/HardwareRenderer.java +3 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; Loading Loading @@ -452,10 +453,10 @@ public abstract class HardwareRenderer { * * @return A hardware renderer backed by OpenGL. */ static HardwareRenderer create(boolean translucent) { static HardwareRenderer create(Context context, boolean translucent) { HardwareRenderer renderer = null; if (GLES20Canvas.isAvailable()) { renderer = new ThreadedRenderer(translucent); renderer = new ThreadedRenderer(context, translucent); } return renderer; } Loading core/java/android/view/ThreadedRenderer.java +37 −3 Original line number Diff line number Diff line Loading @@ -16,21 +16,29 @@ package android.view; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.graphics.drawable.Drawable; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.Trace; import android.util.Log; import android.util.LongSparseArray; import android.util.TimeUtils; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; /** * Hardware renderer that proxies the rendering to a render thread. Most calls Loading Loading @@ -71,8 +79,8 @@ public class ThreadedRenderer extends HardwareRenderer { private Choreographer mChoreographer; private boolean mProfilingEnabled; ThreadedRenderer(boolean translucent) { AtlasInitializer.sInstance.init(); ThreadedRenderer(Context context, boolean translucent) { AtlasInitializer.sInstance.init(context); long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); Loading Loading @@ -334,7 +342,7 @@ public class ThreadedRenderer extends HardwareRenderer { private AtlasInitializer() {} synchronized void init() { synchronized void init(Context context) { if (mInitialized) return; IBinder binder = ServiceManager.getService("assetatlas"); if (binder == null) return; Loading @@ -346,6 +354,8 @@ public class ThreadedRenderer extends HardwareRenderer { if (buffer != null) { long[] map = atlas.getMap(); if (map != null) { // TODO Remove after fixing b/15425820 validateMap(context, map); nSetAtlas(buffer, map); mInitialized = true; } Loading @@ -361,6 +371,30 @@ public class ThreadedRenderer extends HardwareRenderer { Log.w(LOG_TAG, "Could not acquire atlas", e); } } private static void validateMap(Context context, long[] map) { Log.d("Atlas", "Validating map..."); HashSet<Long> preloadedPointers = new HashSet<Long>(); // We only care about drawables that hold bitmaps final Resources resources = context.getResources(); final LongSparseArray<Drawable.ConstantState> drawables = resources.getPreloadedDrawables(); final int count = drawables.size(); for (int i = 0; i < count; i++) { final Bitmap bitmap = drawables.valueAt(i).getBitmap(); if (bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888) { preloadedPointers.add(bitmap.mNativeBitmap); } } for (int i = 0; i < map.length; i += 4) { if (!preloadedPointers.contains(map[i])) { Log.w("Atlas", String.format("Pointer 0x%X, not in getPreloadedDrawables?", map[i])); map[i] = 0; } } } } static native void setupShadersDiskCache(String cacheFile); Loading core/java/android/view/ViewRootImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -700,7 +700,7 @@ public final class ViewRootImpl implements ViewParent, } final boolean translucent = attrs.format != PixelFormat.OPAQUE; mAttachInfo.mHardwareRenderer = HardwareRenderer.create(translucent); mAttachInfo.mHardwareRenderer = HardwareRenderer.create(mContext, translucent); if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.setName(attrs.getTitle().toString()); mAttachInfo.mHardwareAccelerated = Loading Loading
core/java/android/view/HardwareRenderer.java +3 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; Loading Loading @@ -452,10 +453,10 @@ public abstract class HardwareRenderer { * * @return A hardware renderer backed by OpenGL. */ static HardwareRenderer create(boolean translucent) { static HardwareRenderer create(Context context, boolean translucent) { HardwareRenderer renderer = null; if (GLES20Canvas.isAvailable()) { renderer = new ThreadedRenderer(translucent); renderer = new ThreadedRenderer(context, translucent); } return renderer; } Loading
core/java/android/view/ThreadedRenderer.java +37 −3 Original line number Diff line number Diff line Loading @@ -16,21 +16,29 @@ package android.view; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.graphics.drawable.Drawable; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.Trace; import android.util.Log; import android.util.LongSparseArray; import android.util.TimeUtils; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; /** * Hardware renderer that proxies the rendering to a render thread. Most calls Loading Loading @@ -71,8 +79,8 @@ public class ThreadedRenderer extends HardwareRenderer { private Choreographer mChoreographer; private boolean mProfilingEnabled; ThreadedRenderer(boolean translucent) { AtlasInitializer.sInstance.init(); ThreadedRenderer(Context context, boolean translucent) { AtlasInitializer.sInstance.init(context); long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); Loading Loading @@ -334,7 +342,7 @@ public class ThreadedRenderer extends HardwareRenderer { private AtlasInitializer() {} synchronized void init() { synchronized void init(Context context) { if (mInitialized) return; IBinder binder = ServiceManager.getService("assetatlas"); if (binder == null) return; Loading @@ -346,6 +354,8 @@ public class ThreadedRenderer extends HardwareRenderer { if (buffer != null) { long[] map = atlas.getMap(); if (map != null) { // TODO Remove after fixing b/15425820 validateMap(context, map); nSetAtlas(buffer, map); mInitialized = true; } Loading @@ -361,6 +371,30 @@ public class ThreadedRenderer extends HardwareRenderer { Log.w(LOG_TAG, "Could not acquire atlas", e); } } private static void validateMap(Context context, long[] map) { Log.d("Atlas", "Validating map..."); HashSet<Long> preloadedPointers = new HashSet<Long>(); // We only care about drawables that hold bitmaps final Resources resources = context.getResources(); final LongSparseArray<Drawable.ConstantState> drawables = resources.getPreloadedDrawables(); final int count = drawables.size(); for (int i = 0; i < count; i++) { final Bitmap bitmap = drawables.valueAt(i).getBitmap(); if (bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888) { preloadedPointers.add(bitmap.mNativeBitmap); } } for (int i = 0; i < map.length; i += 4) { if (!preloadedPointers.contains(map[i])) { Log.w("Atlas", String.format("Pointer 0x%X, not in getPreloadedDrawables?", map[i])); map[i] = 0; } } } } static native void setupShadersDiskCache(String cacheFile); Loading
core/java/android/view/ViewRootImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -700,7 +700,7 @@ public final class ViewRootImpl implements ViewParent, } final boolean translucent = attrs.format != PixelFormat.OPAQUE; mAttachInfo.mHardwareRenderer = HardwareRenderer.create(translucent); mAttachInfo.mHardwareRenderer = HardwareRenderer.create(mContext, translucent); if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.setName(attrs.getTitle().toString()); mAttachInfo.mHardwareAccelerated = Loading