diff options
| -rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.cpp | 65 | ||||
| -rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.h | 5 |
2 files changed, 41 insertions, 29 deletions
diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index 46ae18c8ff..7567f050d0 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -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, @@ -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, - .fG = color.g, - .fB = color.b, - layer->alpha}, - nullptr)); + sk_sp<SkShader> shader = SkShaders::Color(SkColor4f{.fR = color.r, + .fG = color.g, + .fB = color.b, + layer->alpha}, + nullptr); + paint.setShader(createRuntimeEffectShader(shader, layer, display, + /* undoPremultipliedAlpha */ false)); } paint.setColorFilter(SkColorFilters::Matrix(toSkColorMatrix(display.colorTransform))); diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.h b/libs/renderengine/skia/SkiaGLRenderEngine.h index 3d8c693d41..5384ec878d 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.h +++ b/libs/renderengine/skia/SkiaGLRenderEngine.h @@ -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; |