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

Commit 2b4df0ba authored by Steve Kondik's avatar Steve Kondik
Browse files

surfaceflinger: Add support for secondary color matrix

 * Add a new binder transaction for applying a secondary color matrix
   using RenderEngine. This stacks with the primary color matrix
   (if set for a11y) to enable GPU-based display calibration.

Change-Id: I766455bfb5212e2dcc8ad0cb8ebdddbda87af732
parent 31d9cccf
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -156,6 +156,7 @@ SurfaceFlinger::SurfaceFlinger()
        mHWVsyncAvailable(false),
        mDaltonize(false),
        mHasColorMatrix(false),
        mHasSecondaryColorMatrix(false),
        mHasPoweredOff(false),
        mFrameBuckets(),
        mTotalTime(0),
@@ -1193,7 +1194,7 @@ void SurfaceFlinger::setUpHWComposer() {
                        for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
                            const sp<Layer>& layer(currentLayers[i]);
                            layer->setGeometry(hw, *cur);
                            if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
                            if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix || mHasSecondaryColorMatrix) {
                                cur->setSkip(true);
                            }
                        }
@@ -1958,11 +1959,14 @@ void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
        }
    }

    if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
    if (CC_LIKELY(!mDaltonize && !mHasColorMatrix && !mHasSecondaryColorMatrix)) {
        if (!doComposeSurfaces(hw, dirtyRegion)) return;
    } else {
        RenderEngine& engine(getRenderEngine());
        mat4 colorMatrix = mColorMatrix;
        if (mHasSecondaryColorMatrix) {
            colorMatrix = mHasColorMatrix ? (colorMatrix * mSecondaryColorMatrix) : mSecondaryColorMatrix;
        }
        if (mDaltonize) {
            colorMatrix = colorMatrix * mDaltonizer();
        }
@@ -2948,7 +2952,8 @@ void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
    result.appendFormat("  h/w composer %s and %s\n",
            hwc.initCheck()==NO_ERROR ? "present" : "not present",
                    (mDebugDisableHWC || mDebugRegion || mDaltonize
                            || mHasColorMatrix) ? "disabled" : "enabled");
                            || mHasColorMatrix
                            || mHasSecondaryColorMatrix) ? "disabled" : "enabled");
    hwc.dump(result);

    /*
@@ -3158,6 +3163,28 @@ status_t SurfaceFlinger::onTransact(
                    mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
                return NO_ERROR;
            }
            case 1030: {
                // apply a secondary color matrix
                // this will be combined with any other transformations
                n = data.readInt32();
                mHasSecondaryColorMatrix = n ? 1 : 0;
                if (n) {
                    // color matrix is sent as mat3 matrix followed by vec3
                    // offset, then packed into a mat4 where the last row is
                    // the offset and extra values are 0
                    for (size_t i = 0 ; i < 4; i++) {
                      for (size_t j = 0; j < 4; j++) {
                          mSecondaryColorMatrix[i][j] = data.readFloat();
                      }
                    }
                } else {
                    mSecondaryColorMatrix = mat4();
                }
                invalidateHwcGeometry();
                repaintEverything();
                return NO_ERROR;
            }

        }
    }
    return err;
+3 −0
Original line number Diff line number Diff line
@@ -553,6 +553,9 @@ private:
    mat4 mColorMatrix;
    bool mHasColorMatrix;

    mat4 mSecondaryColorMatrix;
    bool mHasSecondaryColorMatrix;

    // Static screen stats
    bool mHasPoweredOff;
    static const size_t NUM_BUCKETS = 8; // < 1-7, 7+