From 3cf4bfe2368020b50a3e22360910b6af6590c5be Mon Sep 17 00:00:00 2001 From: Dan Stoza Date: Tue, 2 Aug 2016 10:27:31 -0700 Subject: [PATCH] DO NOT MERGE SF: Add property to disable HWC virtual displays Adds the property debug.sf.disable_hwc_vds, which will disable the use of Hardware Composer virtual displays inside SurfaceFlinger (falling back to SurfaceFlinger management and client composition of such displays). Also adds a Binder debug interface for controlling this behavior. Bug: 30510632 Change-Id: I2c1a199213a24195b144bfa0c0f1679f2dfd0668 --- services/surfaceflinger/SurfaceFlinger.cpp | 51 +++++++++++++++---------- services/surfaceflinger/SurfaceFlinger.h | 1 + services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 14 ++++++- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 820c332a9c..3ec3cc2686 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -183,6 +183,10 @@ SurfaceFlinger::SurfaceFlinger() property_get("debug.sf.disable_backpressure", value, "0"); mPropagateBackpressure = !atoi(value); ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation"); + + property_get("debug.sf.disable_hwc_vds", value, "0"); + mUseHwcVirtualDisplays = !atoi(value); + ALOGI_IF(!mUseHwcVirtualDisplays, "Disabling HWC virtual displays"); } void SurfaceFlinger::onFirstRef() @@ -1582,26 +1586,28 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) // etc.) but no internal state (i.e. a DisplayDevice). if (state.surface != NULL) { - int width = 0; - int status = state.surface->query( - NATIVE_WINDOW_WIDTH, &width); - ALOGE_IF(status != NO_ERROR, - "Unable to query width (%d)", status); - int height = 0; - status = state.surface->query( - NATIVE_WINDOW_HEIGHT, &height); - ALOGE_IF(status != NO_ERROR, - "Unable to query height (%d)", status); - int intFormat = 0; - status = state.surface->query( - NATIVE_WINDOW_FORMAT, &intFormat); - ALOGE_IF(status != NO_ERROR, - "Unable to query format (%d)", status); - auto format = static_cast( - intFormat); - - mHwc->allocateVirtualDisplay(width, height, &format, - &hwcId); + if (mUseHwcVirtualDisplays) { + int width = 0; + int status = state.surface->query( + NATIVE_WINDOW_WIDTH, &width); + ALOGE_IF(status != NO_ERROR, + "Unable to query width (%d)", status); + int height = 0; + status = state.surface->query( + NATIVE_WINDOW_HEIGHT, &height); + ALOGE_IF(status != NO_ERROR, + "Unable to query height (%d)", status); + int intFormat = 0; + status = state.surface->query( + NATIVE_WINDOW_FORMAT, &intFormat); + ALOGE_IF(status != NO_ERROR, + "Unable to query format (%d)", status); + auto format = static_cast( + intFormat); + + mHwc->allocateVirtualDisplay(width, height, &format, + &hwcId); + } // TODO: Plumb requested format back up to consumer @@ -3277,6 +3283,11 @@ status_t SurfaceFlinger::onTransact( mSFEventThread->setPhaseOffset(static_cast(n)); return NO_ERROR; } + case 1021: { // Disable HWC virtual displays + n = data.readInt32(); + mUseHwcVirtualDisplays = !n; + return NO_ERROR; + } } } return err; diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index f50f9e7918..65e0cbf811 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -529,6 +529,7 @@ private: #ifdef USE_HWC2 bool mPropagateBackpressure = true; #endif + bool mUseHwcVirtualDisplays = true; // these are thread safe mutable MessageQueue mEventQueue; diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index 34240b4dd3..3a65e85463 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -181,6 +181,10 @@ SurfaceFlinger::SurfaceFlinger() } ALOGI_IF(mDebugRegion, "showupdates enabled"); ALOGI_IF(mDebugDDMS, "DDMS debugging enabled"); + + property_get("debug.sf.disable_hwc_vds", value, "0"); + mUseHwcVirtualDisplays = !atoi(value); + ALOGI_IF(!mUseHwcVirtualDisplays, "Disabling HWC virtual displays"); } void SurfaceFlinger::onFirstRef() @@ -1508,9 +1512,10 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) NATIVE_WINDOW_HEIGHT, &height); ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status); - if (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 || + if (mUseHwcVirtualDisplays && + (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 || (width <= MAX_VIRTUAL_DISPLAY_DIMENSION && - height <= MAX_VIRTUAL_DISPLAY_DIMENSION)) { + height <= MAX_VIRTUAL_DISPLAY_DIMENSION))) { hwcDisplayId = allocateHwcDisplayId(state.type); } @@ -3191,6 +3196,11 @@ status_t SurfaceFlinger::onTransact( mSFEventThread->setPhaseOffset(static_cast(n)); return NO_ERROR; } + case 1021: { // Disable HWC virtual displays + n = data.readInt32(); + mUseHwcVirtualDisplays = !n; + return NO_ERROR; + } } } return err; -- 2.11.0