diff options
Diffstat (limited to 'libs/hwui/renderthread/DrawFrameTask.cpp')
-rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index a097272df359..778e7689d0f9 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -33,21 +33,20 @@ DrawFrameTask::DrawFrameTask() : mRenderThread(nullptr) , mContext(nullptr) , mContentDrawBounds(0, 0, 0, 0) - , mSyncResult(SyncResult::OK) { -} + , mSyncResult(SyncResult::OK) {} -DrawFrameTask::~DrawFrameTask() { -} +DrawFrameTask::~DrawFrameTask() {} void DrawFrameTask::setContext(RenderThread* thread, CanvasContext* context, - RenderNode* targetNode) { + RenderNode* targetNode) { mRenderThread = thread; mContext = context; mTargetNode = targetNode; } void DrawFrameTask::pushLayerUpdate(DeferredLayerUpdater* layer) { - LOG_ALWAYS_FATAL_IF(!mContext, "Lifecycle violation, there's no context to pushLayerUpdate with!"); + LOG_ALWAYS_FATAL_IF(!mContext, + "Lifecycle violation, there's no context to pushLayerUpdate with!"); for (size_t i = 0; i < mLayers.size(); i++) { if (mLayers[i].get() == layer) { @@ -78,7 +77,7 @@ int DrawFrameTask::drawFrame() { void DrawFrameTask::postAndWait() { AutoMutex _lock(mLock); - mRenderThread->queue(this); + mRenderThread->queue().post([this]() { run(); }); mSignal.wait(mLock); } @@ -95,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 { |