Merge "Add API for pushing color transforms to SurfaceFlinger"
This commit is contained in:
commit
ff735dd2b8
@ -169,7 +169,7 @@ String8 ProgramCache::generateFragmentShader(const Key& needs) {
|
|||||||
fs << "gl_FragColor.rgb = gl_FragColor.rgb/gl_FragColor.a;";
|
fs << "gl_FragColor.rgb = gl_FragColor.rgb/gl_FragColor.a;";
|
||||||
}
|
}
|
||||||
fs << "gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(2.2));";
|
fs << "gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(2.2));";
|
||||||
fs << "gl_FragColor = colorMatrix*gl_FragColor;";
|
fs << "gl_FragColor.rgb = mat3(colorMatrix) * gl_FragColor.rgb + vec3(colorMatrix[3]);";
|
||||||
fs << "gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1.0 / 2.2));";
|
fs << "gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1.0 / 2.2));";
|
||||||
if (!needs.isOpaque() && needs.isPremultiplied()) {
|
if (!needs.isOpaque() && needs.isPremultiplied()) {
|
||||||
// and re-premultiply if needed after gamma correction
|
// and re-premultiply if needed after gamma correction
|
||||||
|
@ -114,7 +114,8 @@ SurfaceFlinger::SurfaceFlinger()
|
|||||||
mDebugInTransaction(0),
|
mDebugInTransaction(0),
|
||||||
mLastTransactionTime(0),
|
mLastTransactionTime(0),
|
||||||
mBootFinished(false),
|
mBootFinished(false),
|
||||||
mDaltonize(false)
|
mDaltonize(false),
|
||||||
|
mHasColorMatrix(false)
|
||||||
{
|
{
|
||||||
ALOGI("SurfaceFlinger is starting");
|
ALOGI("SurfaceFlinger is starting");
|
||||||
|
|
||||||
@ -869,7 +870,7 @@ void SurfaceFlinger::setUpHWComposer() {
|
|||||||
for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
|
for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
|
||||||
const sp<Layer>& layer(currentLayers[i]);
|
const sp<Layer>& layer(currentLayers[i]);
|
||||||
layer->setGeometry(hw, *cur);
|
layer->setGeometry(hw, *cur);
|
||||||
if (mDebugDisableHWC || mDebugRegion || mDaltonize) {
|
if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
|
||||||
cur->setSkip(true);
|
cur->setSkip(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1483,11 +1484,17 @@ void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CC_LIKELY(!mDaltonize)) {
|
if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
|
||||||
doComposeSurfaces(hw, dirtyRegion);
|
doComposeSurfaces(hw, dirtyRegion);
|
||||||
} else {
|
} else {
|
||||||
RenderEngine& engine(getRenderEngine());
|
RenderEngine& engine(getRenderEngine());
|
||||||
engine.beginGroup(mDaltonizer());
|
mat4 colorMatrix = mColorMatrix;
|
||||||
|
if (mDaltonize) {
|
||||||
|
// preserve last row of color matrix
|
||||||
|
colorMatrix = colorMatrix * mDaltonizer();
|
||||||
|
colorMatrix[3] = mColorMatrix[3];
|
||||||
|
}
|
||||||
|
engine.beginGroup(colorMatrix);
|
||||||
doComposeSurfaces(hw, dirtyRegion);
|
doComposeSurfaces(hw, dirtyRegion);
|
||||||
engine.endGroup();
|
engine.endGroup();
|
||||||
}
|
}
|
||||||
@ -2371,7 +2378,8 @@ void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
|
|||||||
colorizer.reset(result);
|
colorizer.reset(result);
|
||||||
result.appendFormat(" h/w composer %s and %s\n",
|
result.appendFormat(" h/w composer %s and %s\n",
|
||||||
hwc.initCheck()==NO_ERROR ? "present" : "not present",
|
hwc.initCheck()==NO_ERROR ? "present" : "not present",
|
||||||
(mDebugDisableHWC || mDebugRegion || mDaltonize) ? "disabled" : "enabled");
|
(mDebugDisableHWC || mDebugRegion || mDaltonize
|
||||||
|
|| mHasColorMatrix) ? "disabled" : "enabled");
|
||||||
hwc.dump(result);
|
hwc.dump(result);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2534,8 +2542,33 @@ status_t SurfaceFlinger::onTransact(
|
|||||||
mDaltonize = n > 0;
|
mDaltonize = n > 0;
|
||||||
invalidateHwcGeometry();
|
invalidateHwcGeometry();
|
||||||
repaintEverything();
|
repaintEverything();
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
case 1015: {
|
||||||
|
// apply a color matrix
|
||||||
|
n = data.readInt32();
|
||||||
|
mHasColorMatrix = 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 < 3 ; i++) {
|
||||||
|
for (size_t j = 0; j < 3; j++) {
|
||||||
|
mColorMatrix[i][j] = data.readFloat();
|
||||||
|
}
|
||||||
|
mColorMatrix[i][3] = 0;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < 3; i++) {
|
||||||
|
mColorMatrix[3][i] = data.readFloat();
|
||||||
|
}
|
||||||
|
mColorMatrix[3][3] = 0;
|
||||||
|
} else {
|
||||||
|
mColorMatrix = mat4();
|
||||||
|
}
|
||||||
|
invalidateHwcGeometry();
|
||||||
|
repaintEverything();
|
||||||
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
return NO_ERROR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include <binder/IMemory.h>
|
#include <binder/IMemory.h>
|
||||||
|
|
||||||
#include <ui/PixelFormat.h>
|
#include <ui/PixelFormat.h>
|
||||||
|
#include <ui/mat4.h>
|
||||||
|
|
||||||
#include <gui/ISurfaceComposer.h>
|
#include <gui/ISurfaceComposer.h>
|
||||||
#include <gui/ISurfaceComposerClient.h>
|
#include <gui/ISurfaceComposerClient.h>
|
||||||
@ -461,6 +462,9 @@ private:
|
|||||||
|
|
||||||
Daltonizer mDaltonizer;
|
Daltonizer mDaltonizer;
|
||||||
bool mDaltonize;
|
bool mDaltonize;
|
||||||
|
|
||||||
|
mat4 mColorMatrix;
|
||||||
|
bool mHasColorMatrix;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user