diff options
author | 2021-11-22 10:09:22 -0800 | |
---|---|---|
committer | 2021-11-24 13:22:57 -0800 | |
commit | d0001fee74b578a285fdfbe565e3dd0e451d2bfa (patch) | |
tree | 31877616cf5b5da71be9db78d63330ccee4c9023 /libs/hwui/DeferredLayerUpdater.cpp | |
parent | afb5771b0e75ce78394233f9b95e664c8fad7f20 (diff) |
Support HDR tonemapping in TextureView
This reuses the HDR tonemapping curve that was used in RenderEngine,
however display-level metadata may not be aligned. But because there are
no composition changes that can cause flicker, e.g., switching rapidly
between using a TextureView and a SurfaceView, then that should be okay.
That means that the HDR tonemapping is not as high quality as it could
be, but it is much better than before.
Bug: 200309590
Test: builds, boots
Test: Instagram video preview
Change-Id: I4dd042333f383f383d568b6f2326ee14facd08ed
Diffstat (limited to 'libs/hwui/DeferredLayerUpdater.cpp')
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index 0b3b39397ee4..a5c0924579eb 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -20,9 +20,11 @@ // TODO: Use public SurfaceTexture APIs once available and include public NDK header file instead. #include <surfacetexture/surface_texture_platform.h> + #include "AutoBackendTextureRelease.h" #include "Matrix.h" #include "Properties.h" +#include "android/hdr_metadata.h" #include "renderstate/RenderState.h" #include "renderthread/EglManager.h" #include "renderthread/RenderThread.h" @@ -147,6 +149,9 @@ void DeferredLayerUpdater::apply() { mUpdateTexImage = false; float transformMatrix[16]; android_dataspace dataspace; + AHdrMetadataType hdrMetadataType; + android_cta861_3_metadata cta861_3; + android_smpte2086_metadata smpte2086; int slot; bool newContent = false; ARect currentCrop; @@ -155,8 +160,9 @@ void DeferredLayerUpdater::apply() { // is necessary if the SurfaceTexture queue is in synchronous mode, and we // cannot tell which mode it is in. AHardwareBuffer* hardwareBuffer = ASurfaceTexture_dequeueBuffer( - mSurfaceTexture.get(), &slot, &dataspace, transformMatrix, &outTransform, - &newContent, createReleaseFence, fenceWait, this, ¤tCrop); + mSurfaceTexture.get(), &slot, &dataspace, &hdrMetadataType, &cta861_3, + &smpte2086, transformMatrix, &outTransform, &newContent, createReleaseFence, + fenceWait, this, ¤tCrop); if (hardwareBuffer) { mCurrentSlot = slot; @@ -173,7 +179,18 @@ void DeferredLayerUpdater::apply() { SkRect currentCropRect = SkRect::MakeLTRB(currentCrop.left, currentCrop.top, currentCrop.right, currentCrop.bottom); - updateLayer(forceFilter, layerImage, outTransform, currentCropRect); + + float maxLuminanceNits = -1.f; + if (hdrMetadataType & HDR10_SMPTE2086) { + maxLuminanceNits = std::max(smpte2086.maxLuminance, maxLuminanceNits); + } + + if (hdrMetadataType & HDR10_CTA861_3) { + maxLuminanceNits = + std::max(cta861_3.maxContentLightLevel, maxLuminanceNits); + } + updateLayer(forceFilter, layerImage, outTransform, currentCropRect, + maxLuminanceNits); } } } @@ -186,13 +203,15 @@ void DeferredLayerUpdater::apply() { } void DeferredLayerUpdater::updateLayer(bool forceFilter, const sk_sp<SkImage>& layerImage, - const uint32_t transform, SkRect currentCrop) { + const uint32_t transform, SkRect currentCrop, + float maxLuminanceNits) { mLayer->setBlend(mBlend); mLayer->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->setCurrentCropRect(currentCrop); mLayer->setWindowTransform(transform); mLayer->setImage(layerImage); + mLayer->setMaxLuminanceNits(maxLuminanceNits); } void DeferredLayerUpdater::detachSurfaceTexture() { |