Loading libs/hwui/renderthread/RenderThread.cpp +15 −11 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ namespace renderthread { static const size_t EVENT_BUFFER_SIZE = 100; // Slight delay to give the UI time to push us a new frame before we replay static const int DISPATCH_FRAME_CALLBACKS_DELAY = 4; static const nsecs_t DISPATCH_FRAME_CALLBACKS_DELAY = milliseconds_to_nanoseconds(4); TaskQueue::TaskQueue() : mHead(0), mTail(0) {} Loading Loading @@ -209,16 +209,16 @@ static nsecs_t latestVsyncEvent(DisplayEventReceiver* receiver) { return latest; } void RenderThread::drainDisplayEventQueue(bool skipCallbacks) { void RenderThread::drainDisplayEventQueue() { ATRACE_CALL(); nsecs_t vsyncEvent = latestVsyncEvent(mDisplayEventReceiver); if (vsyncEvent > 0) { mVsyncRequested = false; mTimeLord.vsyncReceived(vsyncEvent); if (!skipCallbacks && !mFrameCallbackTaskPending) { if (mTimeLord.vsyncReceived(vsyncEvent) && !mFrameCallbackTaskPending) { ATRACE_NAME("queue mFrameCallbackTask"); mFrameCallbackTaskPending = true; queueDelayed(mFrameCallbackTask, DISPATCH_FRAME_CALLBACKS_DELAY); nsecs_t runAt = (vsyncEvent + DISPATCH_FRAME_CALLBACKS_DELAY); queueAt(mFrameCallbackTask, runAt); } } } Loading @@ -230,10 +230,15 @@ void RenderThread::dispatchFrameCallbacks() { std::set<IFrameCallback*> callbacks; mFrameCallbacks.swap(callbacks); if (callbacks.size()) { // Assume one of them will probably animate again so preemptively // request the next vsync in case it occurs mid-frame requestVsync(); for (std::set<IFrameCallback*>::iterator it = callbacks.begin(); it != callbacks.end(); it++) { (*it)->doFrame(); } } } void RenderThread::requestVsync() { if (!mVsyncRequested) { Loading Loading @@ -273,7 +278,7 @@ bool RenderThread::threadLoop() { } if (mPendingRegistrationFrameCallbacks.size() && !mFrameCallbackTaskPending) { drainDisplayEventQueue(true); drainDisplayEventQueue(); mFrameCallbacks.insert( mPendingRegistrationFrameCallbacks.begin(), mPendingRegistrationFrameCallbacks.end()); mPendingRegistrationFrameCallbacks.clear(); Loading @@ -299,9 +304,8 @@ void RenderThread::queueAtFront(RenderTask* task) { mLooper->wake(); } void RenderThread::queueDelayed(RenderTask* task, int delayMs) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); task->mRunAt = now + milliseconds_to_nanoseconds(delayMs); void RenderThread::queueAt(RenderTask* task, nsecs_t runAtNs) { task->mRunAt = runAtNs; queue(task); } Loading libs/hwui/renderthread/RenderThread.h +2 −2 Original line number Diff line number Diff line Loading @@ -75,7 +75,7 @@ public: // and will delete them after they are run ANDROID_API void queue(RenderTask* task); ANDROID_API void queueAtFront(RenderTask* task); void queueDelayed(RenderTask* task, int delayMs); void queueAt(RenderTask* task, nsecs_t runAtNs); void remove(RenderTask* task); // Mimics android.view.Choreographer Loading Loading @@ -103,7 +103,7 @@ private: void initThreadLocals(); void initializeDisplayEventReceiver(); static int displayEventReceiverCallback(int fd, int events, void* data); void drainDisplayEventQueue(bool skipCallbacks = false); void drainDisplayEventQueue(); void dispatchFrameCallbacks(); void requestVsync(); Loading libs/hwui/renderthread/TimeLord.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -24,10 +24,12 @@ TimeLord::TimeLord() , mFrameTimeNanos(0) { } void TimeLord::vsyncReceived(nsecs_t vsync) { bool TimeLord::vsyncReceived(nsecs_t vsync) { if (vsync > mFrameTimeNanos) { mFrameTimeNanos = vsync; return true; } return false; } nsecs_t TimeLord::computeFrameTimeMs() { Loading libs/hwui/renderthread/TimeLord.h +2 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,8 @@ class RenderThread; class TimeLord { public: void setFrameInterval(nsecs_t intervalNanos) { mFrameIntervalNanos = intervalNanos; } void vsyncReceived(nsecs_t vsync); // returns true if the vsync is newer, false if it was rejected for staleness bool vsyncReceived(nsecs_t vsync); nsecs_t computeFrameTimeMs(); private: Loading Loading
libs/hwui/renderthread/RenderThread.cpp +15 −11 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ namespace renderthread { static const size_t EVENT_BUFFER_SIZE = 100; // Slight delay to give the UI time to push us a new frame before we replay static const int DISPATCH_FRAME_CALLBACKS_DELAY = 4; static const nsecs_t DISPATCH_FRAME_CALLBACKS_DELAY = milliseconds_to_nanoseconds(4); TaskQueue::TaskQueue() : mHead(0), mTail(0) {} Loading Loading @@ -209,16 +209,16 @@ static nsecs_t latestVsyncEvent(DisplayEventReceiver* receiver) { return latest; } void RenderThread::drainDisplayEventQueue(bool skipCallbacks) { void RenderThread::drainDisplayEventQueue() { ATRACE_CALL(); nsecs_t vsyncEvent = latestVsyncEvent(mDisplayEventReceiver); if (vsyncEvent > 0) { mVsyncRequested = false; mTimeLord.vsyncReceived(vsyncEvent); if (!skipCallbacks && !mFrameCallbackTaskPending) { if (mTimeLord.vsyncReceived(vsyncEvent) && !mFrameCallbackTaskPending) { ATRACE_NAME("queue mFrameCallbackTask"); mFrameCallbackTaskPending = true; queueDelayed(mFrameCallbackTask, DISPATCH_FRAME_CALLBACKS_DELAY); nsecs_t runAt = (vsyncEvent + DISPATCH_FRAME_CALLBACKS_DELAY); queueAt(mFrameCallbackTask, runAt); } } } Loading @@ -230,10 +230,15 @@ void RenderThread::dispatchFrameCallbacks() { std::set<IFrameCallback*> callbacks; mFrameCallbacks.swap(callbacks); if (callbacks.size()) { // Assume one of them will probably animate again so preemptively // request the next vsync in case it occurs mid-frame requestVsync(); for (std::set<IFrameCallback*>::iterator it = callbacks.begin(); it != callbacks.end(); it++) { (*it)->doFrame(); } } } void RenderThread::requestVsync() { if (!mVsyncRequested) { Loading Loading @@ -273,7 +278,7 @@ bool RenderThread::threadLoop() { } if (mPendingRegistrationFrameCallbacks.size() && !mFrameCallbackTaskPending) { drainDisplayEventQueue(true); drainDisplayEventQueue(); mFrameCallbacks.insert( mPendingRegistrationFrameCallbacks.begin(), mPendingRegistrationFrameCallbacks.end()); mPendingRegistrationFrameCallbacks.clear(); Loading @@ -299,9 +304,8 @@ void RenderThread::queueAtFront(RenderTask* task) { mLooper->wake(); } void RenderThread::queueDelayed(RenderTask* task, int delayMs) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); task->mRunAt = now + milliseconds_to_nanoseconds(delayMs); void RenderThread::queueAt(RenderTask* task, nsecs_t runAtNs) { task->mRunAt = runAtNs; queue(task); } Loading
libs/hwui/renderthread/RenderThread.h +2 −2 Original line number Diff line number Diff line Loading @@ -75,7 +75,7 @@ public: // and will delete them after they are run ANDROID_API void queue(RenderTask* task); ANDROID_API void queueAtFront(RenderTask* task); void queueDelayed(RenderTask* task, int delayMs); void queueAt(RenderTask* task, nsecs_t runAtNs); void remove(RenderTask* task); // Mimics android.view.Choreographer Loading Loading @@ -103,7 +103,7 @@ private: void initThreadLocals(); void initializeDisplayEventReceiver(); static int displayEventReceiverCallback(int fd, int events, void* data); void drainDisplayEventQueue(bool skipCallbacks = false); void drainDisplayEventQueue(); void dispatchFrameCallbacks(); void requestVsync(); Loading
libs/hwui/renderthread/TimeLord.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -24,10 +24,12 @@ TimeLord::TimeLord() , mFrameTimeNanos(0) { } void TimeLord::vsyncReceived(nsecs_t vsync) { bool TimeLord::vsyncReceived(nsecs_t vsync) { if (vsync > mFrameTimeNanos) { mFrameTimeNanos = vsync; return true; } return false; } nsecs_t TimeLord::computeFrameTimeMs() { Loading
libs/hwui/renderthread/TimeLord.h +2 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,8 @@ class RenderThread; class TimeLord { public: void setFrameInterval(nsecs_t intervalNanos) { mFrameIntervalNanos = intervalNanos; } void vsyncReceived(nsecs_t vsync); // returns true if the vsync is newer, false if it was rejected for staleness bool vsyncReceived(nsecs_t vsync); nsecs_t computeFrameTimeMs(); private: Loading