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