diff options
author | 2024-04-29 20:22:42 +0000 | |
---|---|---|
committer | 2024-05-22 15:14:33 +0000 | |
commit | 3348c74c8e5cf51ea48a6f86e891c003cc2e3d5a (patch) | |
tree | 4d9b4feed5e1530a5f1ba9ce572abc6cee752ab1 | |
parent | 4994e61d4378f7bba1e60a680aae872a6b651ce1 (diff) |
Create more expressive shader cache config.
Devices such as Wear and others may not need one of the many portions of
the cache that are available by default. Rather than simply configuring
just HDR and / or the entire cache, we offer a more nuanced
configuration that can be turned off via system properties.
Bug: 325045840
Test: Local wear builds with different configuration settings.
Change-Id: I0aded11eeab45d3684979f24c12f3676deb6d27b
-rw-r--r-- | libs/renderengine/include/renderengine/RenderEngine.h | 17 | ||||
-rw-r--r-- | libs/renderengine/include/renderengine/mock/RenderEngine.h | 2 | ||||
-rw-r--r-- | libs/renderengine/skia/Cache.cpp | 66 | ||||
-rw-r--r-- | libs/renderengine/skia/Cache.h | 11 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.cpp | 4 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.h | 2 | ||||
-rw-r--r-- | libs/renderengine/tests/RenderEngineTest.cpp | 4 | ||||
-rw-r--r-- | libs/renderengine/tests/RenderEngineThreadedTest.cpp | 21 | ||||
-rw-r--r-- | libs/renderengine/threaded/RenderEngineThreaded.cpp | 29 | ||||
-rw-r--r-- | libs/renderengine/threaded/RenderEngineThreaded.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 29 |
11 files changed, 137 insertions, 50 deletions
diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index 980d913d40..7207394356 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -88,6 +88,21 @@ enum class Protection { PROTECTED = 2, }; +// Toggles for skipping or enabling priming of particular shaders. +struct PrimeCacheConfig { + bool cacheHolePunchLayer = true; + bool cacheSolidLayers = true; + bool cacheSolidDimmedLayers = true; + bool cacheImageLayers = true; + bool cacheImageDimmedLayers = true; + bool cacheClippedLayers = true; + bool cacheShadowLayers = true; + bool cachePIPImageLayers = true; + bool cacheTransparentImageDimmedLayers = true; + bool cacheClippedDimmedImageLayers = true; + bool cacheUltraHDR = true; +}; + class RenderEngine { public: enum class ContextPriority { @@ -145,7 +160,7 @@ public: // This interface, while still in use until a suitable replacement is built, // should be considered deprecated, minus some methods which still may be // used to support legacy behavior. - virtual std::future<void> primeCache(bool shouldPrimeUltraHDR) = 0; + virtual std::future<void> primeCache(PrimeCacheConfig config) = 0; // dump the extension strings. always call the base class. virtual void dump(std::string& result) = 0; diff --git a/libs/renderengine/include/renderengine/mock/RenderEngine.h b/libs/renderengine/include/renderengine/mock/RenderEngine.h index a58a65ca9f..a8c242a86f 100644 --- a/libs/renderengine/include/renderengine/mock/RenderEngine.h +++ b/libs/renderengine/include/renderengine/mock/RenderEngine.h @@ -33,7 +33,7 @@ public: RenderEngine(); ~RenderEngine() override; - MOCK_METHOD1(primeCache, std::future<void>(bool)); + MOCK_METHOD1(primeCache, std::future<void>(PrimeCacheConfig)); MOCK_METHOD1(dump, void(std::string&)); MOCK_CONST_METHOD0(getMaxTextureSize, size_t()); MOCK_CONST_METHOD0(getMaxViewportDims, size_t()); diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp index abe0d9b0a6..d2468700e4 100644 --- a/libs/renderengine/skia/Cache.cpp +++ b/libs/renderengine/skia/Cache.cpp @@ -630,7 +630,7 @@ static void drawP3ImageLayers(SkiaRenderEngine* renderengine, const DisplaySetti // kFlushAfterEveryLayer = true // in external/skia/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp // gPrintSKSL = true -void Cache::primeShaderCache(SkiaRenderEngine* renderengine, bool shouldPrimeUltraHDR) { +void Cache::primeShaderCache(SkiaRenderEngine* renderengine, PrimeCacheConfig config) { const int previousCount = renderengine->reportShadersCompiled(); if (previousCount) { ALOGD("%d Shaders already compiled before Cache::primeShaderCache ran\n", previousCount); @@ -694,13 +694,24 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine, bool shouldPrimeUlt impl::ExternalTexture>(srcBuffer, *renderengine, impl::ExternalTexture::Usage::READABLE | impl::ExternalTexture::Usage::WRITEABLE); - drawHolePunchLayer(renderengine, display, dstTexture); - drawSolidLayers(renderengine, display, dstTexture); - drawSolidLayers(renderengine, p3Display, dstTexture); - drawSolidDimmedLayers(renderengine, display, dstTexture); - drawShadowLayers(renderengine, display, srcTexture); - drawShadowLayers(renderengine, p3Display, srcTexture); + if (config.cacheHolePunchLayer) { + drawHolePunchLayer(renderengine, display, dstTexture); + } + + if (config.cacheSolidLayers) { + drawSolidLayers(renderengine, display, dstTexture); + drawSolidLayers(renderengine, p3Display, dstTexture); + } + + if (config.cacheSolidDimmedLayers) { + drawSolidDimmedLayers(renderengine, display, dstTexture); + } + + if (config.cacheShadowLayers) { + drawShadowLayers(renderengine, display, srcTexture); + drawShadowLayers(renderengine, p3Display, srcTexture); + } if (renderengine->supportsBackgroundBlur()) { drawBlurLayers(renderengine, display, dstTexture); @@ -737,27 +748,40 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine, bool shouldPrimeUlt } for (auto texture : textures) { - drawImageLayers(renderengine, display, dstTexture, texture); + if (config.cacheImageLayers) { + drawImageLayers(renderengine, display, dstTexture, texture); + } - drawImageDimmedLayers(renderengine, display, dstTexture, texture); - drawImageDimmedLayers(renderengine, p3Display, dstTexture, texture); - drawImageDimmedLayers(renderengine, bt2020Display, dstTexture, texture); + if (config.cacheImageDimmedLayers) { + drawImageDimmedLayers(renderengine, display, dstTexture, texture); + drawImageDimmedLayers(renderengine, p3Display, dstTexture, texture); + drawImageDimmedLayers(renderengine, bt2020Display, dstTexture, texture); + } - // Draw layers for b/185569240. - drawClippedLayers(renderengine, display, dstTexture, texture); + if (config.cacheClippedLayers) { + // Draw layers for b/185569240. + drawClippedLayers(renderengine, display, dstTexture, texture); + } } - drawPIPImageLayer(renderengine, display, dstTexture, externalTexture); + if (config.cachePIPImageLayers) { + drawPIPImageLayer(renderengine, display, dstTexture, externalTexture); + } - drawTransparentImageDimmedLayers(renderengine, bt2020Display, dstTexture, externalTexture); - drawTransparentImageDimmedLayers(renderengine, display, dstTexture, externalTexture); - drawTransparentImageDimmedLayers(renderengine, p3Display, dstTexture, externalTexture); - drawTransparentImageDimmedLayers(renderengine, p3DisplayEnhance, dstTexture, - externalTexture); + if (config.cacheTransparentImageDimmedLayers) { + drawTransparentImageDimmedLayers(renderengine, bt2020Display, dstTexture, + externalTexture); + drawTransparentImageDimmedLayers(renderengine, display, dstTexture, externalTexture); + drawTransparentImageDimmedLayers(renderengine, p3Display, dstTexture, externalTexture); + drawTransparentImageDimmedLayers(renderengine, p3DisplayEnhance, dstTexture, + externalTexture); + } - drawClippedDimmedImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); + if (config.cacheClippedDimmedImageLayers) { + drawClippedDimmedImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); + } - if (shouldPrimeUltraHDR) { + if (config.cacheUltraHDR) { drawBT2020ClippedImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); drawBT2020ImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); diff --git a/libs/renderengine/skia/Cache.h b/libs/renderengine/skia/Cache.h index 62f6705c89..259432f91c 100644 --- a/libs/renderengine/skia/Cache.h +++ b/libs/renderengine/skia/Cache.h @@ -16,16 +16,21 @@ #pragma once -namespace android::renderengine::skia { +namespace android::renderengine { + +struct PrimeCacheConfig; + +namespace skia { class SkiaRenderEngine; class Cache { public: - static void primeShaderCache(SkiaRenderEngine*, bool shouldPrimeUltraHDR); + static void primeShaderCache(SkiaRenderEngine*, PrimeCacheConfig config); private: Cache() = default; }; -} // namespace android::renderengine::skia +} // namespace skia +} // namespace android::renderengine diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp index 325a91178a..befca35483 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaRenderEngine.cpp @@ -246,8 +246,8 @@ namespace skia { using base::StringAppendF; -std::future<void> SkiaRenderEngine::primeCache(bool shouldPrimeUltraHDR) { - Cache::primeShaderCache(this, shouldPrimeUltraHDR); +std::future<void> SkiaRenderEngine::primeCache(PrimeCacheConfig config) { + Cache::primeShaderCache(this, config); return {}; } diff --git a/libs/renderengine/skia/SkiaRenderEngine.h b/libs/renderengine/skia/SkiaRenderEngine.h index 38db8100dc..c8f9241257 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.h +++ b/libs/renderengine/skia/SkiaRenderEngine.h @@ -62,7 +62,7 @@ public: SkiaRenderEngine(Threaded, PixelFormat pixelFormat, BlurAlgorithm); ~SkiaRenderEngine() override; - std::future<void> primeCache(bool shouldPrimeUltraHDR) override final; + std::future<void> primeCache(PrimeCacheConfig config) override final; void cleanupPostRender() override final; bool supportsBackgroundBlur() override final { return mBlurFilter != nullptr; diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index cb8b016e12..4dcaff9ec8 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -3141,7 +3141,9 @@ TEST_P(RenderEngineTest, primeShaderCache) { } initializeRenderEngine(); - auto fut = mRE->primeCache(false); + PrimeCacheConfig config; + config.cacheUltraHDR = false; + auto fut = mRE->primeCache(config); if (fut.valid()) { fut.wait(); } diff --git a/libs/renderengine/tests/RenderEngineThreadedTest.cpp b/libs/renderengine/tests/RenderEngineThreadedTest.cpp index d56dbb2a7b..bdd94023cc 100644 --- a/libs/renderengine/tests/RenderEngineThreadedTest.cpp +++ b/libs/renderengine/tests/RenderEngineThreadedTest.cpp @@ -25,6 +25,7 @@ namespace android { +using renderengine::PrimeCacheConfig; using testing::_; using testing::Eq; using testing::Mock; @@ -48,9 +49,25 @@ TEST_F(RenderEngineThreadedTest, dump) { mThreadedRE->dump(testString); } +MATCHER_P(EqConfig, other, "Equality for prime cache config") { + return arg.cacheHolePunchLayer == other.cacheHolePunchLayer && + arg.cacheSolidLayers == other.cacheSolidLayers && + arg.cacheSolidDimmedLayers == other.cacheSolidDimmedLayers && + arg.cacheImageLayers == other.cacheImageLayers && + arg.cacheImageDimmedLayers == other.cacheImageDimmedLayers && + arg.cacheClippedLayers == other.cacheClippedLayers && + arg.cacheShadowLayers == other.cacheShadowLayers && + arg.cachePIPImageLayers == other.cachePIPImageLayers && + arg.cacheTransparentImageDimmedLayers == other.cacheTransparentImageDimmedLayers && + arg.cacheClippedDimmedImageLayers == other.cacheClippedDimmedImageLayers && + arg.cacheUltraHDR == other.cacheUltraHDR; +} + TEST_F(RenderEngineThreadedTest, primeCache) { - EXPECT_CALL(*mRenderEngine, primeCache(false)); - mThreadedRE->primeCache(false); + PrimeCacheConfig config; + config.cacheUltraHDR = false; + EXPECT_CALL(*mRenderEngine, primeCache(EqConfig(config))); + mThreadedRE->primeCache(config); // need to call ANY synchronous function after primeCache to ensure that primeCache has // completed asynchronously before the test completes execution. mThreadedRE->getContextPriority(); diff --git a/libs/renderengine/threaded/RenderEngineThreaded.cpp b/libs/renderengine/threaded/RenderEngineThreaded.cpp index f4cebc05ec..d27c151e72 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.cpp +++ b/libs/renderengine/threaded/RenderEngineThreaded.cpp @@ -130,7 +130,7 @@ void RenderEngineThreaded::waitUntilInitialized() const { } } -std::future<void> RenderEngineThreaded::primeCache(bool shouldPrimeUltraHDR) { +std::future<void> RenderEngineThreaded::primeCache(PrimeCacheConfig config) { const auto resultPromise = std::make_shared<std::promise<void>>(); std::future<void> resultFuture = resultPromise->get_future(); ATRACE_CALL(); @@ -138,20 +138,19 @@ std::future<void> RenderEngineThreaded::primeCache(bool shouldPrimeUltraHDR) { // for the futures. { std::lock_guard lock(mThreadMutex); - mFunctionCalls.push( - [resultPromise, shouldPrimeUltraHDR](renderengine::RenderEngine& instance) { - ATRACE_NAME("REThreaded::primeCache"); - if (setSchedFifo(false) != NO_ERROR) { - ALOGW("Couldn't set SCHED_OTHER for primeCache"); - } - - instance.primeCache(shouldPrimeUltraHDR); - resultPromise->set_value(); - - if (setSchedFifo(true) != NO_ERROR) { - ALOGW("Couldn't set SCHED_FIFO for primeCache"); - } - }); + mFunctionCalls.push([resultPromise, config](renderengine::RenderEngine& instance) { + ATRACE_NAME("REThreaded::primeCache"); + if (setSchedFifo(false) != NO_ERROR) { + ALOGW("Couldn't set SCHED_OTHER for primeCache"); + } + + instance.primeCache(config); + resultPromise->set_value(); + + if (setSchedFifo(true) != NO_ERROR) { + ALOGW("Couldn't set SCHED_FIFO for primeCache"); + } + }); } mCondition.notify_one(); diff --git a/libs/renderengine/threaded/RenderEngineThreaded.h b/libs/renderengine/threaded/RenderEngineThreaded.h index d440c961e7..d4997d6c93 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.h +++ b/libs/renderengine/threaded/RenderEngineThreaded.h @@ -41,7 +41,7 @@ public: RenderEngineThreaded(CreateInstanceFactory factory); ~RenderEngineThreaded() override; - std::future<void> primeCache(bool shouldPrimeUltraHDR) override; + std::future<void> primeCache(PrimeCacheConfig config) override; void dump(std::string& result) override; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 9d29c416cd..bd5accc0f3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -938,9 +938,34 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { } mRenderEnginePrimeCacheFuture.callOnce([this] { - const bool shouldPrimeUltraHDR = + renderengine::PrimeCacheConfig config; + config.cacheHolePunchLayer = + base::GetBoolProperty("debug.sf.prime_shader_cache.hole_punch"s, true); + config.cacheSolidLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.solid_layers"s, true); + config.cacheSolidDimmedLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.solid_dimmed_layers"s, true); + config.cacheImageLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.image_layers"s, true); + config.cacheImageDimmedLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.image_dimmed_layers"s, true); + config.cacheClippedLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.clipped_layers"s, true); + config.cacheShadowLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.shadow_layers"s, true); + config.cachePIPImageLayers = + base::GetBoolProperty("debug.sf.prime_shader_cache.pip_image_layers"s, true); + config.cacheTransparentImageDimmedLayers = base:: + GetBoolProperty("debug.sf.prime_shader_cache.transparent_image_dimmed_layers"s, + true); + config.cacheClippedDimmedImageLayers = base:: + GetBoolProperty("debug.sf.prime_shader_cache.clipped_dimmed_image_layers"s, + true); + // ro.surface_flinger.prime_chader_cache.ultrahdr exists as a previous ro property + // which we maintain for backwards compatibility. + config.cacheUltraHDR = base::GetBoolProperty("ro.surface_flinger.prime_shader_cache.ultrahdr"s, false); - return getRenderEngine().primeCache(shouldPrimeUltraHDR); + return getRenderEngine().primeCache(config); }); if (setSchedFifo(true) != NO_ERROR) { |