[Lut shader] Fix gamma correction
to avoid color conversion, we de-gamma the image without changing the
primaries, after lut(s) shader being applied, we need to re-gamma it
back.
Bug: 329472856
Test: luts cts cases
Flag: android.hardware.flags.luts_api
Change-Id: I8c8a3b6d445d11efab4115c097d7eeb91d1be384
diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp
index 5c46c91..a93f6c3 100644
--- a/libs/renderengine/skia/SkiaRenderEngine.cpp
+++ b/libs/renderengine/skia/SkiaRenderEngine.cpp
@@ -544,7 +544,8 @@
}
if (graphicBuffer && parameters.layer.luts) {
- shader = mLutShader.lutShader(shader, parameters.layer.luts);
+ shader = mLutShader.lutShader(shader, parameters.layer.luts,
+ toSkColorSpace(parameters.outputDataSpace));
}
if (parameters.requiresLinearEffect) {
diff --git a/libs/renderengine/skia/filters/LutShader.cpp b/libs/renderengine/skia/filters/LutShader.cpp
index cea46ef..1e43ff3 100644
--- a/libs/renderengine/skia/filters/LutShader.cpp
+++ b/libs/renderengine/skia/filters/LutShader.cpp
@@ -169,7 +169,8 @@
}
sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
- std::shared_ptr<gui::DisplayLuts> displayLuts) {
+ std::shared_ptr<gui::DisplayLuts> displayLuts,
+ sk_sp<SkColorSpace> outColorSpace) {
if (mBuilder == nullptr) {
const static SkRuntimeEffect::Result instance = SkRuntimeEffect::MakeForShader(kShader);
mBuilder = std::make_unique<SkRuntimeShaderBuilder>(instance.effect);
@@ -179,14 +180,11 @@
if (fd.ok()) {
// de-gamma the image without changing the primaries
SkImage* baseImage = input->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr);
- if (baseImage) {
- sk_sp<SkColorSpace> baseColorSpace =
- baseImage->colorSpace() ? baseImage->refColorSpace() : SkColorSpace::MakeSRGB();
- sk_sp<SkColorSpace> gainmapMathColorSpace = baseColorSpace->makeLinearGamma();
- auto colorXformSdrToGainmap =
- SkColorFilterPriv::MakeColorSpaceXform(baseColorSpace, gainmapMathColorSpace);
- input = input->makeWithColorFilter(colorXformSdrToGainmap);
- }
+ sk_sp<SkColorSpace> baseColorSpace = baseImage && baseImage->colorSpace()
+ ? baseImage->refColorSpace()
+ : SkColorSpace::MakeSRGB();
+ sk_sp<SkColorSpace> lutMathColorSpace = baseColorSpace->makeLinearGamma();
+ input = input->makeWithWorkingColorSpace(lutMathColorSpace);
auto& offsets = displayLuts->offsets;
auto& lutProperties = displayLuts->lutProperties;
@@ -223,16 +221,9 @@
lutProperties[i].samplingKey);
}
- // re-gamma
- baseImage = input->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr);
- if (baseImage) {
- sk_sp<SkColorSpace> baseColorSpace =
- baseImage->colorSpace() ? baseImage->refColorSpace() : SkColorSpace::MakeSRGB();
- sk_sp<SkColorSpace> gainmapMathColorSpace = baseColorSpace->makeLinearGamma();
- auto colorXformGainmapToDst =
- SkColorFilterPriv::MakeColorSpaceXform(gainmapMathColorSpace, baseColorSpace);
- input = input->makeWithColorFilter(colorXformGainmapToDst);
- }
+ auto colorXformLutToDst =
+ SkColorFilterPriv::MakeColorSpaceXform(lutMathColorSpace, outColorSpace);
+ input = input->makeWithColorFilter(colorXformLutToDst);
}
return input;
}
diff --git a/libs/renderengine/skia/filters/LutShader.h b/libs/renderengine/skia/filters/LutShader.h
index c157904..ce3e059 100644
--- a/libs/renderengine/skia/filters/LutShader.h
+++ b/libs/renderengine/skia/filters/LutShader.h
@@ -28,8 +28,8 @@
class LutShader {
public:
- sk_sp<SkShader> lutShader(sk_sp<SkShader>& input,
- std::shared_ptr<gui::DisplayLuts> displayLuts);
+ sk_sp<SkShader> lutShader(sk_sp<SkShader>& input, std::shared_ptr<gui::DisplayLuts> displayLuts,
+ sk_sp<SkColorSpace> outColorSpace);
private:
sk_sp<SkShader> generateLutShader(sk_sp<SkShader> input, const std::vector<float>& buffers,