Loading libs/renderengine/skia/SkiaGLRenderEngine.cpp +36 −29 Original line number Diff line number Diff line Loading @@ -418,6 +418,32 @@ void SkiaGLRenderEngine::unbindExternalTextureBuffer(uint64_t bufferId) { mProtectedTextureCache.erase(bufferId); } sk_sp<SkShader> SkiaGLRenderEngine::createRuntimeEffectShader(sk_sp<SkShader> shader, const LayerSettings* layer, const DisplaySettings& display, bool undoPremultipliedAlpha) { if (mUseColorManagement && needsLinearEffect(layer->colorTransform, layer->sourceDataspace, display.outputDataspace)) { LinearEffect effect = LinearEffect{.inputDataspace = layer->sourceDataspace, .outputDataspace = display.outputDataspace, .undoPremultipliedAlpha = undoPremultipliedAlpha}; auto effectIter = mRuntimeEffects.find(effect); sk_sp<SkRuntimeEffect> runtimeEffect = nullptr; if (effectIter == mRuntimeEffects.end()) { runtimeEffect = buildRuntimeEffect(effect); mRuntimeEffects.insert({effect, runtimeEffect}); } else { runtimeEffect = effectIter->second; } return createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform, display.maxLuminance, layer->source.buffer.maxMasteringLuminance, layer->source.buffer.maxContentLuminance); } return shader; } status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, const std::vector<const LayerSettings*>& layers, const sp<GraphicBuffer>& buffer, Loading Loading @@ -624,41 +650,22 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, shader = image->makeShader(SkSamplingOptions(), matrix); } if (mUseColorManagement && needsLinearEffect(layer->colorTransform, layer->sourceDataspace, display.outputDataspace)) { LinearEffect effect = LinearEffect{.inputDataspace = layer->sourceDataspace, .outputDataspace = display.outputDataspace, .undoPremultipliedAlpha = !item.isOpaque && item.usePremultipliedAlpha}; auto effectIter = mRuntimeEffects.find(effect); sk_sp<SkRuntimeEffect> runtimeEffect = nullptr; if (effectIter == mRuntimeEffects.end()) { runtimeEffect = buildRuntimeEffect(effect); mRuntimeEffects.insert({effect, runtimeEffect}); } else { runtimeEffect = effectIter->second; } paint.setShader( createRuntimeEffectShader(shader, layer, display, !item.isOpaque && item.usePremultipliedAlpha)); paint.setShader(createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform, display.maxLuminance, layer->source.buffer.maxMasteringLuminance, layer->source.buffer.maxContentLuminance)); } else { paint.setShader(shader); } // Make sure to take into the account the alpha set on the layer. paint.setAlphaf(layer->alpha); } else { ATRACE_NAME("DrawColor"); const auto color = layer->source.solidColor; paint.setShader(SkShaders::Color(SkColor4f{.fR = color.r, sk_sp<SkShader> shader = SkShaders::Color(SkColor4f{.fR = color.r, .fG = color.g, .fB = color.b, layer->alpha}, nullptr)); nullptr); paint.setShader(createRuntimeEffectShader(shader, layer, display, /* undoPremultipliedAlpha */ false)); } paint.setColorFilter(SkColorFilters::Matrix(toSkColorMatrix(display.colorTransform))); Loading libs/renderengine/skia/SkiaGLRenderEngine.h +5 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,11 @@ private: void drawBlurRegion(SkCanvas* canvas, const BlurRegion& blurRegion, const SkRect& layerRect, sk_sp<SkSurface> blurredSurface); SkMatrix getBlurShaderTransform(const SkCanvas* canvas, const SkRect& layerRect); // If mUseColorManagement is correct and layer needsLinearEffect, it returns a linear runtime // shader. Otherwise it returns the input shader. sk_sp<SkShader> createRuntimeEffectShader(sk_sp<SkShader> shader, const LayerSettings* layer, const DisplaySettings& display, bool undoPremultipliedAlpha); EGLDisplay mEGLDisplay; EGLContext mEGLContext; Loading Loading
libs/renderengine/skia/SkiaGLRenderEngine.cpp +36 −29 Original line number Diff line number Diff line Loading @@ -418,6 +418,32 @@ void SkiaGLRenderEngine::unbindExternalTextureBuffer(uint64_t bufferId) { mProtectedTextureCache.erase(bufferId); } sk_sp<SkShader> SkiaGLRenderEngine::createRuntimeEffectShader(sk_sp<SkShader> shader, const LayerSettings* layer, const DisplaySettings& display, bool undoPremultipliedAlpha) { if (mUseColorManagement && needsLinearEffect(layer->colorTransform, layer->sourceDataspace, display.outputDataspace)) { LinearEffect effect = LinearEffect{.inputDataspace = layer->sourceDataspace, .outputDataspace = display.outputDataspace, .undoPremultipliedAlpha = undoPremultipliedAlpha}; auto effectIter = mRuntimeEffects.find(effect); sk_sp<SkRuntimeEffect> runtimeEffect = nullptr; if (effectIter == mRuntimeEffects.end()) { runtimeEffect = buildRuntimeEffect(effect); mRuntimeEffects.insert({effect, runtimeEffect}); } else { runtimeEffect = effectIter->second; } return createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform, display.maxLuminance, layer->source.buffer.maxMasteringLuminance, layer->source.buffer.maxContentLuminance); } return shader; } status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, const std::vector<const LayerSettings*>& layers, const sp<GraphicBuffer>& buffer, Loading Loading @@ -624,41 +650,22 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display, shader = image->makeShader(SkSamplingOptions(), matrix); } if (mUseColorManagement && needsLinearEffect(layer->colorTransform, layer->sourceDataspace, display.outputDataspace)) { LinearEffect effect = LinearEffect{.inputDataspace = layer->sourceDataspace, .outputDataspace = display.outputDataspace, .undoPremultipliedAlpha = !item.isOpaque && item.usePremultipliedAlpha}; auto effectIter = mRuntimeEffects.find(effect); sk_sp<SkRuntimeEffect> runtimeEffect = nullptr; if (effectIter == mRuntimeEffects.end()) { runtimeEffect = buildRuntimeEffect(effect); mRuntimeEffects.insert({effect, runtimeEffect}); } else { runtimeEffect = effectIter->second; } paint.setShader( createRuntimeEffectShader(shader, layer, display, !item.isOpaque && item.usePremultipliedAlpha)); paint.setShader(createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform, display.maxLuminance, layer->source.buffer.maxMasteringLuminance, layer->source.buffer.maxContentLuminance)); } else { paint.setShader(shader); } // Make sure to take into the account the alpha set on the layer. paint.setAlphaf(layer->alpha); } else { ATRACE_NAME("DrawColor"); const auto color = layer->source.solidColor; paint.setShader(SkShaders::Color(SkColor4f{.fR = color.r, sk_sp<SkShader> shader = SkShaders::Color(SkColor4f{.fR = color.r, .fG = color.g, .fB = color.b, layer->alpha}, nullptr)); nullptr); paint.setShader(createRuntimeEffectShader(shader, layer, display, /* undoPremultipliedAlpha */ false)); } paint.setColorFilter(SkColorFilters::Matrix(toSkColorMatrix(display.colorTransform))); Loading
libs/renderengine/skia/SkiaGLRenderEngine.h +5 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,11 @@ private: void drawBlurRegion(SkCanvas* canvas, const BlurRegion& blurRegion, const SkRect& layerRect, sk_sp<SkSurface> blurredSurface); SkMatrix getBlurShaderTransform(const SkCanvas* canvas, const SkRect& layerRect); // If mUseColorManagement is correct and layer needsLinearEffect, it returns a linear runtime // shader. Otherwise it returns the input shader. sk_sp<SkShader> createRuntimeEffectShader(sk_sp<SkShader> shader, const LayerSettings* layer, const DisplaySettings& display, bool undoPremultipliedAlpha); EGLDisplay mEGLDisplay; EGLContext mEGLContext; Loading