diff options
author | 2024-09-19 07:38:59 +0000 | |
---|---|---|
committer | 2024-09-19 07:38:59 +0000 | |
commit | 35d16c1f86c1859aaee9ce7554bb1644555068d3 (patch) | |
tree | 5c90f0a7e7f9d31c591de7016b09437c29ff80e9 | |
parent | 5a3a2e13e7f21654c2e16ae5c55956b11c1f2e70 (diff) | |
parent | 7354b39549e750a39ff471e2782c032cfd615af0 (diff) |
Merge "Cache edge extension shader" into main
-rw-r--r-- | libs/renderengine/include/renderengine/RenderEngine.h | 1 | ||||
-rw-r--r-- | libs/renderengine/skia/Cache.cpp | 34 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 |
3 files changed, 37 insertions, 0 deletions
diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index 1954fc52e9..0fd982e812 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -97,6 +97,7 @@ struct PrimeCacheConfig { bool cacheImageDimmedLayers = true; bool cacheClippedLayers = true; bool cacheShadowLayers = true; + bool cacheEdgeExtension = true; bool cachePIPImageLayers = true; bool cacheTransparentImageDimmedLayers = true; bool cacheClippedDimmedImageLayers = true; diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp index 59b06568a0..57041ee6a1 100644 --- a/libs/renderengine/skia/Cache.cpp +++ b/libs/renderengine/skia/Cache.cpp @@ -27,6 +27,8 @@ #include "ui/Rect.h" #include "utils/Timers.h" +#include <com_android_graphics_libgui_flags.h> + namespace android::renderengine::skia { namespace { @@ -619,6 +621,32 @@ static void drawP3ImageLayers(SkiaRenderEngine* renderengine, const DisplaySetti } } +static void drawEdgeExtensionLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, + const std::shared_ptr<ExternalTexture>& dstTexture, + const std::shared_ptr<ExternalTexture>& srcTexture) { + const Rect& displayRect = display.physicalDisplay; + // Make the layer + LayerSettings layer{ + // Make the layer bigger than the texture + .geometry = Geometry{.boundaries = FloatRect(0, 0, displayRect.width(), + displayRect.height())}, + .source = PixelSource{.buffer = + Buffer{ + .buffer = srcTexture, + .isOpaque = 1, + }}, + // The type of effect does not affect the shader's uniforms, but the layer must have a + // valid EdgeExtensionEffect to apply the shader + .edgeExtensionEffect = + EdgeExtensionEffect(true /* left */, false, false, true /* bottom */), + }; + for (float alpha : {0.5, 0.0, 1.0}) { + layer.alpha = alpha; + auto layers = std::vector<LayerSettings>{layer}; + renderengine->drawLayers(display, layers, dstTexture, base::unique_fd()); + } +} + // // The collection of shaders cached here were found by using perfetto to record shader compiles // during actions that involve RenderEngine, logging the layer settings, and the shader code @@ -761,6 +789,12 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine, PrimeCacheConfig co // Draw layers for b/185569240. drawClippedLayers(renderengine, display, dstTexture, texture); } + + if (com::android::graphics::libgui::flags::edge_extension_shader() && + config.cacheEdgeExtension) { + drawEdgeExtensionLayers(renderengine, display, dstTexture, texture); + drawEdgeExtensionLayers(renderengine, p3Display, dstTexture, texture); + } } if (config.cachePIPImageLayers) { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c794a7ba43..65a0ed3065 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1003,6 +1003,8 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { // which we maintain for backwards compatibility. config.cacheUltraHDR = base::GetBoolProperty("ro.surface_flinger.prime_shader_cache.ultrahdr"s, false); + config.cacheEdgeExtension = + base::GetBoolProperty("debug.sf.edge_extension_shader"s, true); return getRenderEngine().primeCache(config); }); |