am db9b41fd
: fix a corruption in blank/unblank
* commit 'db9b41fd157279d1b988a854e0d7c5b43c2fac38': fix a corruption in blank/unblank
This commit is contained in:
commit
179c4db2c3
@ -507,7 +507,7 @@ status_t SurfaceFlinger::readyToRun()
|
|||||||
// or when a texture is (asynchronously) destroyed, and for that
|
// or when a texture is (asynchronously) destroyed, and for that
|
||||||
// we need a valid surface, so it's convenient to use the main display
|
// we need a valid surface, so it's convenient to use the main display
|
||||||
// for that.
|
// for that.
|
||||||
sp<const DisplayDevice> hw = getDefaultDisplayDevice();
|
sp<const DisplayDevice> hw(getDefaultDisplayDevice());
|
||||||
|
|
||||||
// initialize OpenGL ES
|
// initialize OpenGL ES
|
||||||
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
|
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
|
||||||
@ -1126,7 +1126,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
|
|||||||
// Call makeCurrent() on the primary display so we can
|
// Call makeCurrent() on the primary display so we can
|
||||||
// be sure that nothing associated with this display
|
// be sure that nothing associated with this display
|
||||||
// is current.
|
// is current.
|
||||||
const sp<const DisplayDevice>& hw(getDefaultDisplayDevice());
|
const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
|
||||||
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
|
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
|
||||||
mDisplays.removeItem(draw.keyAt(i));
|
mDisplays.removeItem(draw.keyAt(i));
|
||||||
getHwComposer().disconnectDisplay(draw[i].type);
|
getHwComposer().disconnectDisplay(draw[i].type);
|
||||||
@ -1150,7 +1150,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sp<DisplayDevice>& disp(getDisplayDevice(display));
|
const sp<DisplayDevice> disp(getDisplayDevice(display));
|
||||||
if (disp != NULL) {
|
if (disp != NULL) {
|
||||||
if (state.layerStack != draw[i].layerStack) {
|
if (state.layerStack != draw[i].layerStack) {
|
||||||
disp->setLayerStack(state.layerStack);
|
disp->setLayerStack(state.layerStack);
|
||||||
@ -2043,48 +2043,48 @@ void SurfaceFlinger::onScreenReleased(const sp<const DisplayDevice>& hw) {
|
|||||||
|
|
||||||
void SurfaceFlinger::unblank(const sp<IBinder>& display) {
|
void SurfaceFlinger::unblank(const sp<IBinder>& display) {
|
||||||
class MessageScreenAcquired : public MessageBase {
|
class MessageScreenAcquired : public MessageBase {
|
||||||
SurfaceFlinger* mFlinger;
|
SurfaceFlinger& mFlinger;
|
||||||
const sp<DisplayDevice>& mHw;
|
sp<IBinder> mDisplay;
|
||||||
public:
|
public:
|
||||||
MessageScreenAcquired(SurfaceFlinger* flinger,
|
MessageScreenAcquired(SurfaceFlinger& flinger,
|
||||||
const sp<DisplayDevice>& hw) : mFlinger(flinger), mHw(hw) { }
|
const sp<IBinder>& disp) : mFlinger(flinger), mDisplay(disp) { }
|
||||||
virtual bool handler() {
|
virtual bool handler() {
|
||||||
mFlinger->onScreenAcquired(mHw);
|
const sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const sp<DisplayDevice>& hw = getDisplayDevice(display);
|
|
||||||
if (hw == NULL) {
|
if (hw == NULL) {
|
||||||
ALOGE("Attempt to unblank null display %p", display.get());
|
ALOGE("Attempt to unblank null display %p", mDisplay.get());
|
||||||
} else if (hw->getDisplayType() >= DisplayDevice::NUM_DISPLAY_TYPES) {
|
} else if (hw->getDisplayType() >= DisplayDevice::NUM_DISPLAY_TYPES) {
|
||||||
ALOGW("Attempt to unblank virtual display");
|
ALOGW("Attempt to unblank virtual display");
|
||||||
} else {
|
} else {
|
||||||
sp<MessageBase> msg = new MessageScreenAcquired(this, hw);
|
mFlinger.onScreenAcquired(hw);
|
||||||
postMessageSync(msg);
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
sp<MessageBase> msg = new MessageScreenAcquired(*this, display);
|
||||||
|
postMessageSync(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SurfaceFlinger::blank(const sp<IBinder>& display) {
|
void SurfaceFlinger::blank(const sp<IBinder>& display) {
|
||||||
class MessageScreenReleased : public MessageBase {
|
class MessageScreenReleased : public MessageBase {
|
||||||
SurfaceFlinger* mFlinger;
|
SurfaceFlinger& mFlinger;
|
||||||
const sp<DisplayDevice>& mHw;
|
sp<IBinder> mDisplay;
|
||||||
public:
|
public:
|
||||||
MessageScreenReleased(SurfaceFlinger* flinger,
|
MessageScreenReleased(SurfaceFlinger& flinger,
|
||||||
const sp<DisplayDevice>& hw) : mFlinger(flinger), mHw(hw) { }
|
const sp<IBinder>& disp) : mFlinger(flinger), mDisplay(disp) { }
|
||||||
virtual bool handler() {
|
virtual bool handler() {
|
||||||
mFlinger->onScreenReleased(mHw);
|
const sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const sp<DisplayDevice>& hw = getDisplayDevice(display);
|
|
||||||
if (hw == NULL) {
|
if (hw == NULL) {
|
||||||
ALOGE("Attempt to blank null display %p", display.get());
|
ALOGE("Attempt to blank null display %p", mDisplay.get());
|
||||||
} else if (hw->getDisplayType() >= DisplayDevice::NUM_DISPLAY_TYPES) {
|
} else if (hw->getDisplayType() >= DisplayDevice::NUM_DISPLAY_TYPES) {
|
||||||
ALOGW("Attempt to blank virtual display");
|
ALOGW("Attempt to blank virtual display");
|
||||||
} else {
|
} else {
|
||||||
sp<MessageBase> msg = new MessageScreenReleased(this, hw);
|
mFlinger.onScreenReleased(hw);
|
||||||
postMessageSync(msg);
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
sp<MessageBase> msg = new MessageScreenReleased(*this, display);
|
||||||
|
postMessageSync(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@ -2359,6 +2359,7 @@ void SurfaceFlinger::dumpAllLocked(
|
|||||||
|
|
||||||
const Vector< sp<LayerBase> >&
|
const Vector< sp<LayerBase> >&
|
||||||
SurfaceFlinger::getLayerSortedByZForHwcDisplay(int disp) {
|
SurfaceFlinger::getLayerSortedByZForHwcDisplay(int disp) {
|
||||||
|
// Note: mStateLock is held here
|
||||||
return getDisplayDevice( getBuiltInDisplay(disp) )->getVisibleLayersSortedByZ();
|
return getDisplayDevice( getBuiltInDisplay(disp) )->getVisibleLayersSortedByZ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,10 +327,13 @@ private:
|
|||||||
// called when starting, or restarting after system_server death
|
// called when starting, or restarting after system_server death
|
||||||
void initializeDisplays();
|
void initializeDisplays();
|
||||||
|
|
||||||
|
// NOTE: can only be called from the main thread or with mStateLock held
|
||||||
sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const {
|
sp<const DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) const {
|
||||||
return mDisplays.valueFor(dpy);
|
return mDisplays.valueFor(dpy);
|
||||||
}
|
}
|
||||||
const sp<DisplayDevice>& getDisplayDevice(const wp<IBinder>& dpy) {
|
|
||||||
|
// NOTE: can only be called from the main thread or with mStateLock held
|
||||||
|
sp<DisplayDevice> getDisplayDevice(const wp<IBinder>& dpy) {
|
||||||
return mDisplays.valueFor(dpy);
|
return mDisplays.valueFor(dpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,6 +428,9 @@ private:
|
|||||||
State mDrawingState;
|
State mDrawingState;
|
||||||
bool mVisibleRegionsDirty;
|
bool mVisibleRegionsDirty;
|
||||||
bool mHwWorkListDirty;
|
bool mHwWorkListDirty;
|
||||||
|
|
||||||
|
// this may only be written from the main thread with mStateLock held
|
||||||
|
// it may be read from other threads with mStateLock held
|
||||||
DefaultKeyedVector< wp<IBinder>, sp<DisplayDevice> > mDisplays;
|
DefaultKeyedVector< wp<IBinder>, sp<DisplayDevice> > mDisplays;
|
||||||
|
|
||||||
// don't use a lock for these, we don't care
|
// don't use a lock for these, we don't care
|
||||||
|
Loading…
Reference in New Issue
Block a user