summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2013-05-23 12:47:26 -0700
committerRomain Guy <romainguy@google.com>2013-05-23 12:50:13 -0700
commite9bc11f7121dbe373b0cbe5779ee6a12d824492c (patch)
tree0da7d9e380841202b3df300341321fed984a9c0c /core/java/android
parente0fc1875492cf1e59fe3ae4e0b1a5020672962bb (diff)
Add PerfHUD ES profiling capabilities
The eglGetSystemTimeNV extension can be used to enable profiling in PerfHUD ES. When the delta of two calls to eglGetSystemTimeNV equals 0, we now cancels display lists updates. This allows the tool to redraw the same frame several times in a row to run its analysis. For better results profiling should only be attempted after setting viewroot.profile_rendering to true using adb shell setprop. Change-Id: I02e3c237418004cff8d6cb0b9a37126efae44c90
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/HardwareRenderer.java29
-rw-r--r--core/java/android/view/ViewRootImpl.java2
2 files changed, 26 insertions, 5 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index e8c165367274..8dada90d2150 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -406,6 +406,17 @@ public abstract class HardwareRenderer {
private static native void nBeginFrame(int[] size);
/**
+ * Returns the current system time according to the renderer.
+ * This method is used for debugging only and should not be used
+ * as a clock.
+ */
+ static long getSystemTime() {
+ return nGetSystemTime();
+ }
+
+ private static native long nGetSystemTime();
+
+ /**
* Preserves the back buffer of the current surface after a buffer swap.
* Calling this method sets the EGL_SWAP_BEHAVIOR attribute of the current
* surface to EGL_BUFFER_PRESERVED. Calling this method requires an EGL
@@ -852,6 +863,8 @@ public abstract class HardwareRenderer {
private final int[] mSurfaceSize = new int[2];
private final FunctorsRunnable mFunctorsRunnable = new FunctorsRunnable();
+ private long mDrawDelta = Long.MAX_VALUE;
+
GlRenderer(int glVersion, boolean translucent) {
mGlVersion = glVersion;
mTranslucent = translucent;
@@ -1413,6 +1426,7 @@ public abstract class HardwareRenderer {
int saveCount = 0;
int status = DisplayList.STATUS_DONE;
+ long start = getSystemTime();
try {
status = prepareFrame(dirty);
@@ -1432,12 +1446,15 @@ public abstract class HardwareRenderer {
canvas.restoreToCount(saveCount);
view.mRecreateDisplayList = false;
- debugOverdraw(attachInfo, dirty, canvas, displayList);
+ mDrawDelta = getSystemTime() - start;
- mFrameCount++;
+ if (mDrawDelta > 0) {
+ mFrameCount++;
- debugDirtyRegions(dirty, canvas);
- drawProfileData(attachInfo);
+ debugOverdraw(attachInfo, dirty, canvas, displayList);
+ debugDirtyRegions(dirty, canvas);
+ drawProfileData(attachInfo);
+ }
}
onPostDraw();
@@ -1509,6 +1526,10 @@ public abstract class HardwareRenderer {
}
private DisplayList buildDisplayList(View view, HardwareCanvas canvas) {
+ if (mDrawDelta <= 0) {
+ return view.mDisplayList;
+ }
+
view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED)
== View.PFLAG_INVALIDATED;
view.mPrivateFlags &= ~View.PFLAG_INVALIDATED;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index fc005d169ef9..8462c80f2c70 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -111,7 +111,7 @@ public final class ViewRootImpl implements ViewParent,
* Set this system property to true to force the view hierarchy to render
* at 60 Hz. This can be used to measure the potential framerate.
*/
- private static final String PROPERTY_PROFILE_RENDERING = "viewancestor.profile_rendering";
+ private static final String PROPERTY_PROFILE_RENDERING = "viewroot.profile_rendering";
private static final String PROPERTY_MEDIA_DISABLED = "config.disable_media";
/**