diff options
Diffstat (limited to 'libs/hwui')
| -rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 8 | ||||
| -rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.h | 6 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 4 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 1 |
4 files changed, 19 insertions, 0 deletions
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 8372331c0352..778e7689d0f9 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -94,12 +94,20 @@ void DrawFrameTask::run() { // Grab a copy of everything we need CanvasContext* context = mContext; + std::function<void(int64_t)> callback = std::move(mFrameCallback); // From this point on anything in "this" is *UNSAFE TO ACCESS* if (canUnblockUiThread) { unblockUiThread(); } + // Even if we aren't drawing this vsync pulse the next frame number will still be accurate + if (CC_UNLIKELY(callback)) { + context->enqueueFrameWork([callback, frameNr = context->getFrameNumber()]() { + callback(frameNr); + }); + } + if (CC_LIKELY(canDrawThisFrame)) { context->draw(); } else { diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index ea51ae4a42b7..d8c43e0d8ca8 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -74,6 +74,10 @@ public: void run(); + void setFrameCallback(std::function<void(int64_t)>&& callback) { + mFrameCallback = std::move(callback); + } + private: void postAndWait(); bool syncFrameState(TreeInfo& info); @@ -96,6 +100,8 @@ private: int64_t mSyncQueued; int64_t mFrameInfo[UI_THREAD_FRAME_INFO_SIZE]; + + std::function<void(int64_t)> mFrameCallback; }; } /* namespace renderthread */ diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 79e46ed9e65f..4be7a57daedf 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -270,6 +270,10 @@ void RenderProxy::setContentDrawBounds(int left, int top, int right, int bottom) mDrawFrameTask.setContentDrawBounds(left, top, right, bottom); } +void RenderProxy::setFrameCallback(std::function<void(int64_t)>&& callback) { + mDrawFrameTask.setFrameCallback(std::move(callback)); +} + void RenderProxy::serializeDisplayListTree() { mRenderThread.queue().post([=]() { mContext->serializeDisplayListTree(); }); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index bc57d9255ad5..3425c5c68a72 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -115,6 +115,7 @@ public: ANDROID_API void removeRenderNode(RenderNode* node); ANDROID_API void drawRenderNode(RenderNode* node); ANDROID_API void setContentDrawBounds(int left, int top, int right, int bottom); + ANDROID_API void setFrameCallback(std::function<void(int64_t)>&& callback); ANDROID_API void addFrameMetricsObserver(FrameMetricsObserver* observer); ANDROID_API void removeFrameMetricsObserver(FrameMetricsObserver* observer); |