Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61f142a2 authored by Andy McFadden's avatar Andy McFadden Committed by Android Git Automerger
Browse files

am 27ec5739: Fix crashes after HDMI disconnect

* commit '27ec5739':
  Fix crashes after HDMI disconnect
parents af4324cc 27ec5739
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -540,8 +540,13 @@ status_t HWComposer::prepare() {
            // DO NOT reset the handle field to NULL, because it's possible
            // that we have nothing to redraw (eg: eglSwapBuffers() not called)
            // in which case, we should continue to use the same buffer.
            LOG_FATAL_IF(disp.list == NULL);
            disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET;
        }
        if (!disp.connected && disp.list != NULL) {
            ALOGW("WARNING: disp %d: connected, non-null list, layers=%d",
                  i, disp.list->numHwLayers);
        }
        mLists[i] = disp.list;
        if (mLists[i]) {
            if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_2)) {
@@ -664,6 +669,17 @@ status_t HWComposer::acquire(int disp) const {
    return NO_ERROR;
}

void HWComposer::disconnectDisplay(int disp) {
    LOG_ALWAYS_FATAL_IF(disp < 0 || disp == HWC_DISPLAY_PRIMARY ||
                        disp >= HWC_NUM_DISPLAY_TYPES);
    DisplayData& dd(mDisplayData[disp]);
    if (dd.list != NULL) {
        free(dd.list);
        dd.list = NULL;
        dd.framebufferTarget = NULL;    // points into dd.list
    }
}

int HWComposer::getVisualID() const {
    if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
        // FIXME: temporary hack until HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
+3 −0
Original line number Diff line number Diff line
@@ -97,6 +97,9 @@ public:
    // acquire hardware resources and unblank screen
    status_t acquire(int disp) const;

    // reset state when an external, non-virtual display is disconnected
    void disconnectDisplay(int disp);

    // create a work list for numLayers layer. sets HWC_GEOMETRY_CHANGED.
    status_t createWorkList(int32_t id, size_t numLayers);

+6 −0
Original line number Diff line number Diff line
@@ -1123,7 +1123,13 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                if (j < 0) {
                    // in drawing state but not in current state
                    if (!draw[i].isMainDisplay()) {
                        // 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);
                    } else {
                        ALOGW("trying to remove the main display");
                    }