summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jason Sams <rjsams@android.com> 2011-01-05 03:37:48 -0800
committer Jason Sams <rjsams@android.com> 2011-01-05 03:37:48 -0800
commit49945c0ff653d210951fdff51f23835314b64aeb (patch)
tree4b537b89d7cb9c0b2b2476504ec54dbefc4b9a15
parente4c453dd1e48ce1f986bc3e0e0df6f15cbeef55a (diff)
fix bug 3313505
Shader cache cleanup could occur in wrong thread during RS teardown. Change-Id: Iffed41de046147db30885e6815826e3b640020c1
-rw-r--r--libs/rs/rsContext.cpp1
-rw-r--r--libs/rs/rsShaderCache.cpp10
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();
}