diff options
author | 2024-04-04 14:05:07 +0000 | |
---|---|---|
committer | 2024-04-11 14:21:10 +0000 | |
commit | 7338bd98daeabcf88fc8524641ba1e9099d7085c (patch) | |
tree | ffba1b543746b7c656e2737a6eee381f2c1065ba | |
parent | 599efb3e39ab3a3d0dc383d3cd97c67a90d5f11a (diff) |
Add a sysprop to switch between blur algorithms
Bug: 185365391
Test: adb root && adb shell 'setprop debug.renderengine.blur_algorithm kawase' && adb shell 'stop; start' && sleep 30 && atest BlurTests
Test: adb root && adb shell 'setprop debug.renderengine.blur_algorithm gaussian' && adb shell 'stop start' && sleep 30 && atest BlurTests
Test: adb root && adb shell 'setprop debug.renderengine.blur_algorithm ""' && adb shell 'stop; start' && sleep 30 && atest BlurTests
Merged-In: Ib977e1d54eb08946449d447101a0c65273aa3b40
Change-Id: Ib977e1d54eb08946449d447101a0c65273aa3b40
-rw-r--r-- | libs/renderengine/include/renderengine/RenderEngine.h | 25 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.cpp | 2 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.cpp | 21 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.h | 2 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaVkRenderEngine.cpp | 2 | ||||
-rw-r--r-- | libs/renderengine/tests/RenderEngineTest.cpp | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 19 |
7 files changed, 57 insertions, 16 deletions
diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index 00a621372d..69e7b88bea 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -50,6 +50,11 @@ #define PROPERTY_DEBUG_RENDERENGINE_CAPTURE_FILENAME "debug.renderengine.capture_filename" /** + * Switches the cross-window background blur algorithm. + */ +#define PROPERTY_DEBUG_RENDERENGINE_BLUR_ALGORITHM "debug.renderengine.blur_algorithm" + +/** * Allows recording of Skia drawing commands with systrace. */ #define PROPERTY_SKIA_ATRACE_ENABLED "debug.renderengine.skia_atrace_enabled" @@ -107,6 +112,12 @@ public: GRAPHITE, }; + enum class BlurAlgorithm { + NONE, + GAUSSIAN, + KAWASE, + }; + static std::unique_ptr<RenderEngine> create(const RenderEngineCreationArgs& args); static bool canSupport(GraphicsApi); @@ -258,7 +269,7 @@ struct RenderEngineCreationArgs { bool useColorManagement; bool enableProtectedContext; bool precacheToneMapperShaderOnly; - bool supportsBackgroundBlur; + RenderEngine::BlurAlgorithm blurAlgorithm; RenderEngine::ContextPriority contextPriority; RenderEngine::Threaded threaded; RenderEngine::GraphicsApi graphicsApi; @@ -270,7 +281,7 @@ private: // must be created by Builder via constructor with full argument list RenderEngineCreationArgs(int _pixelFormat, uint32_t _imageCacheSize, bool _enableProtectedContext, bool _precacheToneMapperShaderOnly, - bool _supportsBackgroundBlur, + RenderEngine::BlurAlgorithm _blurAlgorithm, RenderEngine::ContextPriority _contextPriority, RenderEngine::Threaded _threaded, RenderEngine::GraphicsApi _graphicsApi, @@ -279,7 +290,7 @@ private: imageCacheSize(_imageCacheSize), enableProtectedContext(_enableProtectedContext), precacheToneMapperShaderOnly(_precacheToneMapperShaderOnly), - supportsBackgroundBlur(_supportsBackgroundBlur), + blurAlgorithm(_blurAlgorithm), contextPriority(_contextPriority), threaded(_threaded), graphicsApi(_graphicsApi), @@ -306,8 +317,8 @@ struct RenderEngineCreationArgs::Builder { this->precacheToneMapperShaderOnly = precacheToneMapperShaderOnly; return *this; } - Builder& setSupportsBackgroundBlur(bool supportsBackgroundBlur) { - this->supportsBackgroundBlur = supportsBackgroundBlur; + Builder& setBlurAlgorithm(RenderEngine::BlurAlgorithm blurAlgorithm) { + this->blurAlgorithm = blurAlgorithm; return *this; } Builder& setContextPriority(RenderEngine::ContextPriority contextPriority) { @@ -328,7 +339,7 @@ struct RenderEngineCreationArgs::Builder { } RenderEngineCreationArgs build() const { return RenderEngineCreationArgs(pixelFormat, imageCacheSize, enableProtectedContext, - precacheToneMapperShaderOnly, supportsBackgroundBlur, + precacheToneMapperShaderOnly, blurAlgorithm, contextPriority, threaded, graphicsApi, skiaBackend); } @@ -338,7 +349,7 @@ private: uint32_t imageCacheSize = 0; bool enableProtectedContext = false; bool precacheToneMapperShaderOnly = false; - bool supportsBackgroundBlur = false; + RenderEngine::BlurAlgorithm blurAlgorithm = RenderEngine::BlurAlgorithm::NONE; RenderEngine::ContextPriority contextPriority = RenderEngine::ContextPriority::MEDIUM; RenderEngine::Threaded threaded = RenderEngine::Threaded::YES; RenderEngine::GraphicsApi graphicsApi = RenderEngine::GraphicsApi::GL; diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index 61369ae764..9d3d98e269 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -271,7 +271,7 @@ SkiaGLRenderEngine::SkiaGLRenderEngine(const RenderEngineCreationArgs& args, EGL EGLContext ctxt, EGLSurface placeholder, EGLContext protectedContext, EGLSurface protectedPlaceholder) : SkiaRenderEngine(args.threaded, static_cast<PixelFormat>(args.pixelFormat), - args.supportsBackgroundBlur), + args.blurAlgorithm), mEGLDisplay(display), mEGLContext(ctxt), mPlaceholderSurface(placeholder), diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp index 24846509bc..4641cb9f93 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaRenderEngine.cpp @@ -273,12 +273,25 @@ void SkiaRenderEngine::setEnableTracing(bool tracingEnabled) { } SkiaRenderEngine::SkiaRenderEngine(Threaded threaded, PixelFormat pixelFormat, - bool supportsBackgroundBlur) + BlurAlgorithm blurAlgorithm) : RenderEngine(threaded), mDefaultPixelFormat(pixelFormat) { - if (supportsBackgroundBlur) { - ALOGD("Background Blurs Enabled"); - mBlurFilter = new KawaseBlurFilter(); + switch (blurAlgorithm) { + case BlurAlgorithm::GAUSSIAN: { + ALOGD("Background Blurs Enabled (Gaussian algorithm)"); + mBlurFilter = new GaussianBlurFilter(); + break; + } + case BlurAlgorithm::KAWASE: { + ALOGD("Background Blurs Enabled (Kawase algorithm)"); + mBlurFilter = new KawaseBlurFilter(); + break; + } + default: { + mBlurFilter = nullptr; + break; + } } + mCapture = std::make_unique<SkiaCapture>(); } diff --git a/libs/renderengine/skia/SkiaRenderEngine.h b/libs/renderengine/skia/SkiaRenderEngine.h index d7b491083d..ed50029cfa 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.h +++ b/libs/renderengine/skia/SkiaRenderEngine.h @@ -59,7 +59,7 @@ class BlurFilter; class SkiaRenderEngine : public RenderEngine { public: static std::unique_ptr<SkiaRenderEngine> create(const RenderEngineCreationArgs& args); - SkiaRenderEngine(Threaded, PixelFormat pixelFormat, bool supportsBackgroundBlur); + SkiaRenderEngine(Threaded, PixelFormat pixelFormat, BlurAlgorithm); ~SkiaRenderEngine() override; std::future<void> primeCache(bool shouldPrimeUltraHDR) override final; diff --git a/libs/renderengine/skia/SkiaVkRenderEngine.cpp b/libs/renderengine/skia/SkiaVkRenderEngine.cpp index fd71332089..406fd81487 100644 --- a/libs/renderengine/skia/SkiaVkRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaVkRenderEngine.cpp @@ -85,7 +85,7 @@ using base::StringAppendF; SkiaVkRenderEngine::SkiaVkRenderEngine(const RenderEngineCreationArgs& args) : SkiaRenderEngine(args.threaded, static_cast<PixelFormat>(args.pixelFormat), - args.supportsBackgroundBlur) {} + args.blurAlgorithm) {} SkiaVkRenderEngine::~SkiaVkRenderEngine() { finishRenderingAndAbandonContext(); diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index 9f614bdd37..640c434990 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -116,7 +116,7 @@ public: .setImageCacheSize(1) .setEnableProtectedContext(false) .setPrecacheToneMapperShaderOnly(false) - .setSupportsBackgroundBlur(true) + .setBlurAlgorithm(renderengine::RenderEngine::BlurAlgorithm::KAWASE) .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM) .setThreaded(renderengine::RenderEngine::Threaded::NO) .setGraphicsApi(graphicsApi()) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 21f1cb3e4a..b3f83f0799 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -821,6 +821,23 @@ void chooseRenderEngineType(renderengine::RenderEngineCreationArgs::Builder& bui } } +/** + * Choose a suggested blurring algorithm if supportsBlur is true. By default Kawase will be + * suggested as it's faster than a full Gaussian blur and looks close enough. + */ +renderengine::RenderEngine::BlurAlgorithm chooseBlurAlgorithm(bool supportsBlur) { + if (!supportsBlur) { + return renderengine::RenderEngine::BlurAlgorithm::NONE; + } + + auto const algorithm = base::GetProperty(PROPERTY_DEBUG_RENDERENGINE_BLUR_ALGORITHM, ""); + if (algorithm == "gaussian") { + return renderengine::RenderEngine::BlurAlgorithm::GAUSSIAN; + } else { + return renderengine::RenderEngine::BlurAlgorithm::KAWASE; + } +} + void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { ATRACE_CALL(); ALOGI( "SurfaceFlinger's main thread ready to run. " @@ -836,7 +853,7 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { .setImageCacheSize(maxFrameBufferAcquiredBuffers) .setEnableProtectedContext(enable_protected_contents(false)) .setPrecacheToneMapperShaderOnly(false) - .setSupportsBackgroundBlur(mSupportsBlur) + .setBlurAlgorithm(chooseBlurAlgorithm(mSupportsBlur)) .setContextPriority( useContextPriority ? renderengine::RenderEngine::ContextPriority::REALTIME |