Merge "Clean up HWC state when releasing a DisplayDevice" into jb-mr2-dev

This commit is contained in:
Jesse Hall 2013-04-04 22:36:10 +00:00 committed by Android (Google) Code Review
commit 6d5b8e600e
5 changed files with 38 additions and 17 deletions

View File

@ -143,6 +143,15 @@ DisplayDevice::~DisplayDevice() {
}
}
void DisplayDevice::disconnect(HWComposer& hwc) {
if (mHwcDisplayId >= 0) {
hwc.disconnectDisplay(mHwcDisplayId);
if (mHwcDisplayId >= DISPLAY_VIRTUAL)
hwc.freeDisplayId(mHwcDisplayId);
mHwcDisplayId = -1;
}
}
bool DisplayDevice::isValid() const {
return mFlinger != NULL;
}
@ -419,11 +428,11 @@ void DisplayDevice::dump(String8& result, char* buffer, size_t SIZE) const {
const Transform& tr(mGlobalTransform);
snprintf(buffer, SIZE,
"+ DisplayDevice: %s\n"
" type=%x, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
" type=%x, hwcId=%d, layerStack=%u, (%4dx%4d), ANativeWindow=%p, orient=%2d (type=%08x), "
"flips=%u, isSecure=%d, secureVis=%d, acquired=%d, numLayers=%u\n"
" v:[%d,%d,%d,%d], f:[%d,%d,%d,%d], s:[%d,%d,%d,%d],"
"transform:[[%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f][%0.3f,%0.3f,%0.3f]]\n",
mDisplayName.string(), mType,
mDisplayName.string(), mType, mHwcDisplayId,
mLayerStack, mDisplayWidth, mDisplayHeight, mNativeWindow.get(),
mOrientation, tr.getType(), getPageFlipCount(),
mIsSecure, mSecureLayerVisible, mScreenAcquired, mVisibleLayersSortedByZ.size(),

View File

@ -146,6 +146,9 @@ public:
bool isScreenAcquired() const;
bool canDraw() const;
// release HWC resources (if any) for removable displays
void disconnect(HWComposer& hwc);
/* ------------------------------------------------------------------------
* Debugging
*/

View File

@ -954,17 +954,17 @@ void HWComposer::dump(String8& result, char* buffer, size_t SIZE) const {
result.appendFormat(" mDebugForceFakeVSync=%d\n", mDebugForceFakeVSync);
for (size_t i=0 ; i<mNumDisplays ; i++) {
const DisplayData& disp(mDisplayData[i]);
if (!disp.connected)
continue;
const Vector< sp<Layer> >& visibleLayersSortedByZ =
mFlinger->getLayerSortedByZForHwcDisplay(i);
if (disp.connected) {
result.appendFormat(
" Display[%d] : %ux%u, xdpi=%f, ydpi=%f, refresh=%lld\n",
i, disp.width, disp.height, disp.xdpi, disp.ydpi, disp.refresh);
}
result.appendFormat(
" Display[%d] : %ux%u, xdpi=%f, ydpi=%f, refresh=%lld\n",
i, disp.width, disp.height, disp.xdpi, disp.ydpi, disp.refresh);
if (disp.list && disp.connected) {
if (disp.list) {
result.appendFormat(
" numHwLayers=%u, flags=%08x\n",
disp.list->numHwLayers, disp.list->flags);

View File

@ -1102,12 +1102,14 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
// Call makeCurrent() on the primary display so we can
// be sure that nothing associated with this display
// is current.
const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
mDisplays.removeItem(draw.keyAt(i));
getHwComposer().disconnectDisplay(draw[i].type);
const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
DisplayDevice::makeCurrent(mEGLDisplay, defaultDisplay, mEGLContext);
sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
if (hw != NULL)
hw->disconnect(getHwComposer());
if (draw[i].type < DisplayDevice::NUM_DISPLAY_TYPES)
mEventThread->onHotplugReceived(draw[i].type, false);
mDisplays.removeItem(draw.keyAt(i));
} else {
ALOGW("trying to remove the main display");
}
@ -1120,6 +1122,9 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
// recreating the DisplayDevice, so we just remove it
// from the drawing state, so that it get re-added
// below.
sp<DisplayDevice> hw(getDisplayDevice(display));
if (hw != NULL)
hw->disconnect(getHwComposer());
mDisplays.removeItem(display);
mDrawingState.displays.removeItemsAt(i);
dc--; i--;
@ -1150,9 +1155,13 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
const DisplayDeviceState& state(curr[i]);
sp<DisplaySurface> dispSurface;
int32_t hwcDisplayId = allocateHwcDisplayId(state.type);
int32_t hwcDisplayId = -1;
if (state.isVirtualDisplay()) {
// Virtual displays without a surface are dormant:
// they have external state (layer stack, projection,
// etc.) but no internal state (i.e. a DisplayDevice).
if (state.surface != NULL) {
hwcDisplayId = allocateHwcDisplayId(state.type);
dispSurface = new VirtualDisplaySurface(
*mHwc, hwcDisplayId, state.surface,
state.displayName);
@ -1162,7 +1171,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
"adding a supported display, but rendering "
"surface is provided (%p), ignoring it",
state.surface.get());
hwcDisplayId = allocateHwcDisplayId(state.type);
// for supported (by hwc) displays we provide our
// own rendering surface
dispSurface = new FramebufferSurface(*mHwc, state.type);

View File

@ -108,9 +108,6 @@ public:
// utility function to delete a texture on the main thread
void deleteTextureAsync(GLuint texture);
// allocate a h/w composer display id
int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type);
// enable/disable h/w composer event
// TODO: this should be made accessible only to EventThread
void eventControl(int disp, int event, int enabled);
@ -338,6 +335,9 @@ private:
// region of all screens presenting this layer stack.
void invalidateLayerStack(uint32_t layerStack, const Region& dirty);
// allocate a h/w composer display id
int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type);
/* ------------------------------------------------------------------------
* H/W composer
*/