summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olv@google.com>2018-06-21 15:52:50 +0800
committerYichi Chen <yichichen@google.com>2018-08-17 02:19:29 +0000
commit99b4619cfeb1e8ed899ca0a4c72154be6263a98c (patch)
tree5029099efc427c57142e391139f9ad03bb7ade87
parentda1217f5fedc6e6ec9c4aed4f96be8b47ecf3ec4 (diff)
downloadnative-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.cpp19
-rw-r--r--services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp3
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>,