From 76dd77a6f5298bf0e7cb89ec570ab1578e3947fb Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Wed, 9 May 2018 15:35:33 -0700 Subject: [SurfaceFlinger] Add methods for setting legacy starution matrix. This patch adds methods for setting legacy saturation matrix for legacy sRGB content. Previously it was combined into the color transform matrix which was applied right before applying OETF, however, we want to apply the legacy staturation matrix right after applying EOTF. BUG: 78891890 Test: build Change-Id: I7709eab0857822e48c49237d6681f6e337b4d29e Merged-In: I7709eab0857822e48c49237d6681f6e337b4d29e --- services/surfaceflinger/SurfaceFlinger.cpp | 40 +++++++++++------------------- 1 file changed, 15 insertions(+), 25 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 588d24c45f..c687e9db93 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2963,10 +2963,8 @@ bool SurfaceFlinger::doComposeSurfaces(const sp& displayDev ATRACE_INT("hasClientComposition", hasClientComposition); bool applyColorMatrix = false; - bool applyLegacyColorMatrix = false; - mat4 colorMatrix; - mat4 legacyColorMatrix; - const mat4* currentColorMatrix = nullptr; + bool needsLegacyColorMatrix = false; + bool legacyColorMatrixApplied = false; if (hasClientComposition) { ALOGV("hasClientComposition"); @@ -2985,19 +2983,12 @@ bool SurfaceFlinger::doComposeSurfaces(const sp& displayDev applyColorMatrix = !hasDeviceComposition && !skipClientColorTransform; if (applyColorMatrix) { - colorMatrix = mDrawingState.colorMatrix; + getRenderEngine().setupColorTransform(mDrawingState.colorMatrix); } - applyLegacyColorMatrix = (mDisplayColorSetting == DisplayColorSetting::ENHANCED && + needsLegacyColorMatrix = (mDisplayColorSetting == DisplayColorSetting::ENHANCED && outputDataspace != Dataspace::UNKNOWN && outputDataspace != Dataspace::SRGB); - if (applyLegacyColorMatrix) { - if (applyColorMatrix) { - legacyColorMatrix = colorMatrix * mLegacySrgbSaturationMatrix; - } else { - legacyColorMatrix = mLegacySrgbSaturationMatrix; - } - } if (!displayDevice->makeCurrent()) { ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s", @@ -3085,18 +3076,14 @@ bool SurfaceFlinger::doComposeSurfaces(const sp& displayDev } case HWC2::Composition::Client: { // switch color matrices lazily - if (layer->isLegacyDataSpace()) { - if (applyLegacyColorMatrix && currentColorMatrix != &legacyColorMatrix) { - // TODO(b/78891890) Legacy sRGB saturation matrix should be set - // separately. - getRenderEngine().setupColorTransform(legacyColorMatrix); - currentColorMatrix = &legacyColorMatrix; - } - } else { - if (applyColorMatrix && currentColorMatrix != &colorMatrix) { - getRenderEngine().setupColorTransform(colorMatrix); - currentColorMatrix = &colorMatrix; + if (layer->isLegacyDataSpace() && needsLegacyColorMatrix) { + if (!legacyColorMatrixApplied) { + getRenderEngine().setSaturationMatrix(mLegacySrgbSaturationMatrix); + legacyColorMatrixApplied = true; } + } else if (legacyColorMatrixApplied) { + getRenderEngine().setSaturationMatrix(mat4()); + legacyColorMatrixApplied = false; } layer->draw(renderArea, clip); @@ -3111,9 +3098,12 @@ bool SurfaceFlinger::doComposeSurfaces(const sp& displayDev firstLayer = false; } - if (applyColorMatrix || applyLegacyColorMatrix) { + if (applyColorMatrix) { getRenderEngine().setupColorTransform(mat4()); } + if (needsLegacyColorMatrix && legacyColorMatrixApplied) { + getRenderEngine().setSaturationMatrix(mat4()); + } // disable scissor at the end of the frame getBE().mRenderEngine->disableScissor(); -- cgit v1.2.3-59-g8ed1b