Make sdr white point do a thing
Bug: 182312559
Test: SilkFX prototype changes
Change-Id: Ieca0e4c8e2229d14aac460945702d23759d208e9
diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp
index 6ab93df..58d124a 100644
--- a/libs/renderengine/skia/Cache.cpp
+++ b/libs/renderengine/skia/Cache.cpp
@@ -108,8 +108,7 @@
.source = PixelSource{.buffer =
Buffer{
.buffer = srcTexture,
- .maxMasteringLuminance = 1000.f,
- .maxContentLuminance = 1000.f,
+ .maxLuminanceNits = 1000.f,
}},
};
@@ -205,8 +204,7 @@
.source = PixelSource{.buffer =
Buffer{
.buffer = srcTexture,
- .maxMasteringLuminance = 1000.f,
- .maxContentLuminance = 1000.f,
+ .maxLuminanceNits = 1000.f,
.textureTransform = kScaleYOnly,
}},
.sourceDataspace = kOtherDataSpace,
diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp
index acdb78a..160ffb3 100644
--- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp
+++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp
@@ -567,10 +567,14 @@
} else {
runtimeEffect = effectIter->second;
}
+ float maxLuminance = layer->source.buffer.maxLuminanceNits;
+ // If the buffer doesn't have a max luminance, treat it as SDR & use the display's SDR
+ // white point
+ if (maxLuminance <= 0.f) {
+ maxLuminance = display.sdrWhitePointNits;
+ }
return createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform,
- display.maxLuminance,
- layer->source.buffer.maxMasteringLuminance,
- layer->source.buffer.maxContentLuminance);
+ display.maxLuminance, maxLuminance);
}
return shader;
}
@@ -866,7 +870,9 @@
const bool requiresLinearEffect = layer->colorTransform != mat4() ||
(mUseColorManagement &&
- needsToneMapping(layer->sourceDataspace, display.outputDataspace));
+ needsToneMapping(layer->sourceDataspace, display.outputDataspace)) ||
+ (display.sdrWhitePointNits > 0.f &&
+ display.sdrWhitePointNits != display.maxLuminance);
// quick abort from drawing the remaining portion of the layer
if (layer->alpha == 0 && !requiresLinearEffect && !layer->disableBlending &&
diff --git a/libs/renderengine/skia/filters/LinearEffect.cpp b/libs/renderengine/skia/filters/LinearEffect.cpp
index 0fbd669..9b044e1 100644
--- a/libs/renderengine/skia/filters/LinearEffect.cpp
+++ b/libs/renderengine/skia/filters/LinearEffect.cpp
@@ -127,7 +127,7 @@
default:
shader.append(R"(
float3 ScaleLuminance(float3 xyz) {
- return xyz * in_displayMaxLuminance;
+ return xyz * in_inputMaxLuminance;
}
)");
break;
@@ -448,7 +448,7 @@
sk_sp<SkShader> createLinearEffectShader(sk_sp<SkShader> shader, const LinearEffect& linearEffect,
sk_sp<SkRuntimeEffect> runtimeEffect,
const mat4& colorTransform, float maxDisplayLuminance,
- float maxMasteringLuminance, float maxContentLuminance) {
+ float maxLuminance) {
ATRACE_CALL();
SkRuntimeShaderBuilder effectBuilder(runtimeEffect);
@@ -467,8 +467,10 @@
}
effectBuilder.uniform("in_displayMaxLuminance") = maxDisplayLuminance;
+ // If the input luminance is unknown, use display luminance (aka, no-op any luminance changes)
+ // This will be the case for eg screenshots in addition to uncalibrated displays
effectBuilder.uniform("in_inputMaxLuminance") =
- std::min(maxMasteringLuminance, maxContentLuminance);
+ maxLuminance > 0 ? maxLuminance : maxDisplayLuminance;
return effectBuilder.makeShader(nullptr, false);
}
diff --git a/libs/renderengine/skia/filters/LinearEffect.h b/libs/renderengine/skia/filters/LinearEffect.h
index 20b8338..9e989ea 100644
--- a/libs/renderengine/skia/filters/LinearEffect.h
+++ b/libs/renderengine/skia/filters/LinearEffect.h
@@ -98,7 +98,7 @@
const LinearEffect& linearEffect,
sk_sp<SkRuntimeEffect> runtimeEffect,
const mat4& colorTransform, float maxDisplayLuminance,
- float maxMasteringLuminance, float maxContentLuminance);
+ float maxLuminance);
} // namespace skia
} // namespace renderengine
} // namespace android