Loading core/java/android/view/GLRenderer.java +5 −0 Original line number Diff line number Diff line Loading @@ -838,6 +838,11 @@ public class GLRenderer extends HardwareRenderer { } } @Override void pauseSurface(Surface surface) { // No-op } boolean initializeEgl() { synchronized (sEglLock) { if (sEgl == null && sEglConfig == null) { Loading core/java/android/view/HardwareRenderer.java +7 −0 Original line number Diff line number Diff line Loading @@ -233,6 +233,13 @@ public abstract class HardwareRenderer { */ abstract void updateSurface(Surface surface) throws OutOfResourcesException; /** * Stops any rendering into the surface. Use this if it is unclear whether * or not the surface used by the HardwareRenderer will be changing. It * Suspends any rendering into the surface, but will not do any destruction */ abstract void pauseSurface(Surface surface); /** * Destroys all hardware rendering resources associated with the specified * view hierarchy. Loading core/java/android/view/ThreadedRenderer.java +20 −1 Original line number Diff line number Diff line Loading @@ -54,27 +54,45 @@ public class ThreadedRenderer extends HardwareRenderer { private int mWidth, mHeight; private long mNativeProxy; private boolean mInitialized = false; ThreadedRenderer(boolean translucent) { mNativeProxy = nCreateProxy(translucent); setEnabled(mNativeProxy != 0); } @Override void destroy(boolean full) { mInitialized = false; updateEnabledState(null); nDestroyCanvas(mNativeProxy); } private void updateEnabledState(Surface surface) { if (surface == null || !surface.isValid()) { setEnabled(false); } else { setEnabled(mInitialized); } } @Override boolean initialize(Surface surface) throws OutOfResourcesException { mInitialized = true; updateEnabledState(surface); return nInitialize(mNativeProxy, surface); } @Override void updateSurface(Surface surface) throws OutOfResourcesException { updateEnabledState(surface); nUpdateSurface(mNativeProxy, surface); } @Override void pauseSurface(Surface surface) { nPauseSurface(mNativeProxy, surface); } @Override void destroyHardwareResources(View view) { destroyResources(view); Loading Loading @@ -267,6 +285,7 @@ public class ThreadedRenderer extends HardwareRenderer { private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native void nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height); private static native void nSetDisplayListData(long nativeProxy, long displayList, long newData); Loading core/java/android/view/ViewRootImpl.java +6 −0 Original line number Diff line number Diff line Loading @@ -1421,6 +1421,12 @@ public final class ViewRootImpl implements ViewParent, host.getMeasuredHeight() + ", params=" + params); } if (mAttachInfo.mHardwareRenderer != null) { // relayoutWindow may decide to destroy mSurface. As that decision // happens in WindowManager service, we need to be defensive here // and stop using the surface in case it gets destroyed. mAttachInfo.mHardwareRenderer.pauseSurface(mSurface); } final int surfaceGenerationId = mSurface.getGenerationId(); relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); if (!mDrawDuringWindowsAnimating && Loading core/jni/android_view_ThreadedRenderer.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -84,7 +84,7 @@ static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject cl jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface); return proxy->initialize(window.get()); return proxy->initialize(window); } static void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, Loading @@ -94,7 +94,17 @@ static void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject cla if (jsurface) { window = android_view_Surface_getNativeWindow(env, jsurface); } proxy->updateSurface(window.get()); proxy->updateSurface(window); } static void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); sp<ANativeWindow> window; if (jsurface) { window = android_view_Surface_getNativeWindow(env, jsurface); } proxy->pauseSurface(window); } static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, Loading Loading @@ -203,6 +213,7 @@ static JNINativeMethod gMethods[] = { { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetDisplayListData", "(JJJ)V", (void*) android_view_ThreadedRenderer_setDisplayListData }, { "nDrawDisplayList", "(JJIIII)V", (void*) android_view_ThreadedRenderer_drawDisplayList }, Loading Loading
core/java/android/view/GLRenderer.java +5 −0 Original line number Diff line number Diff line Loading @@ -838,6 +838,11 @@ public class GLRenderer extends HardwareRenderer { } } @Override void pauseSurface(Surface surface) { // No-op } boolean initializeEgl() { synchronized (sEglLock) { if (sEgl == null && sEglConfig == null) { Loading
core/java/android/view/HardwareRenderer.java +7 −0 Original line number Diff line number Diff line Loading @@ -233,6 +233,13 @@ public abstract class HardwareRenderer { */ abstract void updateSurface(Surface surface) throws OutOfResourcesException; /** * Stops any rendering into the surface. Use this if it is unclear whether * or not the surface used by the HardwareRenderer will be changing. It * Suspends any rendering into the surface, but will not do any destruction */ abstract void pauseSurface(Surface surface); /** * Destroys all hardware rendering resources associated with the specified * view hierarchy. Loading
core/java/android/view/ThreadedRenderer.java +20 −1 Original line number Diff line number Diff line Loading @@ -54,27 +54,45 @@ public class ThreadedRenderer extends HardwareRenderer { private int mWidth, mHeight; private long mNativeProxy; private boolean mInitialized = false; ThreadedRenderer(boolean translucent) { mNativeProxy = nCreateProxy(translucent); setEnabled(mNativeProxy != 0); } @Override void destroy(boolean full) { mInitialized = false; updateEnabledState(null); nDestroyCanvas(mNativeProxy); } private void updateEnabledState(Surface surface) { if (surface == null || !surface.isValid()) { setEnabled(false); } else { setEnabled(mInitialized); } } @Override boolean initialize(Surface surface) throws OutOfResourcesException { mInitialized = true; updateEnabledState(surface); return nInitialize(mNativeProxy, surface); } @Override void updateSurface(Surface surface) throws OutOfResourcesException { updateEnabledState(surface); nUpdateSurface(mNativeProxy, surface); } @Override void pauseSurface(Surface surface) { nPauseSurface(mNativeProxy, surface); } @Override void destroyHardwareResources(View view) { destroyResources(view); Loading Loading @@ -267,6 +285,7 @@ public class ThreadedRenderer extends HardwareRenderer { private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native void nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height); private static native void nSetDisplayListData(long nativeProxy, long displayList, long newData); Loading
core/java/android/view/ViewRootImpl.java +6 −0 Original line number Diff line number Diff line Loading @@ -1421,6 +1421,12 @@ public final class ViewRootImpl implements ViewParent, host.getMeasuredHeight() + ", params=" + params); } if (mAttachInfo.mHardwareRenderer != null) { // relayoutWindow may decide to destroy mSurface. As that decision // happens in WindowManager service, we need to be defensive here // and stop using the surface in case it gets destroyed. mAttachInfo.mHardwareRenderer.pauseSurface(mSurface); } final int surfaceGenerationId = mSurface.getGenerationId(); relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); if (!mDrawDuringWindowsAnimating && Loading
core/jni/android_view_ThreadedRenderer.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -84,7 +84,7 @@ static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject cl jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); sp<ANativeWindow> window = android_view_Surface_getNativeWindow(env, jsurface); return proxy->initialize(window.get()); return proxy->initialize(window); } static void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject clazz, Loading @@ -94,7 +94,17 @@ static void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject cla if (jsurface) { window = android_view_Surface_getNativeWindow(env, jsurface); } proxy->updateSurface(window.get()); proxy->updateSurface(window); } static void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); sp<ANativeWindow> window; if (jsurface) { window = android_view_Surface_getNativeWindow(env, jsurface); } proxy->pauseSurface(window); } static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, Loading Loading @@ -203,6 +213,7 @@ static JNINativeMethod gMethods[] = { { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetDisplayListData", "(JJJ)V", (void*) android_view_ThreadedRenderer_setDisplayListData }, { "nDrawDisplayList", "(JJIIII)V", (void*) android_view_ThreadedRenderer_drawDisplayList }, Loading