Loading core/java/android/view/HardwareRenderer.java +15 −6 Original line number Diff line number Diff line Loading @@ -260,7 +260,7 @@ public abstract class HardwareRenderer { /** * Gets the current width of the surface. This is the width that the surface * was last set to in a call to {@link #setup(int, int, Rect)}. * was last set to in a call to {@link #setup(int, int, View.AttachInfo, Rect)}. * * @return the current width of the surface */ Loading @@ -268,7 +268,7 @@ public abstract class HardwareRenderer { /** * Gets the current height of the surface. This is the height that the surface * was last set to in a call to {@link #setup(int, int, Rect)}. * was last set to in a call to {@link #setup(int, int, View.AttachInfo, Rect)}. * * @return the current width of the surface */ Loading Loading @@ -373,19 +373,20 @@ public abstract class HardwareRenderer { * * @param width The width of the drawing surface. * @param height The height of the drawing surface. * @param attachInfo Information about the window. * @param surface The surface to hardware accelerate * @param surfaceInsets The drawing surface insets to apply * * @return true if the surface was initialized, false otherwise. Returning * false might mean that the surface was already initialized. */ boolean initializeIfNeeded(int width, int height, Surface surface, Rect surfaceInsets) throws OutOfResourcesException { boolean initializeIfNeeded(int width, int height, View.AttachInfo attachInfo, Surface surface, Rect surfaceInsets) throws OutOfResourcesException { if (isRequested()) { // We lost the gl context, so recreate it. if (!isEnabled()) { if (initialize(surface)) { setup(width, height, surfaceInsets); setup(width, height, attachInfo, surfaceInsets); return true; } } Loading @@ -398,9 +399,17 @@ public abstract class HardwareRenderer { * * @param width The width of the drawing surface. * @param height The height of the drawing surface. * @param attachInfo Information about the window. * @param surfaceInsets The drawing surface insets to apply */ abstract void setup(int width, int height, Rect surfaceInsets); abstract void setup(int width, int height, View.AttachInfo attachInfo, Rect surfaceInsets); /** * Updates the light position based on the position of the window. * * @param attachInfo Information about the window. */ abstract void setLightCenter(View.AttachInfo attachInfo); /** * Optional, sets the name of the renderer. Useful for debugging purposes. Loading core/java/android/view/ThreadedRenderer.java +21 −11 Original line number Diff line number Diff line Loading @@ -19,11 +19,10 @@ package android.view; import android.annotation.IntDef; import android.annotation.NonNull; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Binder; import android.os.IBinder; import android.os.ParcelFileDescriptor; Loading @@ -31,7 +30,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.Trace; import android.util.Log; import android.util.LongSparseArray; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; Loading @@ -41,8 +39,6 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashSet; /** * Hardware renderer that proxies the rendering to a render thread. Most calls Loading Loading @@ -197,10 +193,10 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override void setup(int width, int height, Rect surfaceInsets) { final float lightX = width / 2.0f; void setup(int width, int height, AttachInfo attachInfo, Rect surfaceInsets) { mWidth = width; mHeight = height; if (surfaceInsets != null && (surfaceInsets.left != 0 || surfaceInsets.right != 0 || surfaceInsets.top != 0 || surfaceInsets.bottom != 0)) { mHasInsets = true; Loading @@ -218,10 +214,23 @@ public class ThreadedRenderer extends HardwareRenderer { mSurfaceWidth = width; mSurfaceHeight = height; } mRootNode.setLeftTopRightBottom(-mInsetLeft, -mInsetTop, mSurfaceWidth, mSurfaceHeight); nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, lightX, mLightY, mLightZ, mLightRadius, nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, mLightRadius, mAmbientShadowAlpha, mSpotShadowAlpha); setLightCenter(attachInfo); } @Override void setLightCenter(AttachInfo attachInfo) { // Adjust light position for window offsets. final Point displaySize = attachInfo.mPoint; attachInfo.mDisplay.getRealSize(displaySize); final float lightX = displaySize.x / 2f - attachInfo.mWindowLeft; final float lightY = mLightY - attachInfo.mWindowTop; nSetLightCenter(mNativeProxy, lightX, lightY, mLightZ); } @Override Loading Loading @@ -500,8 +509,9 @@ public class ThreadedRenderer extends HardwareRenderer { private static native void nUpdateSurface(long nativeProxy, Surface window); private static native boolean nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height, float lightX, float lightY, float lightZ, float lightRadius, int ambientShadowAlpha, int spotShadowAlpha); float lightRadius, int ambientShadowAlpha, int spotShadowAlpha); private static native void nSetLightCenter(long nativeProxy, float lightX, float lightY, float lightZ); private static native void nSetOpaque(long nativeProxy, boolean opaque); private static native int nSyncAndDrawFrame(long nativeProxy, long[] frameInfo, int size); private static native void nDestroy(long nativeProxy); Loading core/java/android/view/ViewRootImpl.java +15 −10 Original line number Diff line number Diff line Loading @@ -1813,15 +1813,15 @@ public final class ViewRootImpl implements ViewParent, } } if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { if (hwInitialized || mWidth != mAttachInfo.mHardwareRenderer.getWidth() || mHeight != mAttachInfo.mHardwareRenderer.getHeight()) { mAttachInfo.mHardwareRenderer.setup( mWidth, mHeight, mWindowAttributes.surfaceInsets); final HardwareRenderer hardwareRenderer = mAttachInfo.mHardwareRenderer; if (hardwareRenderer != null && hardwareRenderer.isEnabled()) { if (hwInitialized || mWidth != hardwareRenderer.getWidth() || mHeight != hardwareRenderer.getHeight()) { hardwareRenderer.setup(mWidth, mHeight, mAttachInfo, mWindowAttributes.surfaceInsets); if (!hwInitialized) { mAttachInfo.mHardwareRenderer.invalidate(mSurface); hardwareRenderer.invalidate(mSurface); mFullRedrawNeeded = true; } } Loading Loading @@ -1897,6 +1897,11 @@ public final class ViewRootImpl implements ViewParent, } mAttachInfo.mWindowLeft = frame.left; mAttachInfo.mWindowTop = frame.top; // Update the light position for the new window offsets. if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.setLightCenter(mAttachInfo); } } } Loading Loading @@ -2605,7 +2610,7 @@ public final class ViewRootImpl implements ViewParent, try { mAttachInfo.mHardwareRenderer.initializeIfNeeded( mWidth, mHeight, mSurface, surfaceInsets); mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets); } catch (OutOfResourcesException e) { handleOutOfResourcesException(e); return; Loading Loading @@ -3300,7 +3305,7 @@ public final class ViewRootImpl implements ViewParent, final WindowManager.LayoutParams lp = mWindowAttributes; final Rect surfaceInsets = lp != null ? lp.surfaceInsets : null; mAttachInfo.mHardwareRenderer.initializeIfNeeded( mWidth, mHeight, mSurface, surfaceInsets); mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets); } catch (OutOfResourcesException e) { Log.e(TAG, "OutOfResourcesException locking surface", e); try { Loading core/jni/android_view_Surface.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -483,7 +483,8 @@ static jlong create(JNIEnv* env, jclass clazz, jlong rootNodePtr, jlong surfaceP proxy->initialize(surface); // Shadows can't be used via this interface, so just set the light source // to all 0s. (and width & height are unused, TODO remove them) proxy->setup(0, 0, (Vector3){0, 0, 0}, 0, 0, 0); proxy->setup(0, 0, 0, 0, 0); proxy->setLightCenter((Vector3){0, 0, 0}); return (jlong) proxy; } Loading core/jni/android_view_ThreadedRenderer.cpp +10 −6 Original line number Diff line number Diff line Loading @@ -290,12 +290,15 @@ static jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject } static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, jint width, jint height, jfloat lightX, jfloat lightY, jfloat lightZ, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha, jfloat density) { jint width, jint height, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setup(width, height, (Vector3){lightX, lightY, lightZ}, lightRadius, ambientShadowAlpha, spotShadowAlpha); proxy->setup(width, height, lightRadius, ambientShadowAlpha, spotShadowAlpha); } static void android_view_ThreadedRenderer_setLightCenter(JNIEnv* env, jobject clazz, jlong proxyPtr, jfloat lightX, jfloat lightY, jfloat lightZ) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setLightCenter((Vector3){lightX, lightY, lightZ}); } static void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, Loading Loading @@ -461,7 +464,8 @@ static JNINativeMethod gMethods[] = { { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetLightCenter", "(JFFF)V", (void*) android_view_ThreadedRenderer_setLightCenter }, { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, { "nSyncAndDrawFrame", "(J[JI)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy }, Loading Loading
core/java/android/view/HardwareRenderer.java +15 −6 Original line number Diff line number Diff line Loading @@ -260,7 +260,7 @@ public abstract class HardwareRenderer { /** * Gets the current width of the surface. This is the width that the surface * was last set to in a call to {@link #setup(int, int, Rect)}. * was last set to in a call to {@link #setup(int, int, View.AttachInfo, Rect)}. * * @return the current width of the surface */ Loading @@ -268,7 +268,7 @@ public abstract class HardwareRenderer { /** * Gets the current height of the surface. This is the height that the surface * was last set to in a call to {@link #setup(int, int, Rect)}. * was last set to in a call to {@link #setup(int, int, View.AttachInfo, Rect)}. * * @return the current width of the surface */ Loading Loading @@ -373,19 +373,20 @@ public abstract class HardwareRenderer { * * @param width The width of the drawing surface. * @param height The height of the drawing surface. * @param attachInfo Information about the window. * @param surface The surface to hardware accelerate * @param surfaceInsets The drawing surface insets to apply * * @return true if the surface was initialized, false otherwise. Returning * false might mean that the surface was already initialized. */ boolean initializeIfNeeded(int width, int height, Surface surface, Rect surfaceInsets) throws OutOfResourcesException { boolean initializeIfNeeded(int width, int height, View.AttachInfo attachInfo, Surface surface, Rect surfaceInsets) throws OutOfResourcesException { if (isRequested()) { // We lost the gl context, so recreate it. if (!isEnabled()) { if (initialize(surface)) { setup(width, height, surfaceInsets); setup(width, height, attachInfo, surfaceInsets); return true; } } Loading @@ -398,9 +399,17 @@ public abstract class HardwareRenderer { * * @param width The width of the drawing surface. * @param height The height of the drawing surface. * @param attachInfo Information about the window. * @param surfaceInsets The drawing surface insets to apply */ abstract void setup(int width, int height, Rect surfaceInsets); abstract void setup(int width, int height, View.AttachInfo attachInfo, Rect surfaceInsets); /** * Updates the light position based on the position of the window. * * @param attachInfo Information about the window. */ abstract void setLightCenter(View.AttachInfo attachInfo); /** * Optional, sets the name of the renderer. Useful for debugging purposes. Loading
core/java/android/view/ThreadedRenderer.java +21 −11 Original line number Diff line number Diff line Loading @@ -19,11 +19,10 @@ package android.view; import android.annotation.IntDef; import android.annotation.NonNull; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Binder; import android.os.IBinder; import android.os.ParcelFileDescriptor; Loading @@ -31,7 +30,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.Trace; import android.util.Log; import android.util.LongSparseArray; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; Loading @@ -41,8 +39,6 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashSet; /** * Hardware renderer that proxies the rendering to a render thread. Most calls Loading Loading @@ -197,10 +193,10 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override void setup(int width, int height, Rect surfaceInsets) { final float lightX = width / 2.0f; void setup(int width, int height, AttachInfo attachInfo, Rect surfaceInsets) { mWidth = width; mHeight = height; if (surfaceInsets != null && (surfaceInsets.left != 0 || surfaceInsets.right != 0 || surfaceInsets.top != 0 || surfaceInsets.bottom != 0)) { mHasInsets = true; Loading @@ -218,10 +214,23 @@ public class ThreadedRenderer extends HardwareRenderer { mSurfaceWidth = width; mSurfaceHeight = height; } mRootNode.setLeftTopRightBottom(-mInsetLeft, -mInsetTop, mSurfaceWidth, mSurfaceHeight); nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, lightX, mLightY, mLightZ, mLightRadius, nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, mLightRadius, mAmbientShadowAlpha, mSpotShadowAlpha); setLightCenter(attachInfo); } @Override void setLightCenter(AttachInfo attachInfo) { // Adjust light position for window offsets. final Point displaySize = attachInfo.mPoint; attachInfo.mDisplay.getRealSize(displaySize); final float lightX = displaySize.x / 2f - attachInfo.mWindowLeft; final float lightY = mLightY - attachInfo.mWindowTop; nSetLightCenter(mNativeProxy, lightX, lightY, mLightZ); } @Override Loading Loading @@ -500,8 +509,9 @@ public class ThreadedRenderer extends HardwareRenderer { private static native void nUpdateSurface(long nativeProxy, Surface window); private static native boolean nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height, float lightX, float lightY, float lightZ, float lightRadius, int ambientShadowAlpha, int spotShadowAlpha); float lightRadius, int ambientShadowAlpha, int spotShadowAlpha); private static native void nSetLightCenter(long nativeProxy, float lightX, float lightY, float lightZ); private static native void nSetOpaque(long nativeProxy, boolean opaque); private static native int nSyncAndDrawFrame(long nativeProxy, long[] frameInfo, int size); private static native void nDestroy(long nativeProxy); Loading
core/java/android/view/ViewRootImpl.java +15 −10 Original line number Diff line number Diff line Loading @@ -1813,15 +1813,15 @@ public final class ViewRootImpl implements ViewParent, } } if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { if (hwInitialized || mWidth != mAttachInfo.mHardwareRenderer.getWidth() || mHeight != mAttachInfo.mHardwareRenderer.getHeight()) { mAttachInfo.mHardwareRenderer.setup( mWidth, mHeight, mWindowAttributes.surfaceInsets); final HardwareRenderer hardwareRenderer = mAttachInfo.mHardwareRenderer; if (hardwareRenderer != null && hardwareRenderer.isEnabled()) { if (hwInitialized || mWidth != hardwareRenderer.getWidth() || mHeight != hardwareRenderer.getHeight()) { hardwareRenderer.setup(mWidth, mHeight, mAttachInfo, mWindowAttributes.surfaceInsets); if (!hwInitialized) { mAttachInfo.mHardwareRenderer.invalidate(mSurface); hardwareRenderer.invalidate(mSurface); mFullRedrawNeeded = true; } } Loading Loading @@ -1897,6 +1897,11 @@ public final class ViewRootImpl implements ViewParent, } mAttachInfo.mWindowLeft = frame.left; mAttachInfo.mWindowTop = frame.top; // Update the light position for the new window offsets. if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.setLightCenter(mAttachInfo); } } } Loading Loading @@ -2605,7 +2610,7 @@ public final class ViewRootImpl implements ViewParent, try { mAttachInfo.mHardwareRenderer.initializeIfNeeded( mWidth, mHeight, mSurface, surfaceInsets); mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets); } catch (OutOfResourcesException e) { handleOutOfResourcesException(e); return; Loading Loading @@ -3300,7 +3305,7 @@ public final class ViewRootImpl implements ViewParent, final WindowManager.LayoutParams lp = mWindowAttributes; final Rect surfaceInsets = lp != null ? lp.surfaceInsets : null; mAttachInfo.mHardwareRenderer.initializeIfNeeded( mWidth, mHeight, mSurface, surfaceInsets); mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets); } catch (OutOfResourcesException e) { Log.e(TAG, "OutOfResourcesException locking surface", e); try { Loading
core/jni/android_view_Surface.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -483,7 +483,8 @@ static jlong create(JNIEnv* env, jclass clazz, jlong rootNodePtr, jlong surfaceP proxy->initialize(surface); // Shadows can't be used via this interface, so just set the light source // to all 0s. (and width & height are unused, TODO remove them) proxy->setup(0, 0, (Vector3){0, 0, 0}, 0, 0, 0); proxy->setup(0, 0, 0, 0, 0); proxy->setLightCenter((Vector3){0, 0, 0}); return (jlong) proxy; } Loading
core/jni/android_view_ThreadedRenderer.cpp +10 −6 Original line number Diff line number Diff line Loading @@ -290,12 +290,15 @@ static jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject } static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, jint width, jint height, jfloat lightX, jfloat lightY, jfloat lightZ, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha, jfloat density) { jint width, jint height, jfloat lightRadius, jint ambientShadowAlpha, jint spotShadowAlpha) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setup(width, height, (Vector3){lightX, lightY, lightZ}, lightRadius, ambientShadowAlpha, spotShadowAlpha); proxy->setup(width, height, lightRadius, ambientShadowAlpha, spotShadowAlpha); } static void android_view_ThreadedRenderer_setLightCenter(JNIEnv* env, jobject clazz, jlong proxyPtr, jfloat lightX, jfloat lightY, jfloat lightZ) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setLightCenter((Vector3){lightX, lightY, lightZ}); } static void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, Loading Loading @@ -461,7 +464,8 @@ static JNINativeMethod gMethods[] = { { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetup", "(JIIFII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetLightCenter", "(JFFF)V", (void*) android_view_ThreadedRenderer_setLightCenter }, { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, { "nSyncAndDrawFrame", "(J[JI)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy }, Loading