Loading libs/renderengine/gl/GLESRenderEngine.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -1233,8 +1233,10 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, } } mState.maxMasteringLuminance = layer->source.buffer.maxMasteringLuminance; mState.maxContentLuminance = layer->source.buffer.maxContentLuminance; // Ensure luminance is at least 100 nits to avoid div-by-zero const float maxLuminance = std::max(100.f, layer->source.buffer.maxLuminanceNits); mState.maxMasteringLuminance = maxLuminance; mState.maxContentLuminance = maxLuminance; mState.projectionMatrix = projectionMatrix * layer->geometry.positionTransform; const FloatRect bounds = layer->geometry.boundaries; Loading libs/renderengine/include/renderengine/DisplaySettings.h +3 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,9 @@ struct DisplaySettings { // capture of a device in landscape while the buffer is in portrait // orientation. uint32_t orientation = ui::Transform::ROT_0; // SDR white point, -1f if unknown float sdrWhitePointNits = -1.f; }; static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) { Loading libs/renderengine/include/renderengine/LayerSettings.h +4 −6 Original line number Diff line number Diff line Loading @@ -64,8 +64,8 @@ struct Buffer { // HDR color-space setting for Y410. bool isY410BT2020 = false; float maxMasteringLuminance = 0.0; float maxContentLuminance = 0.0; float maxLuminanceNits = 0.0; }; // Metadata describing the layer geometry. Loading Loading @@ -175,8 +175,7 @@ static inline bool operator==(const Buffer& lhs, const Buffer& rhs) { lhs.textureTransform == rhs.textureTransform && lhs.usePremultipliedAlpha == rhs.usePremultipliedAlpha && lhs.isOpaque == rhs.isOpaque && lhs.isY410BT2020 == rhs.isY410BT2020 && lhs.maxMasteringLuminance == rhs.maxMasteringLuminance && lhs.maxContentLuminance == rhs.maxContentLuminance; lhs.maxLuminanceNits == rhs.maxLuminanceNits; } static inline bool operator==(const Geometry& lhs, const Geometry& rhs) { Loading Loading @@ -239,8 +238,7 @@ static inline void PrintTo(const Buffer& settings, ::std::ostream* os) { *os << "\n .usePremultipliedAlpha = " << settings.usePremultipliedAlpha; *os << "\n .isOpaque = " << settings.isOpaque; *os << "\n .isY410BT2020 = " << settings.isY410BT2020; *os << "\n .maxMasteringLuminance = " << settings.maxMasteringLuminance; *os << "\n .maxContentLuminance = " << settings.maxContentLuminance; *os << "\n .maxLuminanceNits = " << settings.maxLuminanceNits; *os << "\n}"; } Loading libs/renderengine/skia/Cache.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -108,8 +108,7 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting .source = PixelSource{.buffer = Buffer{ .buffer = srcTexture, .maxMasteringLuminance = 1000.f, .maxContentLuminance = 1000.f, .maxLuminanceNits = 1000.f, }}, }; Loading Loading @@ -205,8 +204,7 @@ static void drawTextureScaleLayers(SkiaRenderEngine* renderengine, const Display .source = PixelSource{.buffer = Buffer{ .buffer = srcTexture, .maxMasteringLuminance = 1000.f, .maxContentLuminance = 1000.f, .maxLuminanceNits = 1000.f, .textureTransform = kScaleYOnly, }}, .sourceDataspace = kOtherDataSpace, Loading libs/renderengine/skia/SkiaGLRenderEngine.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -590,10 +590,14 @@ sk_sp<SkShader> SkiaGLRenderEngine::createRuntimeEffectShader( } 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; } Loading Loading @@ -904,7 +908,9 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, 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 && Loading Loading
libs/renderengine/gl/GLESRenderEngine.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -1233,8 +1233,10 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display, } } mState.maxMasteringLuminance = layer->source.buffer.maxMasteringLuminance; mState.maxContentLuminance = layer->source.buffer.maxContentLuminance; // Ensure luminance is at least 100 nits to avoid div-by-zero const float maxLuminance = std::max(100.f, layer->source.buffer.maxLuminanceNits); mState.maxMasteringLuminance = maxLuminance; mState.maxContentLuminance = maxLuminance; mState.projectionMatrix = projectionMatrix * layer->geometry.positionTransform; const FloatRect bounds = layer->geometry.boundaries; Loading
libs/renderengine/include/renderengine/DisplaySettings.h +3 −0 Original line number Diff line number Diff line Loading @@ -60,6 +60,9 @@ struct DisplaySettings { // capture of a device in landscape while the buffer is in portrait // orientation. uint32_t orientation = ui::Transform::ROT_0; // SDR white point, -1f if unknown float sdrWhitePointNits = -1.f; }; static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) { Loading
libs/renderengine/include/renderengine/LayerSettings.h +4 −6 Original line number Diff line number Diff line Loading @@ -64,8 +64,8 @@ struct Buffer { // HDR color-space setting for Y410. bool isY410BT2020 = false; float maxMasteringLuminance = 0.0; float maxContentLuminance = 0.0; float maxLuminanceNits = 0.0; }; // Metadata describing the layer geometry. Loading Loading @@ -175,8 +175,7 @@ static inline bool operator==(const Buffer& lhs, const Buffer& rhs) { lhs.textureTransform == rhs.textureTransform && lhs.usePremultipliedAlpha == rhs.usePremultipliedAlpha && lhs.isOpaque == rhs.isOpaque && lhs.isY410BT2020 == rhs.isY410BT2020 && lhs.maxMasteringLuminance == rhs.maxMasteringLuminance && lhs.maxContentLuminance == rhs.maxContentLuminance; lhs.maxLuminanceNits == rhs.maxLuminanceNits; } static inline bool operator==(const Geometry& lhs, const Geometry& rhs) { Loading Loading @@ -239,8 +238,7 @@ static inline void PrintTo(const Buffer& settings, ::std::ostream* os) { *os << "\n .usePremultipliedAlpha = " << settings.usePremultipliedAlpha; *os << "\n .isOpaque = " << settings.isOpaque; *os << "\n .isY410BT2020 = " << settings.isY410BT2020; *os << "\n .maxMasteringLuminance = " << settings.maxMasteringLuminance; *os << "\n .maxContentLuminance = " << settings.maxContentLuminance; *os << "\n .maxLuminanceNits = " << settings.maxLuminanceNits; *os << "\n}"; } Loading
libs/renderengine/skia/Cache.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -108,8 +108,7 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting .source = PixelSource{.buffer = Buffer{ .buffer = srcTexture, .maxMasteringLuminance = 1000.f, .maxContentLuminance = 1000.f, .maxLuminanceNits = 1000.f, }}, }; Loading Loading @@ -205,8 +204,7 @@ static void drawTextureScaleLayers(SkiaRenderEngine* renderengine, const Display .source = PixelSource{.buffer = Buffer{ .buffer = srcTexture, .maxMasteringLuminance = 1000.f, .maxContentLuminance = 1000.f, .maxLuminanceNits = 1000.f, .textureTransform = kScaleYOnly, }}, .sourceDataspace = kOtherDataSpace, Loading
libs/renderengine/skia/SkiaGLRenderEngine.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -590,10 +590,14 @@ sk_sp<SkShader> SkiaGLRenderEngine::createRuntimeEffectShader( } 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; } Loading Loading @@ -904,7 +908,9 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, 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 && Loading