diff options
author | John Reck <jreck@google.com> | 2016-04-18 11:17:52 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2016-04-18 11:29:35 -0700 |
commit | 9a17da8125c36c82ba73e7f4b3ed80b9c633767f (patch) | |
tree | ff3412c792110b31f7a0a31611cef862a32400a1 /libs/hwui/renderthread/DrawFrameTask.cpp | |
parent | 7d0b8d792886b2ed5ff89ac6c2723fba9d44c7d4 (diff) |
Don't reuse LOST_SURFACE for stopped
Fixes: 28218991
If a draw() happens while we are stopped, don't report
that the surface is lost because this will prompt
a tear-down of the surface which isn't desired. It can
result in ViewRootImpl ending up in an internally-bad state
in this case.
Change-Id: If3eb8c6bc8702299e5330bc0917952624dce3b7e
Diffstat (limited to 'libs/hwui/renderthread/DrawFrameTask.cpp')
-rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index ed472ac4bd02..c9c07b3df292 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -32,7 +32,7 @@ namespace renderthread { DrawFrameTask::DrawFrameTask() : mRenderThread(nullptr) , mContext(nullptr) - , mSyncResult(kSync_OK) { + , mSyncResult(SyncResult::OK) { } DrawFrameTask::~DrawFrameTask() { @@ -68,7 +68,7 @@ void DrawFrameTask::removeLayerUpdate(DeferredLayerUpdater* layer) { int DrawFrameTask::drawFrame(TreeObserver* observer) { LOG_ALWAYS_FATAL_IF(!mContext, "Cannot drawFrame with no CanvasContext!"); - mSyncResult = kSync_OK; + mSyncResult = SyncResult::OK; mSyncQueued = systemTime(CLOCK_MONOTONIC); mObserver = observer; postAndWait(); @@ -127,13 +127,18 @@ bool DrawFrameTask::syncFrameState(TreeInfo& info) { // This is after the prepareTree so that any pending operations // (RenderNode tree state, prefetched layers, etc...) will be flushed. if (CC_UNLIKELY(!mContext->hasSurface() || !canDraw)) { - mSyncResult |= kSync_LostSurfaceRewardIfFound; + if (!mContext->hasSurface()) { + mSyncResult |= SyncResult::LostSurfaceRewardIfFound; + } else { + // If we have a surface but can't draw we must be stopped + mSyncResult |= SyncResult::ContextIsStopped; + } info.out.canDrawThisFrame = false; } if (info.out.hasAnimations) { if (info.out.requiresUiRedraw) { - mSyncResult |= kSync_UIRedrawRequired; + mSyncResult |= SyncResult::UIRedrawRequired; } } // If prepareTextures is false, we ran out of texture cache space |