summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Bruno BELANYI <ambroisie@google.com> 2023-10-13 13:25:11 +0000
committer Bruno BELANYI <ambroisie@google.com> 2023-10-16 16:32:13 +0000
commitb9b5b706d449212094fd020dfd30509234a8c0b4 (patch)
tree32d0f4c85ede8394f6a7c285cb382f7f81c2a4d0
parentfd028785dbe4e2281b798ae9a93e93b8c9ea4104 (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.h2
-rw-r--r--libs/renderengine/include/renderengine/mock/RenderEngine.h2
-rw-r--r--libs/renderengine/skia/Cache.cpp20
-rw-r--r--libs/renderengine/skia/Cache.h2
-rw-r--r--libs/renderengine/skia/SkiaRenderEngine.cpp4
-rw-r--r--libs/renderengine/skia/SkiaRenderEngine.h2
-rw-r--r--libs/renderengine/tests/RenderEngineTest.cpp2
-rw-r--r--libs/renderengine/tests/RenderEngineThreadedTest.cpp4
-rw-r--r--libs/renderengine/threaded/RenderEngineThreaded.cpp29
-rw-r--r--libs/renderengine/threaded/RenderEngineThreaded.h2
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp4
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");