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);