diff options
| author | 2023-10-13 13:25:11 +0000 | |
|---|---|---|
| committer | 2023-10-16 16:32:13 +0000 | |
| commit | b9b5b706d449212094fd020dfd30509234a8c0b4 (patch) | |
| tree | 32d0f4c85ede8394f6a7c285cb382f7f81c2a4d0 | |
| parent | fd028785dbe4e2281b798ae9a93e93b8c9ea4104 (diff) | |
RenderEngine, SF: gate HDR priming behind property
This should make it so that devices which do not see any benefit from
priming those shaders can avoid computing them at boot time.
Bug: b/295257834
Test: manual - delta of -37 shaders generated before/after this patch
Test: atest librenderengine_test
Change-Id: I01962b690d636def86c1ebed40187eaf74ab0246
| -rw-r--r-- | libs/renderengine/include/renderengine/RenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/include/renderengine/mock/RenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/skia/Cache.cpp | 20 | ||||
| -rw-r--r-- | libs/renderengine/skia/Cache.h | 2 | ||||
| -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 | 2 | ||||
| -rw-r--r-- | libs/renderengine/tests/RenderEngineThreadedTest.cpp | 4 | ||||
| -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 | 4 |
11 files changed, 40 insertions, 33 deletions
diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index b992d82fdb..818d0350c0 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -107,7 +107,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() = 0; + virtual std::future<void> primeCache(bool shouldPrimeUltraHDR) = 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 160006d5e6..a58a65ca9f 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_METHOD0(primeCache, std::future<void>()); + MOCK_METHOD1(primeCache, std::future<void>(bool)); 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 25296f06ee..abe0d9b0a6 100644 --- a/libs/renderengine/skia/Cache.cpp +++ b/libs/renderengine/skia/Cache.cpp @@ -17,6 +17,7 @@ #include "AutoBackendTexture.h" #include "SkiaRenderEngine.h" #include "android-base/unique_fd.h" +#include "cutils/properties.h" #include "renderengine/DisplaySettings.h" #include "renderengine/LayerSettings.h" #include "renderengine/impl/ExternalTexture.h" @@ -629,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) { +void Cache::primeShaderCache(SkiaRenderEngine* renderengine, bool shouldPrimeUltraHDR) { const int previousCount = renderengine->reportShadersCompiled(); if (previousCount) { ALOGD("%d Shaders already compiled before Cache::primeShaderCache ran\n", previousCount); @@ -755,16 +756,19 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { externalTexture); drawClippedDimmedImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); - drawBT2020ClippedImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); - drawBT2020ImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); - drawBT2020ImageLayers(renderengine, p3Display, dstTexture, externalTexture); + if (shouldPrimeUltraHDR) { + drawBT2020ClippedImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); - drawExtendedHDRImageLayers(renderengine, display, dstTexture, externalTexture); - drawExtendedHDRImageLayers(renderengine, p3Display, dstTexture, externalTexture); - drawExtendedHDRImageLayers(renderengine, p3DisplayEnhance, dstTexture, externalTexture); + drawBT2020ImageLayers(renderengine, bt2020Display, dstTexture, externalTexture); + drawBT2020ImageLayers(renderengine, p3Display, dstTexture, externalTexture); - drawP3ImageLayers(renderengine, p3DisplayEnhance, dstTexture, externalTexture); + drawExtendedHDRImageLayers(renderengine, display, dstTexture, externalTexture); + drawExtendedHDRImageLayers(renderengine, p3Display, dstTexture, externalTexture); + drawExtendedHDRImageLayers(renderengine, p3DisplayEnhance, dstTexture, externalTexture); + + drawP3ImageLayers(renderengine, p3DisplayEnhance, dstTexture, externalTexture); + } // draw one final layer synchronously to force GL submit LayerSettings layer{ diff --git a/libs/renderengine/skia/Cache.h b/libs/renderengine/skia/Cache.h index 437571e616..62f6705c89 100644 --- a/libs/renderengine/skia/Cache.h +++ b/libs/renderengine/skia/Cache.h @@ -22,7 +22,7 @@ class SkiaRenderEngine; class Cache { public: - static void primeShaderCache(SkiaRenderEngine*); + static void primeShaderCache(SkiaRenderEngine*, bool shouldPrimeUltraHDR); private: Cache() = default; diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp index 7ec98eab97..3729be6ca2 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaRenderEngine.cpp @@ -243,8 +243,8 @@ namespace skia { using base::StringAppendF; -std::future<void> SkiaRenderEngine::primeCache() { - Cache::primeShaderCache(this); +std::future<void> SkiaRenderEngine::primeCache(bool shouldPrimeUltraHDR) { + Cache::primeShaderCache(this, shouldPrimeUltraHDR); return {}; } diff --git a/libs/renderengine/skia/SkiaRenderEngine.h b/libs/renderengine/skia/SkiaRenderEngine.h index 3db0c1b58b..ac134afa64 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.h +++ b/libs/renderengine/skia/SkiaRenderEngine.h @@ -62,7 +62,7 @@ public: SkiaRenderEngine(RenderEngineType type, PixelFormat pixelFormat, bool supportsBackgroundBlur); ~SkiaRenderEngine() override; - std::future<void> primeCache() override final; + std::future<void> primeCache(bool shouldPrimeUltraHDR) 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 6023808aaf..11d4fdebdc 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -3204,7 +3204,7 @@ TEST_P(RenderEngineTest, primeShaderCache) { } initializeRenderEngine(); - auto fut = mRE->primeCache(); + auto fut = mRE->primeCache(false); if (fut.valid()) { fut.wait(); } diff --git a/libs/renderengine/tests/RenderEngineThreadedTest.cpp b/libs/renderengine/tests/RenderEngineThreadedTest.cpp index 7289fe721d..1b9adba063 100644 --- a/libs/renderengine/tests/RenderEngineThreadedTest.cpp +++ b/libs/renderengine/tests/RenderEngineThreadedTest.cpp @@ -50,8 +50,8 @@ TEST_F(RenderEngineThreadedTest, dump) { } TEST_F(RenderEngineThreadedTest, primeCache) { - EXPECT_CALL(*mRenderEngine, primeCache()); - mThreadedRE->primeCache(); + EXPECT_CALL(*mRenderEngine, primeCache(false)); + mThreadedRE->primeCache(false); // 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 786a6fef12..367bee89f9 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.cpp +++ b/libs/renderengine/threaded/RenderEngineThreaded.cpp @@ -129,7 +129,7 @@ void RenderEngineThreaded::waitUntilInitialized() const { mInitializedCondition.wait(lock, [=] { return mIsInitialized; }); } -std::future<void> RenderEngineThreaded::primeCache() { +std::future<void> RenderEngineThreaded::primeCache(bool shouldPrimeUltraHDR) { const auto resultPromise = std::make_shared<std::promise<void>>(); std::future<void> resultFuture = resultPromise->get_future(); ATRACE_CALL(); @@ -137,19 +137,20 @@ std::future<void> RenderEngineThreaded::primeCache() { // for the futures. { std::lock_guard lock(mThreadMutex); - mFunctionCalls.push([resultPromise](renderengine::RenderEngine& instance) { - ATRACE_NAME("REThreaded::primeCache"); - if (setSchedFifo(false) != NO_ERROR) { - ALOGW("Couldn't set SCHED_OTHER for primeCache"); - } - - instance.primeCache(); - resultPromise->set_value(); - - if (setSchedFifo(true) != NO_ERROR) { - ALOGW("Couldn't set SCHED_FIFO for primeCache"); - } - }); + 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"); + } + }); } mCondition.notify_one(); diff --git a/libs/renderengine/threaded/RenderEngineThreaded.h b/libs/renderengine/threaded/RenderEngineThreaded.h index 1093f5fad3..74af2bd776 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.h +++ b/libs/renderengine/threaded/RenderEngineThreaded.h @@ -42,7 +42,7 @@ public: RenderEngineThreaded(CreateInstanceFactory factory, RenderEngineType type); ~RenderEngineThreaded() override; - std::future<void> primeCache() override; + std::future<void> primeCache(bool shouldPrimeUltraHDR) override; void dump(std::string& result) override; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 1ea4bcd70a..9c2ce94855 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -869,7 +869,9 @@ void SurfaceFlinger::init() FTL_FAKE_GUARD(kMainThreadContext) { ALOGW("Can't set SCHED_OTHER for primeCache"); } - mRenderEnginePrimeCacheFuture = getRenderEngine().primeCache(); + bool shouldPrimeUltraHDR = + base::GetBoolProperty("ro.surface_flinger.prime_shader_cache.ultrahdr"s, false); + mRenderEnginePrimeCacheFuture = getRenderEngine().primeCache(shouldPrimeUltraHDR); if (setSchedFifo(true) != NO_ERROR) { ALOGW("Can't set SCHED_OTHER for primeCache"); |