From ecf0fa5340c54757870881c5d24eb331c517d78c Mon Sep 17 00:00:00 2001 From: David Reveman Date: Fri, 3 Mar 2017 11:32:44 -0500 Subject: [PATCH] [surfaceflinger] Set blend mode correctly when using HWC2. HWC1 code will reset blend mode to None using setDefaultState() but HWC2 just leaves the layer in the previous state. The result is that once blend mode is set to something other than HWC2::BlendMode::None we can never go back to HWC2::BlendMode::None and HWC2 implementations are forced to use blending when not necessary. Bug: 35915184 Test: manually verified using overdraw feedback on arc enabled chromebook Change-Id: I86957439bad0a1be9faa56df491d8415c4cdd2c2 --- services/surfaceflinger/Layer.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 24ebac7bca..c3f86652ca 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -604,14 +604,15 @@ void Layer::setGeometry( // this gives us only the "orientation" component of the transform const State& s(getDrawingState()); #ifdef USE_HWC2 + auto blendMode = HWC2::BlendMode::None; if (!isOpaque(s) || s.alpha != 1.0f) { - auto blendMode = mPremultipliedAlpha ? + blendMode = mPremultipliedAlpha ? HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; - auto error = hwcLayer->setBlendMode(blendMode); - ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" - " %s (%d)", mName.string(), to_string(blendMode).c_str(), - to_string(error).c_str(), static_cast(error)); } + auto error = hwcLayer->setBlendMode(blendMode); + ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" + " %s (%d)", mName.string(), to_string(blendMode).c_str(), + to_string(error).c_str(), static_cast(error)); #else if (!isOpaque(s) || s.alpha != 0xFF) { layer.setBlending(mPremultipliedAlpha ? @@ -666,7 +667,7 @@ void Layer::setGeometry( } const Transform& tr(displayDevice->getTransform()); Rect transformedFrame = tr.transform(frame); - auto error = hwcLayer->setDisplayFrame(transformedFrame); + error = hwcLayer->setDisplayFrame(transformedFrame); if (error != HWC2::Error::None) { ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", mName.string(), transformedFrame.left, transformedFrame.top, -- 2.11.0