Merge "SpriteController: Reparent SurfaceControls to null before disposing"
This commit is contained in:
committed by
Android (Google) Code Review
commit
ef292d27a0
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user