Re-enable empty damage drop optimization
Fixes: 113796161
Test: device seemed to behave correctly?
Change-Id: Id43e1eaad29d07c06c1003c0653e5d1ee7084cfe
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 8e57a3a..091775dbe7 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -401,11 +401,11 @@
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 @@
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 db97763..4da0eac 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -217,6 +217,7 @@
void freePrefetchedLayers();
bool isSwapChainStuffed();
+ bool surfaceRequiresRedraw();
SkRect computeDirtyRect(const Frame& frame, SkRect* dirty);