diff options
author | Riley Andrews <riandrews@google.com> | 2014-10-02 20:26:21 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-02 20:26:21 +0000 |
commit | 36a4d17104f8a8d4523071d829ac43c8507ced64 (patch) | |
tree | 6f249d003321f67a56d3c8719f27985f526e09a1 /services/surfaceflinger | |
parent | dea558703a737d7e017a4f7991ea7b0367916654 (diff) | |
parent | 6c8339867438c27e468a03995b98481e9e49b274 (diff) | |
download | frameworks_native-36a4d17104f8a8d4523071d829ac43c8507ced64.zip frameworks_native-36a4d17104f8a8d4523071d829ac43c8507ced64.tar.gz frameworks_native-36a4d17104f8a8d4523071d829ac43c8507ced64.tar.bz2 |
am 6c833986: Merge "Generate the SurfaceFlinger shader cache on initialization" into lmp-mr1-dev
* commit '6c8339867438c27e468a03995b98481e9e49b274':
Generate the SurfaceFlinger shader cache on initialization
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/RenderEngine/ProgramCache.cpp | 33 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/ProgramCache.h | 2 |
2 files changed, 34 insertions, 1 deletions
diff --git a/services/surfaceflinger/RenderEngine/ProgramCache.cpp b/services/surfaceflinger/RenderEngine/ProgramCache.cpp index d130506..0de5cca 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 e8b9dcd..1fa53d3 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 |