diff options
| author | 2018-04-20 16:13:31 -0400 | |
|---|---|---|
| committer | 2018-05-01 02:45:43 +0000 | |
| commit | 551d08e2d50c7f73c5eb65fd366b92efba4f0ed5 (patch) | |
| tree | 9ac55bbd3f8a5886fb611d35c79627fc3c2031db /libs/hwui/DeferredLayerUpdater.cpp | |
| parent | 9ea13ca0b67e77c5efda1c94c141dc49987c0745 (diff) | |
Respect a Layer's (e.g. SurfaceTexture) colorSpace when compositing
This CL extracts the android_dataspace from the GLConsumer and converts
it to a SkColorSpace. HWUI always expects to composite into an sRGB
destination so when we draw the layer we run the draw through a
colorFilter that converts the input colorSpace into that of the
destination.
Test: CtsViewTestCases
Bug: 78016220
Merged-In: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b
Change-Id: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b
Diffstat (limited to 'libs/hwui/DeferredLayerUpdater.cpp')
| -rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index be7d663b412f..569de76f294e 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -40,7 +40,6 @@ DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState, CreateLayer } DeferredLayerUpdater::~DeferredLayerUpdater() { - SkSafeUnref(mColorFilter); setTransform(nullptr); mRenderState.unregisterDeferredLayerUpdater(this); destroyLayer(); @@ -67,8 +66,11 @@ void DeferredLayerUpdater::destroyLayer() { void DeferredLayerUpdater::setPaint(const SkPaint* paint) { mAlpha = PaintUtils::getAlphaDirect(paint); mMode = PaintUtils::getBlendModeDirect(paint); - SkColorFilter* colorFilter = (paint) ? paint->getColorFilter() : nullptr; - SkRefCnt_SafeAssign(mColorFilter, colorFilter); + if (paint) { + mColorFilter = paint->refColorFilter(); + } else { + mColorFilter.reset(); + } } void DeferredLayerUpdater::apply() { @@ -143,7 +145,7 @@ void DeferredLayerUpdater::doUpdateTexImage() { #endif mSurfaceTexture->getTransformMatrix(transform); - updateLayer(forceFilter, transform); + updateLayer(forceFilter, transform, mSurfaceTexture->getCurrentDataSpace()); } } @@ -153,17 +155,19 @@ void DeferredLayerUpdater::doUpdateVkTexImage() { Layer::Api::OpenGL, Layer::Api::Vulkan); static const mat4 identityMatrix; - updateLayer(false, identityMatrix.data); + updateLayer(false, identityMatrix.data, HAL_DATASPACE_UNKNOWN); VkLayer* vkLayer = static_cast<VkLayer*>(mLayer); vkLayer->updateTexture(); } -void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) { +void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform, + android_dataspace dataspace) { mLayer->setBlend(mBlend); mLayer->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->getTexTransform().load(textureTransform); + mLayer->setDataSpace(dataspace); } void DeferredLayerUpdater::detachSurfaceTexture() { |