diff options
author | John Reck <jreck@google.com> | 2014-05-22 15:43:54 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2014-05-23 12:56:38 -0700 |
commit | a5dda645da738da7b4ae15e28fa7d93d3b04b94f (patch) | |
tree | 5ce51af907c91030662b69c37e8ece7a63e041ed /libs/hwui/renderthread/DrawFrameTask.cpp | |
parent | d30241541c3adcb126bb263ad8596e7902a6b5ae (diff) |
Bag of scheduling tweaks
Bug: 15118640
* Prevent over-stuffing the queue by dropping frames
* Prevent double-drawing in one pulse by RT by deferring
vsync registration until post-draw so that it catches
the next vsync pulse instead of the current one
* Bias vsync race condition towards the UI thread
* Fix queueDelay to actually work
Change-Id: Ibf584258bd93ebcbba058bd976dc8b307f1c6155
Diffstat (limited to 'libs/hwui/renderthread/DrawFrameTask.cpp')
-rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 3b8786c3fb94..ee3e059908d0 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -87,7 +87,13 @@ void DrawFrameTask::postAndWait() { void DrawFrameTask::run() { ATRACE_NAME("DrawFrame"); - bool canUnblockUiThread = syncFrameState(); + bool canUnblockUiThread; + bool canDrawThisFrame; + { + TreeInfo info; + canUnblockUiThread = syncFrameState(info); + canDrawThisFrame = info.out.canDrawThisFrame; + } // Grab a copy of everything we need Rect dirty(mDirty); @@ -98,7 +104,9 @@ void DrawFrameTask::run() { unblockUiThread(); } - context->draw(&dirty); + if (CC_LIKELY(canDrawThisFrame)) { + context->draw(&dirty); + } if (!canUnblockUiThread) { unblockUiThread(); @@ -111,12 +119,11 @@ static void initTreeInfo(TreeInfo& info) { info.evaluateAnimations = true; } -bool DrawFrameTask::syncFrameState() { +bool DrawFrameTask::syncFrameState(TreeInfo& info) { ATRACE_CALL(); mRenderThread->timeLord().vsyncReceived(mFrameTimeNanos); mContext->makeCurrent(); Caches::getInstance().textureCache.resetMarkInUse(); - TreeInfo info; initTreeInfo(info); mContext->prepareDraw(&mLayers, info); if (info.out.hasAnimations) { |