summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp2
-rw-r--r--libs/hwui/renderthread/EglManager.cpp4
-rw-r--r--libs/hwui/renderthread/EglManager.h4
3 files changed, 9 insertions, 1 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 4f528b1a3cd1..249d83f50627 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -476,7 +476,7 @@ void CanvasContext::draw() {
// metrics the frame was swapped at this point
mCurrentFrameInfo->markSwapBuffers();
- if (drew) {
+ if (drew || mEglManager.damageRequiresSwap()) {
if (CC_UNLIKELY(!mEglManager.swapBuffers(frame, screenDirty))) {
setSurface(nullptr);
}
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 364d4dda1e7f..ac6a28fe6289 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -324,6 +324,10 @@ void EglManager::damageFrame(const Frame& frame, const SkRect& dirty) {
#endif
}
+bool EglManager::damageRequiresSwap() {
+ return EglExtensions.setDamage && mSwapBehavior == SwapBehavior::BufferAge;
+}
+
bool EglManager::swapBuffers(const Frame& frame, const SkRect& screenDirty) {
if (CC_UNLIKELY(Properties::waitForGpuCompletion)) {
diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h
index 62b5b99a6e30..459baed70e40 100644
--- a/libs/hwui/renderthread/EglManager.h
+++ b/libs/hwui/renderthread/EglManager.h
@@ -70,6 +70,10 @@ public:
bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr);
Frame beginFrame(EGLSurface surface);
void damageFrame(const Frame& frame, const SkRect& dirty);
+ // If this returns true it is mandatory that swapBuffers is called
+ // if damageFrame is called without subsequent calls to damageFrame().
+ // See EGL_KHR_partial_update for more information
+ bool damageRequiresSwap();
bool swapBuffers(const Frame& frame, const SkRect& screenDirty);
// Returns true iff the surface is now preserving buffers.