From 0b19a7370a1121219cef2d34b69676e1dee4c547 Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 7 Mar 2019 17:18:25 -0800 Subject: [PATCH] Re-enable empty damage drop optimization Fixes: 113796161 Test: device seemed to behave correctly? Change-Id: Id43e1eaad29d07c06c1003c0653e5d1ee7084cfe --- libs/hwui/renderthread/CanvasContext.cpp | 23 ++++++++++++++++++----- libs/hwui/renderthread/CanvasContext.h | 1 + 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 8e57a3a119e3b..091775dbe7908 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -401,11 +401,11 @@ void CanvasContext::draw() { SkRect dirty; mDamageAccumulator.finish(&dirty); - // TODO: Re-enable after figuring out cause of b/22592975 - // if (dirty.isEmpty() && Properties::skipEmptyFrames) { - // mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); - // return; - // } + if (dirty.isEmpty() && Properties::skipEmptyFrames + && !surfaceRequiresRedraw()) { + mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); + return; + } mCurrentFrameInfo->markIssueDrawCommandsStart(); @@ -638,6 +638,19 @@ int64_t CanvasContext::getFrameNumber() { return mFrameNumber; } +bool CanvasContext::surfaceRequiresRedraw() { + if (!mNativeSurface) return false; + if (mHaveNewSurface) return true; + + int width = -1; + int height = -1; + ReliableSurface* surface = mNativeSurface.get(); + surface->query(NATIVE_WINDOW_WIDTH, &width); + surface->query(NATIVE_WINDOW_HEIGHT, &height); + + return width == mLastFrameWidth && height == mLastFrameHeight; +} + SkRect CanvasContext::computeDirtyRect(const Frame& frame, SkRect* dirty) { if (frame.width() != mLastFrameWidth || frame.height() != mLastFrameHeight) { // can't rely on prior content of window if viewport size changes diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index db97763acd8bc..4da0eac85bb0d 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -217,6 +217,7 @@ private: void freePrefetchedLayers(); bool isSwapChainStuffed(); + bool surfaceRequiresRedraw(); SkRect computeDirtyRect(const Frame& frame, SkRect* dirty);