OSDN Git Service

[surfaceflinger] Set blend mode correctly when using HWC2.
authorDavid Reveman <reveman@google.com>
Fri, 3 Mar 2017 16:32:44 +0000 (11:32 -0500)
committerDavid Reveman <reveman@google.com>
Fri, 3 Mar 2017 16:42:47 +0000 (16:42 +0000)
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

index 24ebac7..c3f8665 100644 (file)
@@ -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<int32_t>(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<int32_t>(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,