Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66a7233a authored by Steve Kondik's avatar Steve Kondik
Browse files

surfaceflinger: Enable blur for HWC1

 * Apparently there are actually two copies of Surfaceflinger now.

Change-Id: If16e9228bafd272d1542ac6c55b0fb6adb1bff20
parent 3ffe7e23
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@
#include "EventThread.h"
#include "Layer.h"
#include "LayerDim.h"
#include "LayerBlur.h"
#include "SurfaceFlinger.h"

#include "DisplayHardware/FramebufferSurface.h"
@@ -2338,6 +2339,41 @@ uint32_t SurfaceFlinger::setClientStateLocked(
                flags |= eTransactionNeeded|eTraversalNeeded;
            }
        }
        if (what & layer_state_t::eBlurChanged) {
            ALOGV("eBlurChanged");
            if (layer->setBlur(uint8_t(255.0f*s.blur+0.5f))) {
                flags |= eTraversalNeeded;
            }
        }
        if (what & layer_state_t::eBlurMaskSurfaceChanged) {
            ALOGV("eBlurMaskSurfaceChanged");
            sp<Layer> maskLayer = 0;
            if (s.blurMaskSurface != 0) {
                maskLayer = client->getLayerUser(s.blurMaskSurface);
            }
            if (maskLayer == 0) {
                ALOGV("eBlurMaskSurfaceChanged. maskLayer == 0");
            } else {
                ALOGV("eBlurMaskSurfaceChagned. maskLayer.z == %d", maskLayer->getCurrentState().z);
                if (maskLayer->isBlurLayer()) {
                    ALOGE("Blur layer can not be used as blur mask surface");
                    maskLayer = 0;
                }
            }
            if (layer->setBlurMaskLayer(maskLayer)) {
                flags |= eTraversalNeeded;
            }
        }
        if (what & layer_state_t::eBlurMaskSamplingChanged) {
            if (layer->setBlurMaskSampling(s.blurMaskSampling)) {
                flags |= eTraversalNeeded;
            }
        }
        if (what & layer_state_t::eBlurMaskAlphaThresholdChanged) {
            if (layer->setBlurMaskAlphaThreshold(s.blurMaskAlphaThreshold)) {
                flags |= eTraversalNeeded;
            }
        }
        if (what & layer_state_t::eSizeChanged) {
            if (layer->setSize(s.w, s.h)) {
                flags |= eTraversalNeeded;
@@ -2424,6 +2460,11 @@ status_t SurfaceFlinger::createLayer(
                    name, w, h, flags,
                    handle, gbp, &layer);
            break;
        case ISurfaceComposerClient::eFXSurfaceBlur:
            result = createBlurLayer(client,
                    name, w, h, flags,
                    handle, gbp, &layer);
            break;
        default:
            result = BAD_VALUE;
            break;
@@ -2478,6 +2519,16 @@ status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
    return NO_ERROR;
}

status_t SurfaceFlinger::createBlurLayer(const sp<Client>& client,
        const String8& name, uint32_t w, uint32_t h, uint32_t flags,
        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
{
    *outLayer = new LayerBlur(this, client, name, w, h, flags);
    *handle = (*outLayer)->getHandle();
    *gbp = (*outLayer)->getProducer();
    return NO_ERROR;
}

status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
{
    // called by the window manager when it wants to remove a Layer