summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiley Andrews <riandrews@google.com>2014-09-29 13:29:40 -0700
committerRom Lemarchand <romlem@google.com>2014-10-03 17:21:15 +0000
commit6747be9fab9981ec24729cede5e0fe779e8b8914 (patch)
tree2b390bc3c92a3226246d12579a10f8b36f03e209
parentf05ef4e542c3041379025e16497ff23710de5dbf (diff)
downloadnative-6747be9fab9981ec24729cede5e0fe779e8b8914.tar.gz
Generate the SurfaceFlinger shader cache on initialization
Blobcache is not yet enabled for surfaceflinger (as it should be). As a temporary workaround, generate all needed shaders during surfaceflinger initialization instead of doing the compilation on-demand during ui transitions. Change-Id: I14455b20a3f85f177d85c9c8b76d8ccc35379b39
-rw-r--r--services/surfaceflinger/RenderEngine/ProgramCache.cpp33
-rw-r--r--services/surfaceflinger/RenderEngine/ProgramCache.h2
2 files changed, 34 insertions, 1 deletions
diff --git a/services/surfaceflinger/RenderEngine/ProgramCache.cpp b/services/surfaceflinger/RenderEngine/ProgramCache.cpp
index d1305067b6..0de5cca293 100644
--- a/services/surfaceflinger/RenderEngine/ProgramCache.cpp
+++ b/services/surfaceflinger/RenderEngine/ProgramCache.cpp
@@ -77,13 +77,44 @@ Formatter& dedent(Formatter& f) {
ANDROID_SINGLETON_STATIC_INSTANCE(ProgramCache)
-
ProgramCache::ProgramCache() {
+ // Until surfaceflinger has a dependable blob cache on the filesystem,
+ // generate shaders on initialization so as to avoid jank.
+ primeCache();
}
ProgramCache::~ProgramCache() {
}
+void ProgramCache::primeCache() {
+ uint32_t shaderCount = 0;
+ uint32_t keyMask = Key::BLEND_MASK | Key::OPACITY_MASK |
+ Key::PLANE_ALPHA_MASK | Key::TEXTURE_MASK;
+ // Prime the cache for all combinations of the above masks,
+ // leaving off the experimental color matrix mask options.
+
+ nsecs_t timeBefore = systemTime();
+ for (uint32_t keyVal = 0; keyVal <= keyMask; keyVal++) {
+ Key shaderKey;
+ shaderKey.set(keyMask, keyVal);
+ uint32_t tex = shaderKey.getTextureTarget();
+ if (tex != Key::TEXTURE_OFF &&
+ tex != Key::TEXTURE_EXT &&
+ tex != Key::TEXTURE_2D) {
+ continue;
+ }
+ Program* program = mCache.valueFor(shaderKey);
+ if (program == NULL) {
+ program = generateProgram(shaderKey);
+ mCache.add(shaderKey, program);
+ shaderCount++;
+ }
+ }
+ nsecs_t timeAfter = systemTime();
+ float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6;
+ ALOGD("shader cache generated - %u shaders in %f ms\n", shaderCount, compileTimeMs);
+}
+
ProgramCache::Key ProgramCache::computeKey(const Description& description) {
Key needs;
needs.set(Key::TEXTURE_MASK,
diff --git a/services/surfaceflinger/RenderEngine/ProgramCache.h b/services/surfaceflinger/RenderEngine/ProgramCache.h
index e8b9dcd788..1fa53d3379 100644
--- a/services/surfaceflinger/RenderEngine/ProgramCache.h
+++ b/services/surfaceflinger/RenderEngine/ProgramCache.h
@@ -112,6 +112,8 @@ public:
void useProgram(const Description& description);
private:
+ // Generate shaders to populate the cache
+ void primeCache();
// compute a cache Key from a Description
static Key computeKey(const Description& description);
// generates a program from the Key