diff options
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 13 | ||||
-rw-r--r-- | core/jni/android_view_Surface.cpp | 2 | ||||
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 20 | ||||
-rw-r--r-- | libs/hwui/JankTracker.cpp | 10 | ||||
-rw-r--r-- | libs/hwui/JankTracker.h | 7 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 5 | ||||
-rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 27 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 4 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 15 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.h | 7 | ||||
-rw-r--r-- | libs/hwui/tests/main.cpp | 2 |
14 files changed, 61 insertions, 56 deletions
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 69b4c47daad5..51fefe90f1aa 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -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; @@ -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); @@ -128,10 +126,6 @@ public class ThreadedRenderer extends HardwareRenderer { AtlasInitializer.sInstance.init(context, mNativeProxy); - // Setup timing - mChoreographer = Choreographer.getInstance(); - nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); - loadSystemProperties(); } @@ -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 @@ -379,6 +373,7 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void setName(String name) { + nSetName(mNativeProxy, name); } @Override @@ -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); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 39064ed22604..fff860474c55 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -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; } diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index ad933010c3e9..3d9a9eddd907 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -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); @@ -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, @@ -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 }, diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp index 46b094556ad7..7df61f272c44 100644 --- a/libs/hwui/JankTracker.cpp +++ b/libs/hwui/JankTracker.cpp @@ -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]++; @@ -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; } @@ -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; diff --git a/libs/hwui/JankTracker.h b/libs/hwui/JankTracker.h index 3d4929b215c6..ae339ecf746c 100644 --- a/libs/hwui/JankTracker.h +++ b/libs/hwui/JankTracker.h @@ -20,6 +20,7 @@ #include "renderthread/TimeLord.h" #include "utils/RingBuffer.h" +#include <array> #include <memory> namespace android { @@ -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; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index fcf6eb2ef537..945607345191 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -51,6 +51,7 @@ CanvasContext::CanvasContext(RenderThread& thread, bool translucent, , mRootRenderNode(rootRenderNode) , mCurrentFrameInfo(nullptr) { mRenderThread.renderState().registerCanvasContext(this); + mProfiler.setDensity(mRenderThread.mainDisplayInfo().density); } CanvasContext::~CanvasContext() { diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 9a60dc7cbbd1..c3904c2cf63f 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -33,6 +33,7 @@ #include <utils/Vector.h> #include <set> +#include <string> namespace android { namespace uirenderer { @@ -106,6 +107,9 @@ public: void dumpFrames(int fd); void resetFrameStats(); + void setName(const std::string&& name) { mName = name; } + const std::string& name() { return mName; } + private: friend class RegisterFrameCallbackTask; // TODO: Replace with something better for layer & other GL object @@ -139,6 +143,7 @@ private: FrameInfo* mCurrentFrameInfo; // Ring buffer large enough for 1 second worth of frames RingBuffer<FrameInfo, 60> mFrames; + std::string mName; std::set<RenderNode*> mPrefetechedLayers; }; diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index f48ee414871f..35391b27cc96 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -34,7 +34,6 @@ namespace renderthread { DrawFrameTask::DrawFrameTask() : mRenderThread(nullptr) , mContext(nullptr) - , mDensity(1.0f) // safe enough default , mSyncResult(kSync_OK) { } @@ -84,7 +83,6 @@ void DrawFrameTask::postAndWait() { void DrawFrameTask::run() { ATRACE_NAME("DrawFrame"); - mContext->profiler().setDensity(mDensity); mContext->profiler().startFrame(); bool canUnblockUiThread; diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index 0e56bea83169..8039643623b6 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -62,7 +62,6 @@ public: void pushLayerUpdate(DeferredLayerUpdater* layer); void removeLayerUpdate(DeferredLayerUpdater* layer); - void setDensity(float density) { mDensity = density; } int drawFrame(); int64_t* frameInfo() { return mFrameInfo; } @@ -83,7 +82,6 @@ private: /********************************************* * Single frame data *********************************************/ - float mDensity; std::vector< sp<DeferredLayerUpdater> > mLayers; int mSyncResult; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 0fa2f23b9752..ea4216c1c986 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -97,18 +97,6 @@ void RenderProxy::destroyContext() { } } -CREATE_BRIDGE2(setFrameInterval, RenderThread* thread, nsecs_t frameIntervalNanos) { - args->thread->setFrameInterval(args->frameIntervalNanos); - return nullptr; -} - -void RenderProxy::setFrameInterval(nsecs_t frameIntervalNanos) { - SETUP_TASK(setFrameInterval); - args->thread = &mRenderThread; - args->frameIntervalNanos = frameIntervalNanos; - post(task); -} - CREATE_BRIDGE2(setSwapBehavior, CanvasContext* context, SwapBehavior swapBehavior) { args->context->setSwapBehavior(args->swapBehavior); return nullptr; @@ -138,6 +126,18 @@ bool RenderProxy::loadSystemProperties() { return (bool) postAndWait(task); } +CREATE_BRIDGE2(setName, CanvasContext* context, const char* name) { + args->context->setName(std::string(args->name)); + return nullptr; +} + +void RenderProxy::setName(const char* name) { + SETUP_TASK(setName); + args->context = mContext; + args->name = name; + post(task); +} + CREATE_BRIDGE2(initialize, CanvasContext* context, ANativeWindow* window) { return (void*) args->context->initialize(args->window); } @@ -181,8 +181,7 @@ CREATE_BRIDGE7(setup, CanvasContext* context, int width, int height, } void RenderProxy::setup(int width, int height, const Vector3& lightCenter, float lightRadius, - uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha, float density) { - mDrawFrameTask.setDensity(density); + uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha) { SETUP_TASK(setup); args->context = mContext; args->width = width; diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 19e73e5be128..43cbe07cf99f 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -62,16 +62,16 @@ public: ANDROID_API RenderProxy(bool translucent, RenderNode* rootNode, IContextFactory* contextFactory); ANDROID_API virtual ~RenderProxy(); - ANDROID_API void setFrameInterval(nsecs_t frameIntervalNanos); // Won't take effect until next EGLSurface creation ANDROID_API void setSwapBehavior(SwapBehavior swapBehavior); ANDROID_API bool loadSystemProperties(); + ANDROID_API void setName(const char* name); ANDROID_API bool initialize(const sp<ANativeWindow>& window); ANDROID_API void updateSurface(const sp<ANativeWindow>& window); ANDROID_API bool pauseSurface(const sp<ANativeWindow>& window); ANDROID_API void setup(int width, int height, const Vector3& lightCenter, float lightRadius, - uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha, float density); + uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha); ANDROID_API void setOpaque(bool opaque); ANDROID_API int64_t* frameInfo(); ANDROID_API int syncAndDrawFrame(); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 2a8baa747c5d..3ac2976f97c6 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -22,6 +22,8 @@ #include "RenderProxy.h" #include <gui/DisplayEventReceiver.h> +#include <gui/ISurfaceComposer.h> +#include <gui/SurfaceComposerClient.h> #include <sys/resource.h> #include <utils/Log.h> @@ -151,11 +153,6 @@ RenderThread::~RenderThread() { LOG_ALWAYS_FATAL("Can't destroy the render thread"); } -void RenderThread::setFrameInterval(nsecs_t frameInterval) { - mTimeLord.setFrameInterval(frameInterval); - mJankTracker->setFrameInterval(frameInterval); -} - void RenderThread::initializeDisplayEventReceiver() { LOG_ALWAYS_FATAL_IF(mDisplayEventReceiver, "Initializing a second DisplayEventReceiver?"); mDisplayEventReceiver = new DisplayEventReceiver(); @@ -169,10 +166,16 @@ void RenderThread::initializeDisplayEventReceiver() { } void RenderThread::initThreadLocals() { + sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay( + ISurfaceComposer::eDisplayIdMain)); + status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &mDisplayInfo); + LOG_ALWAYS_FATAL_IF(status, "Failed to get display info\n"); + nsecs_t frameIntervalNanos = static_cast<nsecs_t>(1000000000 / mDisplayInfo.fps); + mTimeLord.setFrameInterval(frameIntervalNanos); initializeDisplayEventReceiver(); mEglManager = new EglManager(*this); mRenderState = new RenderState(*this); - mJankTracker = new JankTracker(mTimeLord.frameIntervalNanos()); + mJankTracker = new JankTracker(frameIntervalNanos); } int RenderThread::displayEventReceiverCallback(int fd, int events, void* data) { diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index f1694243b528..80960999ef53 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -23,6 +23,7 @@ #include "TimeLord.h" #include <cutils/compiler.h> +#include <ui/DisplayInfo.h> #include <utils/Looper.h> #include <utils/Mutex.h> #include <utils/Singleton.h> @@ -86,13 +87,13 @@ public: // the next vsync. If it is not currently registered this does nothing. void pushBackFrameCallback(IFrameCallback* callback); - void setFrameInterval(nsecs_t frameInterval); - TimeLord& timeLord() { return mTimeLord; } RenderState& renderState() { return *mRenderState; } EglManager& eglManager() { return *mEglManager; } JankTracker& jankTracker() { return *mJankTracker; } + const DisplayInfo& mainDisplayInfo() { return mDisplayInfo; } + protected: virtual bool threadLoop() override; @@ -122,6 +123,8 @@ private: nsecs_t mNextWakeup; TaskQueue mQueue; + DisplayInfo mDisplayInfo; + DisplayEventReceiver* mDisplayEventReceiver; bool mVsyncRequested; std::set<IFrameCallback*> mFrameCallbacks; diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp index 0d1e63ee7a62..805989b24f89 100644 --- a/libs/hwui/tests/main.cpp +++ b/libs/hwui/tests/main.cpp @@ -85,7 +85,7 @@ public: proxy->initialize(surface); float lightX = width / 2.0; proxy->setup(width, height, (Vector3){lightX, dp(-200.0f), dp(800.0f)}, - dp(800.0f), 255 * 0.075, 255 * 0.15, gDisplay.density); + dp(800.0f), 255 * 0.075, 255 * 0.15); android::uirenderer::Rect DUMMY; |