summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
author Dan Stoza <stoza@google.com> 2018-04-12 11:45:09 -0700
committer Dan Stoza <stoza@google.com> 2018-04-12 12:01:55 -0700
commitc7a25adf66b138de66814383540905b83cf12a01 (patch)
tree731fdd8569b2f725168d0a1b90fbe5fb5f7418a9 /services/surfaceflinger/SurfaceFlinger.cpp
parentf0747473495c6d72cdad96baf04f5c0807daf32b (diff)
SF: Fix repaint everything logic
This solves the same problem with dirty regions not being updated as Ia7a3dc15c96626a213c4459dac4f695d91540fb5, but it is better in a couple of ways: 1) It no longer updates dirty regions from a binder thread, which was likely causing the memory corruption in b/77919748. 2) It removes the distinction between repaintEverything and repaintEverythingLocked, which is not necessary since both operations in repaintEverything (updating an atomic and signaling a transaction) are threadsafe. Bug: 77335744 Bug: 77546473 Bug: 77919748 Test: Manual - on an ASAN build, played TouchLatency bouncy ball while toggling between GL and HWC composition; doesn't crash whereas it would crash in a matter of a couple minutes before Change-Id: Iecadfecb40e87e400a301de2dcad1664e154982d
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp19
1 files changed, 4 insertions, 15 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a8680e2dd8..726d155586 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1387,7 +1387,7 @@ void SurfaceFlinger::onRefreshReceived(int sequenceId,
if (sequenceId != getBE().mComposerSequenceId) {
return;
}
- repaintEverythingLocked();
+ repaintEverything();
}
void SurfaceFlinger::setVsyncEnabled(int disp, int enabled) {
@@ -1949,7 +1949,7 @@ void SurfaceFlinger::setUpHWComposer() {
ALOGV("setUpHWComposer");
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
- bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
+ bool dirty = !mDisplays[dpy]->getDirtyRegion(mRepaintEverything).isEmpty();
bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
@@ -3716,7 +3716,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
mVisibleRegionsDirty = true;
mHasPoweredOff = true;
- repaintEverythingLocked();
+ repaintEverything();
struct sched_param param = {0};
param.sched_priority = 1;
@@ -4637,22 +4637,11 @@ status_t SurfaceFlinger::onTransact(
return err;
}
-void SurfaceFlinger::repaintEverythingLocked() {
+void SurfaceFlinger::repaintEverything() {
android_atomic_or(1, &mRepaintEverything);
- for (size_t dpy = 0; dpy < mDisplays.size(); dpy++) {
- const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);
- const Rect bounds(displayDevice->getBounds());
- displayDevice->dirtyRegion.orSelf(Region(bounds));
- }
signalTransaction();
}
-void SurfaceFlinger::repaintEverything() {
- ConditionalLock _l(mStateLock,
- std::this_thread::get_id() != mMainThreadId);
- repaintEverythingLocked();
-}
-
// A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
class WindowDisconnector {
public: