Loading libs/renderengine/skia/SkiaRenderEngine.cpp +36 −23 Original line number Original line Diff line number Diff line Loading @@ -264,12 +264,9 @@ void SkiaRenderEngine::setEnableTracing(bool tracingEnabled) { SkAndroidFrameworkTraceUtil::setEnableTracing(tracingEnabled); SkAndroidFrameworkTraceUtil::setEnableTracing(tracingEnabled); } } SkiaRenderEngine::SkiaRenderEngine( SkiaRenderEngine::SkiaRenderEngine(RenderEngineType type, PixelFormat pixelFormat, RenderEngineType type, bool useColorManagement, bool supportsBackgroundBlur) PixelFormat pixelFormat, : RenderEngine(type), bool useColorManagement, bool supportsBackgroundBlur) : RenderEngine(type), mDefaultPixelFormat(pixelFormat), mDefaultPixelFormat(pixelFormat), mUseColorManagement(useColorManagement) { mUseColorManagement(useColorManagement) { if (supportsBackgroundBlur) { if (supportsBackgroundBlur) { Loading Loading @@ -507,15 +504,9 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader( } } if (parameters.requiresLinearEffect) { if (parameters.requiresLinearEffect) { const ui::Dataspace inputDataspace = mUseColorManagement ? parameters.layer.sourceDataspace : ui::Dataspace::V0_SRGB_LINEAR; const ui::Dataspace outputDataspace = mUseColorManagement ? parameters.display.outputDataspace : ui::Dataspace::V0_SRGB_LINEAR; auto effect = auto effect = shaders::LinearEffect{.inputDataspace = inputDataspace, shaders::LinearEffect{.inputDataspace = parameters.layer.sourceDataspace, .outputDataspace = outputDataspace, .outputDataspace = parameters.outputDataSpace, .undoPremultipliedAlpha = parameters.undoPremultipliedAlpha}; .undoPremultipliedAlpha = parameters.undoPremultipliedAlpha}; auto effectIter = mRuntimeEffects.find(effect); auto effectIter = mRuntimeEffects.find(effect); Loading Loading @@ -678,9 +669,8 @@ void SkiaRenderEngine::drawLayersInternal( // wait on the buffer to be ready to use prior to using it // wait on the buffer to be ready to use prior to using it waitFence(grContext, bufferFence); waitFence(grContext, bufferFence); const ui::Dataspace dstDataspace = sk_sp<SkSurface> dstSurface = mUseColorManagement ? display.outputDataspace : ui::Dataspace::V0_SRGB_LINEAR; surfaceTextureRef->getOrCreateSurface(display.outputDataspace, grContext); sk_sp<SkSurface> dstSurface = surfaceTextureRef->getOrCreateSurface(dstDataspace, grContext); SkCanvas* dstCanvas = mCapture->tryCapture(dstSurface.get()); SkCanvas* dstCanvas = mCapture->tryCapture(dstSurface.get()); if (dstCanvas == nullptr) { if (dstCanvas == nullptr) { Loading Loading @@ -888,10 +878,31 @@ void SkiaRenderEngine::drawLayersInternal( const bool dimInLinearSpace = display.dimmingStage != const bool dimInLinearSpace = display.dimmingStage != aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF; aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF; const bool isExtendedHdr = (layer.sourceDataspace & ui::Dataspace::RANGE_MASK) == static_cast<int32_t>(ui::Dataspace::RANGE_EXTENDED) && (display.outputDataspace & ui::Dataspace::TRANSFER_MASK) == static_cast<int32_t>(ui::Dataspace::TRANSFER_SRGB); const ui::Dataspace runtimeEffectDataspace = !dimInLinearSpace && isExtendedHdr ? static_cast<ui::Dataspace>( (display.outputDataspace & ui::Dataspace::STANDARD_MASK) | ui::Dataspace::TRANSFER_GAMMA2_2 | (display.outputDataspace & ui::Dataspace::RANGE_MASK)) : display.outputDataspace; // If the input dataspace is range extended, the output dataspace transfer is sRGB // and dimmingStage is GAMMA_OETF, dim in linear space instead, and // set the output dataspace's transfer to be GAMMA2_2. // This allows DPU side to use oetf_gamma_2p2 for extended HDR layer // to avoid tone shift. // The reason of tone shift here is because HDR layers manage white point // luminance in linear space, which color pipelines request GAMMA_OETF break // without a gamma 2.2 fixup. const bool requiresLinearEffect = layer.colorTransform != mat4() || const bool requiresLinearEffect = layer.colorTransform != mat4() || (mUseColorManagement && (mUseColorManagement && needsToneMapping(layer.sourceDataspace, display.outputDataspace)) || needsToneMapping(layer.sourceDataspace, display.outputDataspace)) || (dimInLinearSpace && !equalsWithinMargin(1.f, layerDimmingRatio)); (dimInLinearSpace && !equalsWithinMargin(1.f, layerDimmingRatio)) || (!dimInLinearSpace && isExtendedHdr); // quick abort from drawing the remaining portion of the layer // quick abort from drawing the remaining portion of the layer if (layer.skipContentDraw || if (layer.skipContentDraw || Loading @@ -904,7 +915,7 @@ void SkiaRenderEngine::drawLayersInternal( // image with the same colorspace as the destination surface so that Skia's color // image with the same colorspace as the destination surface so that Skia's color // management is a no-op. // management is a no-op. const ui::Dataspace layerDataspace = (!mUseColorManagement || requiresLinearEffect) const ui::Dataspace layerDataspace = (!mUseColorManagement || requiresLinearEffect) ? dstDataspace ? display.outputDataspace : layer.sourceDataspace; : layer.sourceDataspace; SkPaint paint; SkPaint paint; Loading Loading @@ -985,7 +996,8 @@ void SkiaRenderEngine::drawLayersInternal( .requiresLinearEffect = requiresLinearEffect, .requiresLinearEffect = requiresLinearEffect, .layerDimmingRatio = dimInLinearSpace .layerDimmingRatio = dimInLinearSpace ? layerDimmingRatio ? layerDimmingRatio : 1.f})); : 1.f, .outputDataSpace = runtimeEffectDataspace})); // Turn on dithering when dimming beyond this (arbitrary) threshold... // Turn on dithering when dimming beyond this (arbitrary) threshold... static constexpr float kDimmingThreshold = 0.2f; static constexpr float kDimmingThreshold = 0.2f; Loading Loading @@ -1048,7 +1060,8 @@ void SkiaRenderEngine::drawLayersInternal( .display = display, .display = display, .undoPremultipliedAlpha = false, .undoPremultipliedAlpha = false, .requiresLinearEffect = requiresLinearEffect, .requiresLinearEffect = requiresLinearEffect, .layerDimmingRatio = layerDimmingRatio})); .layerDimmingRatio = layerDimmingRatio, .outputDataSpace = runtimeEffectDataspace})); } } if (layer.disableBlending) { if (layer.disableBlending) { Loading libs/renderengine/skia/SkiaRenderEngine.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -156,6 +156,7 @@ private: bool undoPremultipliedAlpha; bool undoPremultipliedAlpha; bool requiresLinearEffect; bool requiresLinearEffect; float layerDimmingRatio; float layerDimmingRatio; const ui::Dataspace outputDataSpace; }; }; sk_sp<SkShader> createRuntimeEffectShader(const RuntimeEffectShaderParameters&); sk_sp<SkShader> createRuntimeEffectShader(const RuntimeEffectShaderParameters&); Loading Loading
libs/renderengine/skia/SkiaRenderEngine.cpp +36 −23 Original line number Original line Diff line number Diff line Loading @@ -264,12 +264,9 @@ void SkiaRenderEngine::setEnableTracing(bool tracingEnabled) { SkAndroidFrameworkTraceUtil::setEnableTracing(tracingEnabled); SkAndroidFrameworkTraceUtil::setEnableTracing(tracingEnabled); } } SkiaRenderEngine::SkiaRenderEngine( SkiaRenderEngine::SkiaRenderEngine(RenderEngineType type, PixelFormat pixelFormat, RenderEngineType type, bool useColorManagement, bool supportsBackgroundBlur) PixelFormat pixelFormat, : RenderEngine(type), bool useColorManagement, bool supportsBackgroundBlur) : RenderEngine(type), mDefaultPixelFormat(pixelFormat), mDefaultPixelFormat(pixelFormat), mUseColorManagement(useColorManagement) { mUseColorManagement(useColorManagement) { if (supportsBackgroundBlur) { if (supportsBackgroundBlur) { Loading Loading @@ -507,15 +504,9 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader( } } if (parameters.requiresLinearEffect) { if (parameters.requiresLinearEffect) { const ui::Dataspace inputDataspace = mUseColorManagement ? parameters.layer.sourceDataspace : ui::Dataspace::V0_SRGB_LINEAR; const ui::Dataspace outputDataspace = mUseColorManagement ? parameters.display.outputDataspace : ui::Dataspace::V0_SRGB_LINEAR; auto effect = auto effect = shaders::LinearEffect{.inputDataspace = inputDataspace, shaders::LinearEffect{.inputDataspace = parameters.layer.sourceDataspace, .outputDataspace = outputDataspace, .outputDataspace = parameters.outputDataSpace, .undoPremultipliedAlpha = parameters.undoPremultipliedAlpha}; .undoPremultipliedAlpha = parameters.undoPremultipliedAlpha}; auto effectIter = mRuntimeEffects.find(effect); auto effectIter = mRuntimeEffects.find(effect); Loading Loading @@ -678,9 +669,8 @@ void SkiaRenderEngine::drawLayersInternal( // wait on the buffer to be ready to use prior to using it // wait on the buffer to be ready to use prior to using it waitFence(grContext, bufferFence); waitFence(grContext, bufferFence); const ui::Dataspace dstDataspace = sk_sp<SkSurface> dstSurface = mUseColorManagement ? display.outputDataspace : ui::Dataspace::V0_SRGB_LINEAR; surfaceTextureRef->getOrCreateSurface(display.outputDataspace, grContext); sk_sp<SkSurface> dstSurface = surfaceTextureRef->getOrCreateSurface(dstDataspace, grContext); SkCanvas* dstCanvas = mCapture->tryCapture(dstSurface.get()); SkCanvas* dstCanvas = mCapture->tryCapture(dstSurface.get()); if (dstCanvas == nullptr) { if (dstCanvas == nullptr) { Loading Loading @@ -888,10 +878,31 @@ void SkiaRenderEngine::drawLayersInternal( const bool dimInLinearSpace = display.dimmingStage != const bool dimInLinearSpace = display.dimmingStage != aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF; aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF; const bool isExtendedHdr = (layer.sourceDataspace & ui::Dataspace::RANGE_MASK) == static_cast<int32_t>(ui::Dataspace::RANGE_EXTENDED) && (display.outputDataspace & ui::Dataspace::TRANSFER_MASK) == static_cast<int32_t>(ui::Dataspace::TRANSFER_SRGB); const ui::Dataspace runtimeEffectDataspace = !dimInLinearSpace && isExtendedHdr ? static_cast<ui::Dataspace>( (display.outputDataspace & ui::Dataspace::STANDARD_MASK) | ui::Dataspace::TRANSFER_GAMMA2_2 | (display.outputDataspace & ui::Dataspace::RANGE_MASK)) : display.outputDataspace; // If the input dataspace is range extended, the output dataspace transfer is sRGB // and dimmingStage is GAMMA_OETF, dim in linear space instead, and // set the output dataspace's transfer to be GAMMA2_2. // This allows DPU side to use oetf_gamma_2p2 for extended HDR layer // to avoid tone shift. // The reason of tone shift here is because HDR layers manage white point // luminance in linear space, which color pipelines request GAMMA_OETF break // without a gamma 2.2 fixup. const bool requiresLinearEffect = layer.colorTransform != mat4() || const bool requiresLinearEffect = layer.colorTransform != mat4() || (mUseColorManagement && (mUseColorManagement && needsToneMapping(layer.sourceDataspace, display.outputDataspace)) || needsToneMapping(layer.sourceDataspace, display.outputDataspace)) || (dimInLinearSpace && !equalsWithinMargin(1.f, layerDimmingRatio)); (dimInLinearSpace && !equalsWithinMargin(1.f, layerDimmingRatio)) || (!dimInLinearSpace && isExtendedHdr); // quick abort from drawing the remaining portion of the layer // quick abort from drawing the remaining portion of the layer if (layer.skipContentDraw || if (layer.skipContentDraw || Loading @@ -904,7 +915,7 @@ void SkiaRenderEngine::drawLayersInternal( // image with the same colorspace as the destination surface so that Skia's color // image with the same colorspace as the destination surface so that Skia's color // management is a no-op. // management is a no-op. const ui::Dataspace layerDataspace = (!mUseColorManagement || requiresLinearEffect) const ui::Dataspace layerDataspace = (!mUseColorManagement || requiresLinearEffect) ? dstDataspace ? display.outputDataspace : layer.sourceDataspace; : layer.sourceDataspace; SkPaint paint; SkPaint paint; Loading Loading @@ -985,7 +996,8 @@ void SkiaRenderEngine::drawLayersInternal( .requiresLinearEffect = requiresLinearEffect, .requiresLinearEffect = requiresLinearEffect, .layerDimmingRatio = dimInLinearSpace .layerDimmingRatio = dimInLinearSpace ? layerDimmingRatio ? layerDimmingRatio : 1.f})); : 1.f, .outputDataSpace = runtimeEffectDataspace})); // Turn on dithering when dimming beyond this (arbitrary) threshold... // Turn on dithering when dimming beyond this (arbitrary) threshold... static constexpr float kDimmingThreshold = 0.2f; static constexpr float kDimmingThreshold = 0.2f; Loading Loading @@ -1048,7 +1060,8 @@ void SkiaRenderEngine::drawLayersInternal( .display = display, .display = display, .undoPremultipliedAlpha = false, .undoPremultipliedAlpha = false, .requiresLinearEffect = requiresLinearEffect, .requiresLinearEffect = requiresLinearEffect, .layerDimmingRatio = layerDimmingRatio})); .layerDimmingRatio = layerDimmingRatio, .outputDataSpace = runtimeEffectDataspace})); } } if (layer.disableBlending) { if (layer.disableBlending) { Loading
libs/renderengine/skia/SkiaRenderEngine.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -156,6 +156,7 @@ private: bool undoPremultipliedAlpha; bool undoPremultipliedAlpha; bool requiresLinearEffect; bool requiresLinearEffect; float layerDimmingRatio; float layerDimmingRatio; const ui::Dataspace outputDataSpace; }; }; sk_sp<SkShader> createRuntimeEffectShader(const RuntimeEffectShaderParameters&); sk_sp<SkShader> createRuntimeEffectShader(const RuntimeEffectShaderParameters&); Loading