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
This commit is contained in:
parent
31d9cccf23
commit
2b4df0ba7c
@ -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;
|
||||
|
@ -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+
|
||||
|
Loading…
Reference in New Issue
Block a user