diff options
author | 2011-01-05 03:37:48 -0800 | |
---|---|---|
committer | 2011-01-05 03:37:48 -0800 | |
commit | 49945c0ff653d210951fdff51f23835314b64aeb (patch) | |
tree | 4b537b89d7cb9c0b2b2476504ec54dbefc4b9a15 | |
parent | e4c453dd1e48ce1f986bc3e0e0df6f15cbeef55a (diff) |
fix bug 3313505
Shader cache cleanup could occur in wrong thread
during RS teardown.
Change-Id: Iffed41de046147db30885e6815826e3b640020c1
-rw-r--r-- | libs/rs/rsContext.cpp | 1 | ||||
-rw-r--r-- | libs/rs/rsShaderCache.cpp | 10 |
2 files changed, 7 insertions, 4 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 22c73fec491c..c437d72fb070 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -535,6 +535,7 @@ void Context::destroyWorkerThreadResources() { mStateFragment.deinit(this); mStateFragmentStore.deinit(this); mStateFont.deinit(this); + mShaderCache.cleanupAll(); } ObjectBase::zeroAllUserRef(this); LOGV("destroyWorkerThreadResources 2"); diff --git a/libs/rs/rsShaderCache.cpp b/libs/rs/rsShaderCache.cpp index 45384c98f247..b958021b37a8 100644 --- a/libs/rs/rsShaderCache.cpp +++ b/libs/rs/rsShaderCache.cpp @@ -32,10 +32,7 @@ ShaderCache::ShaderCache() { } ShaderCache::~ShaderCache() { - for (uint32_t ct=0; ct < mEntries.size(); ct++) { - glDeleteProgram(mEntries[ct]->program); - free(mEntries[ct]); - } + cleanupAll(); } void ShaderCache::updateUniformArrayData(Context *rsc, Program *prog, uint32_t linkedID, @@ -251,5 +248,10 @@ void ShaderCache::cleanupFragment(uint32_t id) { } void ShaderCache::cleanupAll() { + for (uint32_t ct=0; ct < mEntries.size(); ct++) { + glDeleteProgram(mEntries[ct]->program); + free(mEntries[ct]); + } + mEntries.clear(); } |