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

Commit d3788632 authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[SurfaceFlinger] Implement per layer color transformation.

Previously we introduced a new composer HAL API to set color transform for per
layer and added the plumbing in SurfaceFlinger. This patch implements the
functionality and alwasy mark those layers to fall back to GPU composition
until composer 2.3 is implemented.

BUG: 111562338
Test: Build, boot, flash, tested by setting a greyscale matrix on Settings
Test: adb shell /data/nativetest/SurfaceFlinger_test/SurfaceFlinger_test
Change-Id: If8d5ed52bf920d8cc962602196fb1b0b6e2955da
parent 48de5423
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -77,6 +77,9 @@ status_t layer_state_t::write(Parcel& output) const
        output.writeBool(false);
    }

    memcpy(output.writeInplace(16 * sizeof(float)),
           colorTransform.asArray(), 16 * sizeof(float));

    return NO_ERROR;
}

@@ -130,6 +133,8 @@ status_t layer_state_t::read(const Parcel& input)
        sidebandStream = NativeHandle::create(input.readNativeHandle(), true);
    }

    colorTransform = mat4(static_cast<const float*>(input.readInplace(16 * sizeof(float))));

    return NO_ERROR;
}

@@ -314,6 +319,10 @@ void layer_state_t::merge(const layer_state_t& other) {
        what |= eSidebandStreamChanged;
        sidebandStream = other.sidebandStream;
    }
    if (other.what & eColorTransformChanged) {
        what |= eColorTransformChanged;
        colorTransform = other.colorTransform;
    }

    if ((other.what & what) != other.what) {
        ALOGE("Unmerged SurfaceComposer Transaction properties. LayerState::merge needs updating? "
+12 −0
Original line number Diff line number Diff line
@@ -602,6 +602,18 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::destroyS
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColorTransform(
    const sp<SurfaceControl>& sc, const mat3& matrix, const vec3& translation) {
    layer_state_t* s = getLayerState(sc);
    if (!s) {
        mStatus = BAD_INDEX;
        return *this;
    }
    s->what |= layer_state_t::eColorTransformChanged;
    s->colorTransform = mat4(matrix, translation);
    return *this;
}

// ---------------------------------------------------------------------------

DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
+5 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <utils/Errors.h>

#include <gui/IGraphicBufferProducer.h>
#include <math/mat4.h>
#include <math/vec3.h>
#include <ui/GraphicTypes.h>
#include <ui/Rect.h>
@@ -72,6 +73,7 @@ struct layer_state_t {
        eSurfaceDamageRegionChanged = 0x02000000,
        eApiChanged = 0x04000000,
        eSidebandStreamChanged = 0x08000000,
        eColorTransformChanged = 0x10000000,
    };

    layer_state_t()
@@ -94,7 +96,8 @@ struct layer_state_t {
            crop(Rect::INVALID_RECT),
            dataspace(ui::Dataspace::UNKNOWN),
            surfaceDamageRegion(),
            api(-1) {
            api(-1),
            colorTransform(mat4()) {
        matrix.dsdx = matrix.dtdy = 1.0f;
        matrix.dsdy = matrix.dtdx = 0.0f;
        hdrMetadata.validTypes = 0;
@@ -150,6 +153,7 @@ struct layer_state_t {
    Region surfaceDamageRegion;
    int32_t api;
    sp<NativeHandle> sidebandStream;
    mat4 colorTransform;
};

struct ComposerState {
+4 −0
Original line number Diff line number Diff line
@@ -269,6 +269,10 @@ public:

        Transaction& destroySurface(const sp<SurfaceControl>& sc);

        // Set a color transform matrix on the given layer on the built-in display.
        Transaction& setColorTransform(const sp<SurfaceControl>& sc, const mat3& matrix,
                                       const vec3& translation);

        status_t setDisplaySurface(const sp<IBinder>& token,
                const sp<IGraphicBufferProducer>& bufferProducer);

+1 −0
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ void BufferLayer::setPerFrameData(const sp<const DisplayDevice>& display) {
    getBE().compositionInfo.hwc.dataspace = mCurrentDataSpace;
    getBE().compositionInfo.hwc.hdrMetadata = getDrawingHdrMetadata();
    getBE().compositionInfo.hwc.supportedPerFrameMetadata = display->getSupportedPerFrameMetadata();
    getBE().compositionInfo.hwc.colorTransform = getColorTransform();

    setHwcLayerBuffer(display);
}
Loading