From 9f8386e1118c10dd4927f62637ec7162569bdbdc Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 29 Jan 2013 18:56:42 -0800 Subject: [PATCH] Add support for plane-alpha in HWC Change-Id: I218e7dd5f23de535aabce61e993002ab6cb46cdd --- .../surfaceflinger/DisplayHardware/HWComposer.cpp | 39 ++++++++++++++-------- .../surfaceflinger/DisplayHardware/HWComposer.h | 1 + services/surfaceflinger/Layer.cpp | 9 ++--- services/surfaceflinger/LayerBase.cpp | 2 +- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 3bb9ec4872..8e73467f79 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -782,9 +782,10 @@ private: * This implements the HWCLayer side of HWCIterableLayer. */ class HWCLayerVersion1 : public Iterable { + struct hwc_composer_device_1* mHwc; public: - HWCLayerVersion1(hwc_layer_1_t* layer) - : Iterable(layer) { } + HWCLayerVersion1(struct hwc_composer_device_1* hwc, hwc_layer_1_t* layer) + : Iterable(layer), mHwc(hwc) { } virtual int32_t getCompositionType() const { return getLayer()->compositionType; @@ -800,17 +801,29 @@ public: virtual void setAcquireFenceFd(int fenceFd) { getLayer()->acquireFenceFd = fenceFd; } + virtual void setPerFrameDefaultState() { + //getLayer()->compositionType = HWC_FRAMEBUFFER; + } + virtual void setPlaneAlpha(uint8_t alpha) { + if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_2)) { + getLayer()->planeAlpha = alpha; + } else { + getLayer()->flags |= HWC_SKIP_LAYER; + } + } virtual void setDefaultState() { - getLayer()->compositionType = HWC_FRAMEBUFFER; - getLayer()->hints = 0; - getLayer()->flags = HWC_SKIP_LAYER; - getLayer()->handle = 0; - getLayer()->transform = 0; - getLayer()->blending = HWC_BLENDING_NONE; - getLayer()->visibleRegionScreen.numRects = 0; - getLayer()->visibleRegionScreen.rects = NULL; - getLayer()->acquireFenceFd = -1; - getLayer()->releaseFenceFd = -1; + hwc_layer_1_t* const l = getLayer(); + l->compositionType = HWC_FRAMEBUFFER; + l->hints = 0; + l->flags = HWC_SKIP_LAYER; + l->handle = 0; + l->transform = 0; + l->blending = HWC_BLENDING_NONE; + l->visibleRegionScreen.numRects = 0; + l->visibleRegionScreen.rects = NULL; + l->acquireFenceFd = -1; + l->releaseFenceFd = -1; + l->planeAlpha = 0xFF; } virtual void setSkip(bool skip) { if (skip) { @@ -873,7 +886,7 @@ HWComposer::LayerListIterator HWComposer::getLayerIterator(int32_t id, size_t in if (!mHwc || !disp.list || index > disp.list->numHwLayers) { return LayerListIterator(); } - return LayerListIterator(new HWCLayerVersion1(disp.list->hwLayers), index); + return LayerListIterator(new HWCLayerVersion1(mHwc, disp.list->hwLayers), index); } /* diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index 1e7ec21cd4..05f7784352 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -152,6 +152,7 @@ public: virtual void setVisibleRegionScreen(const Region& reg) = 0; virtual void setBuffer(const sp& buffer) = 0; virtual void setAcquireFenceFd(int fenceFd) = 0; + virtual void setPlaneAlpha(uint8_t alpha) = 0; virtual void onDisplayed() = 0; }; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index f94a9ba7ee..95a5e029e2 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -251,16 +251,13 @@ void Layer::setGeometry( // enable this layer layer.setSkip(false); - // we can't do alpha-fade with the hwc HAL - const State& s(drawingState()); - if (s.alpha < 0xFF) { - layer.setSkip(true); - } - if (isSecure() && !hw->isSecure()) { layer.setSkip(true); } + const State& s(drawingState()); + layer.setPlaneAlpha(s.alpha); + /* * Transformations are applied in this order: * 1) buffer orientation/flip/mirror diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index f129607398..54c51bb5d4 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -283,7 +283,7 @@ void LayerBase::setGeometry( layer.setTransform(finalTransform); } - if (!isOpaque()) { + if (!isOpaque() || s.alpha != 0xFF) { layer.setBlending(mPremultipliedAlpha ? HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE); -- 2.11.0