Loading core/java/android/view/ThreadedRenderer.java +4 −9 Original line number Diff line number Diff line Loading @@ -102,7 +102,6 @@ public class ThreadedRenderer extends HardwareRenderer { private final float mLightRadius; private final int mAmbientShadowAlpha; private final int mSpotShadowAlpha; private final float mDensity; private long mNativeProxy; private boolean mInitialized = false; Loading @@ -119,7 +118,6 @@ public class ThreadedRenderer extends HardwareRenderer { (int) (255 * a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0) + 0.5f); mSpotShadowAlpha = (int) (255 * a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0) + 0.5f); a.recycle(); mDensity = context.getResources().getDisplayMetrics().density; long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); Loading @@ -128,10 +126,6 @@ public class ThreadedRenderer extends HardwareRenderer { AtlasInitializer.sInstance.init(context, mNativeProxy); // Setup timing mChoreographer = Choreographer.getInstance(); nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); loadSystemProperties(); } Loading Loading @@ -224,7 +218,7 @@ public class ThreadedRenderer extends HardwareRenderer { mRootNode.setLeftTopRightBottom(-mInsetLeft, -mInsetTop, mSurfaceWidth, mSurfaceHeight); nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, lightX, mLightY, mLightZ, mLightRadius, mAmbientShadowAlpha, mSpotShadowAlpha, mDensity); mAmbientShadowAlpha, mSpotShadowAlpha); } @Override Loading Loading @@ -379,6 +373,7 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void setName(String name) { nSetName(mNativeProxy, name); } @Override Loading Loading @@ -487,15 +482,15 @@ public class ThreadedRenderer extends HardwareRenderer { private static native long nCreateProxy(boolean translucent, long rootRenderNode); private static native void nDeleteProxy(long nativeProxy); private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); private static native boolean nLoadSystemProperties(long nativeProxy); private static native void nSetName(long nativeProxy, String name); private static native boolean nInitialize(long nativeProxy, Surface window); 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 density); int ambientShadowAlpha, int spotShadowAlpha); 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/jni/android_view_Surface.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -489,7 +489,7 @@ 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, 1.0f); proxy->setup(0, 0, (Vector3){0, 0, 0}, 0, 0, 0); return (jlong) proxy; } Loading core/jni/android_view_ThreadedRenderer.cpp +11 −9 Original line number Diff line number Diff line Loading @@ -239,18 +239,20 @@ static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz delete proxy; } static void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, jlong proxyPtr, jlong frameIntervalNanos) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setFrameInterval(frameIntervalNanos); } static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, jlong proxyPtr) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); return proxy->loadSystemProperties(); } static void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz, jlong proxyPtr, jstring jname) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); const char* name = env->GetStringUTFChars(jname, NULL); proxy->setName(name); env->ReleaseStringUTFChars(jname, name); } static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); Loading Loading @@ -284,7 +286,7 @@ static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlon jint ambientShadowAlpha, jint spotShadowAlpha, jfloat density) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setup(width, height, (Vector3){lightX, lightY, lightZ}, lightRadius, ambientShadowAlpha, spotShadowAlpha, density); ambientShadowAlpha, spotShadowAlpha); } static void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, Loading Loading @@ -424,12 +426,12 @@ static JNINativeMethod gMethods[] = { { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName }, { "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", "(JIIFFFFIIF)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup }, { "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 libs/hwui/JankTracker.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -97,8 +97,8 @@ void JankTracker::addFrame(const FrameInfo& frame) { int64_t totalDuration = frame[FrameInfoIndex::kFrameCompleted] - frame[FrameInfoIndex::kIntendedVsync]; uint32_t framebucket = std::min( static_cast<typeof sizeof(mFrameCounts)>(ns2ms(totalDuration)), sizeof(mFrameCounts) / sizeof(mFrameCounts[0])); static_cast<typeof mFrameCounts.size()>(ns2ms(totalDuration)), mFrameCounts.size()); // Keep the fast path as fast as possible. if (CC_LIKELY(totalDuration < mFrameInterval)) { mFrameCounts[framebucket]++; Loading Loading @@ -137,8 +137,8 @@ void JankTracker::dump(int fd) { } void JankTracker::reset() { memset(mBuckets, 0, sizeof(mBuckets)); memset(mFrameCounts, 0, sizeof(mFrameCounts)); mBuckets.fill({0}); mFrameCounts.fill(0); mTotalFrameCount = 0; mJankFrameCount = 0; } Loading @@ -146,7 +146,7 @@ void JankTracker::reset() { uint32_t JankTracker::findPercentile(int percentile) { int pos = percentile * mTotalFrameCount / 100; int remaining = mTotalFrameCount - pos; for (int i = sizeof(mFrameCounts) / sizeof(mFrameCounts[0]) - 1; i >= 0; i--) { for (int i = mFrameCounts.size() - 1; i >= 0; i--) { remaining -= mFrameCounts[i]; if (remaining <= 0) { return i; Loading libs/hwui/JankTracker.h +4 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "renderthread/TimeLord.h" #include "utils/RingBuffer.h" #include <array> #include <memory> namespace android { Loading Loading @@ -56,9 +57,9 @@ public: private: uint32_t findPercentile(int p); JankBucket mBuckets[NUM_BUCKETS]; int64_t mThresholds[NUM_BUCKETS]; uint32_t mFrameCounts[128]; std::array<JankBucket, NUM_BUCKETS> mBuckets; std::array<int64_t, NUM_BUCKETS> mThresholds; std::array<uint32_t, 128> mFrameCounts; int64_t mFrameInterval; uint32_t mTotalFrameCount; Loading Loading
core/java/android/view/ThreadedRenderer.java +4 −9 Original line number Diff line number Diff line Loading @@ -102,7 +102,6 @@ public class ThreadedRenderer extends HardwareRenderer { private final float mLightRadius; private final int mAmbientShadowAlpha; private final int mSpotShadowAlpha; private final float mDensity; private long mNativeProxy; private boolean mInitialized = false; Loading @@ -119,7 +118,6 @@ public class ThreadedRenderer extends HardwareRenderer { (int) (255 * a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0) + 0.5f); mSpotShadowAlpha = (int) (255 * a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0) + 0.5f); a.recycle(); mDensity = context.getResources().getDisplayMetrics().density; long rootNodePtr = nCreateRootRenderNode(); mRootNode = RenderNode.adopt(rootNodePtr); Loading @@ -128,10 +126,6 @@ public class ThreadedRenderer extends HardwareRenderer { AtlasInitializer.sInstance.init(context, mNativeProxy); // Setup timing mChoreographer = Choreographer.getInstance(); nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); loadSystemProperties(); } Loading Loading @@ -224,7 +218,7 @@ public class ThreadedRenderer extends HardwareRenderer { mRootNode.setLeftTopRightBottom(-mInsetLeft, -mInsetTop, mSurfaceWidth, mSurfaceHeight); nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, lightX, mLightY, mLightZ, mLightRadius, mAmbientShadowAlpha, mSpotShadowAlpha, mDensity); mAmbientShadowAlpha, mSpotShadowAlpha); } @Override Loading Loading @@ -379,6 +373,7 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void setName(String name) { nSetName(mNativeProxy, name); } @Override Loading Loading @@ -487,15 +482,15 @@ public class ThreadedRenderer extends HardwareRenderer { private static native long nCreateProxy(boolean translucent, long rootRenderNode); private static native void nDeleteProxy(long nativeProxy); private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); private static native boolean nLoadSystemProperties(long nativeProxy); private static native void nSetName(long nativeProxy, String name); private static native boolean nInitialize(long nativeProxy, Surface window); 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 density); int ambientShadowAlpha, int spotShadowAlpha); 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/jni/android_view_Surface.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -489,7 +489,7 @@ 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, 1.0f); proxy->setup(0, 0, (Vector3){0, 0, 0}, 0, 0, 0); return (jlong) proxy; } Loading
core/jni/android_view_ThreadedRenderer.cpp +11 −9 Original line number Diff line number Diff line Loading @@ -239,18 +239,20 @@ static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz delete proxy; } static void android_view_ThreadedRenderer_setFrameInterval(JNIEnv* env, jobject clazz, jlong proxyPtr, jlong frameIntervalNanos) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setFrameInterval(frameIntervalNanos); } static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, jlong proxyPtr) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); return proxy->loadSystemProperties(); } static void android_view_ThreadedRenderer_setName(JNIEnv* env, jobject clazz, jlong proxyPtr, jstring jname) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); const char* name = env->GetStringUTFChars(jname, NULL); proxy->setName(name); env->ReleaseStringUTFChars(jname, name); } static jboolean android_view_ThreadedRenderer_initialize(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); Loading Loading @@ -284,7 +286,7 @@ static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlon jint ambientShadowAlpha, jint spotShadowAlpha, jfloat density) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); proxy->setup(width, height, (Vector3){lightX, lightY, lightZ}, lightRadius, ambientShadowAlpha, spotShadowAlpha, density); ambientShadowAlpha, spotShadowAlpha); } static void android_view_ThreadedRenderer_setOpaque(JNIEnv* env, jobject clazz, Loading Loading @@ -424,12 +426,12 @@ static JNINativeMethod gMethods[] = { { "nCreateRootRenderNode", "()J", (void*) android_view_ThreadedRenderer_createRootRenderNode }, { "nCreateProxy", "(ZJ)J", (void*) android_view_ThreadedRenderer_createProxy }, { "nDeleteProxy", "(J)V", (void*) android_view_ThreadedRenderer_deleteProxy }, { "nSetFrameInterval", "(JJ)V", (void*) android_view_ThreadedRenderer_setFrameInterval }, { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, { "nSetName", "(JLjava/lang/String;)V", (void*) android_view_ThreadedRenderer_setName }, { "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", "(JIIFFFFIIF)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup }, { "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
libs/hwui/JankTracker.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -97,8 +97,8 @@ void JankTracker::addFrame(const FrameInfo& frame) { int64_t totalDuration = frame[FrameInfoIndex::kFrameCompleted] - frame[FrameInfoIndex::kIntendedVsync]; uint32_t framebucket = std::min( static_cast<typeof sizeof(mFrameCounts)>(ns2ms(totalDuration)), sizeof(mFrameCounts) / sizeof(mFrameCounts[0])); static_cast<typeof mFrameCounts.size()>(ns2ms(totalDuration)), mFrameCounts.size()); // Keep the fast path as fast as possible. if (CC_LIKELY(totalDuration < mFrameInterval)) { mFrameCounts[framebucket]++; Loading Loading @@ -137,8 +137,8 @@ void JankTracker::dump(int fd) { } void JankTracker::reset() { memset(mBuckets, 0, sizeof(mBuckets)); memset(mFrameCounts, 0, sizeof(mFrameCounts)); mBuckets.fill({0}); mFrameCounts.fill(0); mTotalFrameCount = 0; mJankFrameCount = 0; } Loading @@ -146,7 +146,7 @@ void JankTracker::reset() { uint32_t JankTracker::findPercentile(int percentile) { int pos = percentile * mTotalFrameCount / 100; int remaining = mTotalFrameCount - pos; for (int i = sizeof(mFrameCounts) / sizeof(mFrameCounts[0]) - 1; i >= 0; i--) { for (int i = mFrameCounts.size() - 1; i >= 0; i--) { remaining -= mFrameCounts[i]; if (remaining <= 0) { return i; Loading
libs/hwui/JankTracker.h +4 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "renderthread/TimeLord.h" #include "utils/RingBuffer.h" #include <array> #include <memory> namespace android { Loading Loading @@ -56,9 +57,9 @@ public: private: uint32_t findPercentile(int p); JankBucket mBuckets[NUM_BUCKETS]; int64_t mThresholds[NUM_BUCKETS]; uint32_t mFrameCounts[128]; std::array<JankBucket, NUM_BUCKETS> mBuckets; std::array<int64_t, NUM_BUCKETS> mThresholds; std::array<uint32_t, 128> mFrameCounts; int64_t mFrameInterval; uint32_t mTotalFrameCount; Loading