summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Prabir Pradhan <prabirmsp@google.com> 2021-11-18 08:55:02 -0800
committer Prabir Pradhan <prabirmsp@google.com> 2021-11-18 09:56:13 -0800
commit3f8b28918dac53c2418bf72b139a97a854a6626d (patch)
treeaf4e2defa934314ac9052dcc95537f3b5b620e73
parent38ddd45e3beb7d307a8b90e0b36062fbb9dc208d (diff)
SpriteController: Reparent SurfaceControls to null before disposing
Bug: 206650086 Test: manual: see repro insructions in the bug Change-Id: Ib8e39780002ecb74ade64791bdb98b8b9c969bce
-rw-r--r--libs/input/SpriteController.cpp19
-rw-r--r--libs/input/SpriteController.h4
2 files changed, 15 insertions, 8 deletions
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp
index da21438bafd1..2b809eab4ae4 100644
--- a/libs/input/SpriteController.cpp
+++ b/libs/input/SpriteController.cpp
@@ -70,8 +70,8 @@ void SpriteController::closeTransaction() {
}
void SpriteController::invalidateSpriteLocked(const sp<SpriteImpl>& sprite) {
- bool wasEmpty = mLocked.invalidatedSprites.isEmpty();
- mLocked.invalidatedSprites.push(sprite);
+ bool wasEmpty = mLocked.invalidatedSprites.empty();
+ mLocked.invalidatedSprites.push_back(sprite);
if (wasEmpty) {
if (mLocked.transactionNestingCount != 0) {
mLocked.deferredSpriteUpdate = true;
@@ -82,8 +82,8 @@ void SpriteController::invalidateSpriteLocked(const sp<SpriteImpl>& sprite) {
}
void SpriteController::disposeSurfaceLocked(const sp<SurfaceControl>& surfaceControl) {
- bool wasEmpty = mLocked.disposedSurfaces.isEmpty();
- mLocked.disposedSurfaces.push(surfaceControl);
+ bool wasEmpty = mLocked.disposedSurfaces.empty();
+ mLocked.disposedSurfaces.push_back(surfaceControl);
if (wasEmpty) {
mLooper->sendMessage(mHandler, Message(MSG_DISPOSE_SURFACES));
}
@@ -113,7 +113,7 @@ void SpriteController::doUpdateSprites() {
numSprites = mLocked.invalidatedSprites.size();
for (size_t i = 0; i < numSprites; i++) {
- const sp<SpriteImpl>& sprite = mLocked.invalidatedSprites.itemAt(i);
+ const sp<SpriteImpl>& sprite = mLocked.invalidatedSprites[i];
updates.push(SpriteUpdate(sprite, sprite->getStateLocked()));
sprite->resetDirtyLocked();
@@ -305,7 +305,7 @@ void SpriteController::doUpdateSprites() {
void SpriteController::doDisposeSurfaces() {
// Collect disposed surfaces.
- Vector<sp<SurfaceControl> > disposedSurfaces;
+ std::vector<sp<SurfaceControl>> disposedSurfaces;
{ // acquire lock
AutoMutex _l(mLock);
@@ -313,6 +313,13 @@ void SpriteController::doDisposeSurfaces() {
mLocked.disposedSurfaces.clear();
} // release lock
+ // Remove the parent from all surfaces.
+ SurfaceComposerClient::Transaction t;
+ for (const sp<SurfaceControl>& sc : disposedSurfaces) {
+ t.reparent(sc, nullptr);
+ }
+ t.apply();
+
// Release the last reference to each surface outside of the lock.
// We don't want the surfaces to be deleted while we are holding our lock.
disposedSurfaces.clear();
diff --git a/libs/input/SpriteController.h b/libs/input/SpriteController.h
index 2a80d9579711..2e9cb9685c46 100644
--- a/libs/input/SpriteController.h
+++ b/libs/input/SpriteController.h
@@ -251,8 +251,8 @@ private:
sp<SurfaceComposerClient> mSurfaceComposerClient;
struct Locked {
- Vector<sp<SpriteImpl> > invalidatedSprites;
- Vector<sp<SurfaceControl> > disposedSurfaces;
+ std::vector<sp<SpriteImpl>> invalidatedSprites;
+ std::vector<sp<SurfaceControl>> disposedSurfaces;
uint32_t transactionNestingCount;
bool deferredSpriteUpdate;
} mLocked; // guarded by mLock