OSDN Git Service

Generate the SurfaceFlinger shader cache on initialization
authorRiley Andrews <riandrews@google.com>
Mon, 29 Sep 2014 20:29:40 +0000 (13:29 -0700)
committerRiley Andrews <riandrews@google.com>
Thu, 2 Oct 2014 01:30:28 +0000 (01:30 +0000)
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

services/surfaceflinger/RenderEngine/ProgramCache.cpp
services/surfaceflinger/RenderEngine/ProgramCache.h

index d130506..0de5cca 100644 (file)
@@ -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,
index e8b9dcd..1fa53d3 100644 (file)
@@ -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