Import Android SDK Platform P [4697573]
/google/data/ro/projects/android/fetch_artifact \
--bid 4697573 \
--target sdk_phone_armv7-win_sdk \
sdk-repo-linux-sources-4697573.zip
AndroidVersion.ApiLevel has been modified to appear as 28
Change-Id: If80578c3c657366cc9cf75f8db13d46e2dd4e077
diff --git a/android/view/ThreadedRenderer.java b/android/view/ThreadedRenderer.java
index 8b730f2..5eb7e9c 100644
--- a/android/view/ThreadedRenderer.java
+++ b/android/view/ThreadedRenderer.java
@@ -34,6 +34,7 @@
import android.util.Log;
import android.view.Surface.OutOfResourcesException;
import android.view.View.AttachInfo;
+import android.view.animation.AnimationUtils;
import com.android.internal.R;
import com.android.internal.util.VirtualRefBasePtr;
@@ -166,18 +167,6 @@
public static final String OVERDRAW_PROPERTY_SHOW = "show";
/**
- * Defines the rendering pipeline to be used by the ThreadedRenderer.
- *
- * Possible values:
- * "opengl", will use the existing OpenGL renderer
- * "skiagl", will use Skia's OpenGL renderer
- * "skiavk", will use Skia's Vulkan renderer
- *
- * @hide
- */
- public static final String DEBUG_RENDERER_PROPERTY = "debug.hwui.renderer";
-
- /**
* Turn on to debug non-rectangular clip operations.
*
* Possible values:
@@ -343,6 +332,7 @@
private static final int FLAG_DUMP_FRAMESTATS = 1 << 0;
private static final int FLAG_DUMP_RESET = 1 << 1;
+ private static final int FLAG_DUMP_ALL = FLAG_DUMP_FRAMESTATS;
@IntDef(flag = true, prefix = { "FLAG_DUMP_" }, value = {
FLAG_DUMP_FRAMESTATS,
@@ -648,7 +638,10 @@
*/
void dumpGfxInfo(PrintWriter pw, FileDescriptor fd, String[] args) {
pw.flush();
- int flags = 0;
+ // If there's no arguments, eg 'dumpsys gfxinfo', then dump everything.
+ // If there's a targetted package, eg 'dumpsys gfxinfo com.android.systemui', then only
+ // dump the summary information
+ int flags = (args == null || args.length == 0) ? FLAG_DUMP_ALL : 0;
for (int i = 0; i < args.length; i++) {
switch (args[i]) {
case "framestats":
@@ -657,6 +650,9 @@
case "reset":
flags |= FLAG_DUMP_RESET;
break;
+ case "-a": // magic option passed when dumping a bugreport.
+ flags = FLAG_DUMP_ALL;
+ break;
}
}
nDumpProfileInfo(mNativeProxy, fd, flags);
@@ -838,9 +834,9 @@
*
* @return A hardware layer
*/
- HardwareLayer createTextureLayer() {
+ TextureLayer createTextureLayer() {
long layer = nCreateTextureLayer(mNativeProxy);
- return HardwareLayer.adoptTextureLayer(this, layer);
+ return TextureLayer.adoptTextureLayer(this, layer);
}
@@ -849,7 +845,7 @@
}
- boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) {
+ boolean copyLayerInto(final TextureLayer layer, final Bitmap bitmap) {
return nCopyLayerInto(mNativeProxy,
layer.getDeferredLayerUpdater(), bitmap);
}
@@ -860,7 +856,7 @@
*
* @param layer The hardware layer that needs an update
*/
- void pushLayerUpdate(HardwareLayer layer) {
+ void pushLayerUpdate(TextureLayer layer) {
nPushLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
}
@@ -868,7 +864,7 @@
* Tells the HardwareRenderer that the layer is destroyed. The renderer
* should remove the layer from any update queues.
*/
- void onLayerDestroyed(HardwareLayer layer) {
+ void onLayerDestroyed(TextureLayer layer) {
nCancelLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
}
@@ -938,6 +934,20 @@
nSetHighContrastText(highContrastText);
}
+ /**
+ * If set RenderThread will avoid doing any IPC using instead a fake vsync & DisplayInfo source
+ */
+ public static void setIsolatedProcess(boolean isIsolated) {
+ nSetIsolatedProcess(isIsolated);
+ }
+
+ /**
+ * If set extra graphics debugging abilities will be enabled such as dumping skp
+ */
+ public static void setDebuggingEnabled(boolean enable) {
+ nSetDebuggingEnabled(enable);
+ }
+
@Override
protected void finalize() throws Throwable {
try {
@@ -948,6 +958,107 @@
}
}
+ /**
+ * Basic synchronous renderer. Currently only used to render the Magnifier, so use with care.
+ * TODO: deduplicate against ThreadedRenderer.
+ *
+ * @hide
+ */
+ public static class SimpleRenderer {
+ private final RenderNode mRootNode;
+ private long mNativeProxy;
+ private final float mLightY, mLightZ;
+ private Surface mSurface;
+ private final FrameInfo mFrameInfo = new FrameInfo();
+
+ public SimpleRenderer(final Context context, final String name, final Surface surface) {
+ final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0);
+ mLightY = a.getDimension(R.styleable.Lighting_lightY, 0);
+ mLightZ = a.getDimension(R.styleable.Lighting_lightZ, 0);
+ final float lightRadius = a.getDimension(R.styleable.Lighting_lightRadius, 0);
+ final int ambientShadowAlpha =
+ (int) (255 * a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0) + 0.5f);
+ final int spotShadowAlpha =
+ (int) (255 * a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0) + 0.5f);
+ a.recycle();
+
+ final long rootNodePtr = nCreateRootRenderNode();
+ mRootNode = RenderNode.adopt(rootNodePtr);
+ mRootNode.setClipToBounds(false);
+ mNativeProxy = nCreateProxy(true /* translucent */, rootNodePtr);
+ nSetName(mNativeProxy, name);
+
+ ProcessInitializer.sInstance.init(context, mNativeProxy);
+ nLoadSystemProperties(mNativeProxy);
+
+ nSetup(mNativeProxy, lightRadius, ambientShadowAlpha, spotShadowAlpha);
+
+ mSurface = surface;
+ nUpdateSurface(mNativeProxy, surface);
+ }
+
+ /**
+ * Set the light center.
+ */
+ public void setLightCenter(final Display display,
+ final int windowLeft, final int windowTop) {
+ // Adjust light position for window offsets.
+ final Point displaySize = new Point();
+ display.getRealSize(displaySize);
+ final float lightX = displaySize.x / 2f - windowLeft;
+ final float lightY = mLightY - windowTop;
+
+ nSetLightCenter(mNativeProxy, lightX, lightY, mLightZ);
+ }
+
+ public RenderNode getRootNode() {
+ return mRootNode;
+ }
+
+ /**
+ * Draw the surface.
+ */
+ public void draw(final FrameDrawingCallback callback) {
+ final long vsync = AnimationUtils.currentAnimationTimeMillis() * 1000000L;
+ mFrameInfo.setVsync(vsync, vsync);
+ mFrameInfo.addFlags(1 << 2 /* VSYNC */);
+ if (callback != null) {
+ nSetFrameCallback(mNativeProxy, callback);
+ }
+ nSyncAndDrawFrame(mNativeProxy, mFrameInfo.mFrameInfo, mFrameInfo.mFrameInfo.length);
+ }
+
+ /**
+ * Destroy the renderer.
+ */
+ public void destroy() {
+ mSurface = null;
+ nDestroy(mNativeProxy, mRootNode.mNativeRenderNode);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ nDeleteProxy(mNativeProxy);
+ mNativeProxy = 0;
+ } finally {
+ super.finalize();
+ }
+ }
+ }
+
+ /**
+ * Interface used to receive callbacks when a frame is being drawn.
+ */
+ public interface FrameDrawingCallback {
+ /**
+ * Invoked during a frame drawing.
+ *
+ * @param frame The id of the frame being drawn.
+ */
+ void onFrameDraw(long frame);
+ }
+
private static class ProcessInitializer {
static ProcessInitializer sInstance = new ProcessInitializer();
@@ -970,7 +1081,10 @@
mAppContext = context.getApplicationContext();
initSched(renderProxy);
- initGraphicsStats();
+
+ if (mAppContext != null) {
+ initGraphicsStats();
+ }
}
private void initSched(long renderProxy) {
@@ -1085,6 +1199,7 @@
private static native void nDrawRenderNode(long nativeProxy, long rootRenderNode);
private static native void nSetContentDrawBounds(long nativeProxy, int left,
int top, int right, int bottom);
+ private static native void nSetFrameCallback(long nativeProxy, FrameDrawingCallback callback);
private static native long nAddFrameMetricsObserver(long nativeProxy, FrameMetricsObserver observer);
private static native void nRemoveFrameMetricsObserver(long nativeProxy, long nativeObserver);
@@ -1096,4 +1211,6 @@
private static native void nSetHighContrastText(boolean enabled);
// For temporary experimentation b/66945974
private static native void nHackySetRTAnimationsEnabled(boolean enabled);
+ private static native void nSetDebuggingEnabled(boolean enabled);
+ private static native void nSetIsolatedProcess(boolean enabled);
}