diff options
author | Chia-I Wu <olv@google.com> | 2018-06-21 15:52:50 +0800 |
---|---|---|
committer | Yichi Chen <yichichen@google.com> | 2018-08-17 02:19:29 +0000 |
commit | 99b4619cfeb1e8ed899ca0a4c72154be6263a98c (patch) | |
tree | 5029099efc427c57142e391139f9ad03bb7ade87 | |
parent | da1217f5fedc6e6ec9c4aed4f96be8b47ecf3ec4 (diff) | |
download | native-99b4619cfeb1e8ed899ca0a4c72154be6263a98c.tar.gz |
surfaceflinger: silence misleading virtual display errors
Do not call HWComposer::
getColorModes
getRenderIntents
getHdrCapabilities
getSupportedPerFrameMetadata
getLayerReleaseFence
when the display id is invalid. This happens with virtual displays
when mUseHwcVirtualDisplays is false.
Bug: 112082244
Test: screenrecord
Change-Id: Ifd8a85fc15e1628744bf21277bd8fe3e2c322e46
Merged-In: Ifd8a85fc15e1628744bf21277bd8fe3e2c322e46
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 19 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp | 3 |
2 files changed, 14 insertions, 8 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index cf53930fa1..d1cc3dcd78 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2180,11 +2180,15 @@ void SurfaceFlinger::postFramebuffer() displayDevice->onSwapBuffersCompleted(); displayDevice->makeCurrent(); for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { + sp<Fence> releaseFence = Fence::NO_FENCE; + // The layer buffer from the previous frame (if any) is released // by HWC only when the release fence from this frame (if any) is // signaled. Always get the release fence from HWC first. auto hwcLayer = layer->getHwcLayer(hwcId); - sp<Fence> releaseFence = getBE().mHwc->getLayerReleaseFence(hwcId, hwcLayer); + if (hwcId >= 0) { + releaseFence = getBE().mHwc->getLayerReleaseFence(hwcId, hwcLayer); + } // If the layer was client composited in the previous frame, we // need to merge with the previous client target acquire fence. @@ -2331,8 +2335,10 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal( const sp<DisplaySurface>& dispSurface, const sp<IGraphicBufferProducer>& producer) { bool hasWideColorGamut = false; std::unordered_map<ColorMode, std::vector<RenderIntent>> hwcColorModes; + HdrCapabilities hdrCapabilities; + int32_t supportedPerFrameMetadata = 0; - if (hasWideColorDisplay) { + if (hasWideColorDisplay && hwcId >= 0) { std::vector<ColorMode> modes = getHwComposer().getColorModes(hwcId); for (ColorMode colorMode : modes) { switch (colorMode) { @@ -2351,8 +2357,10 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal( } } - HdrCapabilities hdrCapabilities; - getHwComposer().getHdrCapabilities(hwcId, &hdrCapabilities); + if (hwcId >= 0) { + getHwComposer().getHdrCapabilities(hwcId, &hdrCapabilities); + supportedPerFrameMetadata = getHwComposer().getSupportedPerFrameMetadata(hwcId); + } auto nativeWindowSurface = mCreateNativeWindowSurface(producer); auto nativeWindow = nativeWindowSurface->getNativeWindow(); @@ -2386,8 +2394,7 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal( new DisplayDevice(this, state.type, hwcId, state.isSecure, display, nativeWindow, dispSurface, std::move(renderSurface), displayWidth, displayHeight, hasWideColorGamut, hdrCapabilities, - getHwComposer().getSupportedPerFrameMetadata(hwcId), - hwcColorModes, initialPowerMode); + supportedPerFrameMetadata, hwcColorModes, initialPowerMode); if (maxFrameBufferAcquiredBuffers >= 3) { nativeWindowSurface->preallocateBuffers(); diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index 9b308bfcc8..9ac5f3b73e 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -658,8 +658,7 @@ using NonHwcVirtualDisplayCase = using SimpleHwcVirtualDisplayVariant = HwcVirtualDisplayVariant<1024, 768, Secure::TRUE>; using HwcVirtualDisplayCase = Case<SimpleHwcVirtualDisplayVariant, WideColorSupportNotConfiguredVariant, - HdrNotSupportedVariant<SimpleHwcVirtualDisplayVariant>, - NoPerFrameMetadataSupportVariant<SimpleHwcVirtualDisplayVariant>>; + NonHwcDisplayHdrSupportVariant, NonHwcPerFrameMetadataSupportVariant>; using WideColorP3ColorimetricDisplayCase = Case<PrimaryDisplayVariant, WideColorP3ColorimetricSupportedVariant<PrimaryDisplayVariant>, HdrNotSupportedVariant<PrimaryDisplayVariant>, |