summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-01-12 12:50:50 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-01-12 12:50:50 -0800
commit853548287ffe4eb85d1bd10669270292336d137a (patch)
treef0781707ff2f3ee30b8b7ecd3c841f3ca9ea16c1
parentcf894c91a9b6c7749c9bb325c9e54336b97df900 (diff)
parent57066eb64c9a190d1afc87bb060bbb2d31e5b86c (diff)
downloadframeworks_base-853548287ffe4eb85d1bd10669270292336d137a.zip
frameworks_base-853548287ffe4eb85d1bd10669270292336d137a.tar.gz
frameworks_base-853548287ffe4eb85d1bd10669270292336d137a.tar.bz2
Merge "Cleanup GL objects on the correct thread." into honeycomb
-rw-r--r--core/java/android/view/GLES20Canvas.java3
-rw-r--r--core/java/android/view/GLES20Layer.java2
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp10
-rw-r--r--libs/hwui/Caches.cpp26
-rw-r--r--libs/hwui/Caches.h14
-rw-r--r--libs/hwui/LayerRenderer.cpp6
-rw-r--r--libs/hwui/LayerRenderer.h1
7 files changed, 58 insertions, 4 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 8c4e654..7dd6cc6 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -160,7 +160,8 @@ class GLES20Canvas extends HardwareCanvas {
static native void nResizeLayer(int layerId, int layerTextureId, int width, int height,
int[] layerInfo);
static native void nDestroyLayer(int layerId, int layerTextureId);
-
+ static native void nDestroyLayerDeferred(int layerId, int layerTextureId);
+
///////////////////////////////////////////////////////////////////////////
// Canvas management
///////////////////////////////////////////////////////////////////////////
diff --git a/core/java/android/view/GLES20Layer.java b/core/java/android/view/GLES20Layer.java
index 336e07a..7587657 100644
--- a/core/java/android/view/GLES20Layer.java
+++ b/core/java/android/view/GLES20Layer.java
@@ -128,7 +128,7 @@ class GLES20Layer extends HardwareLayer {
protected void finalize() throws Throwable {
try {
if (mLayerId != 0 || mLayerTextureId != 0) {
- GLES20Canvas.nDestroyLayer(mLayerId, mLayerTextureId);
+ GLES20Canvas.nDestroyLayerDeferred(mLayerId, mLayerTextureId);
}
} finally {
super.finalize();
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index d6991e6..4aed9b1 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -501,6 +501,11 @@ static void android_view_GLES20Canvas_destroyLayer(JNIEnv* env,
LayerRenderer::destroyLayer(layerId, layerTextureId);
}
+static void android_view_GLES20Canvas_destroyLayerDeferred(JNIEnv* env,
+ jobject clazz, jint layerId, jint layerTextureId) {
+ LayerRenderer::destroyLayerDeferred(layerId, layerTextureId);
+}
+
static void android_view_GLES20Canvas_drawLayer(JNIEnv* env,
jobject canvas, OpenGLRenderer* renderer,
jfloat left, jfloat top, jfloat right, jfloat bottom,
@@ -593,13 +598,14 @@ static JNINativeMethod gMethods[] = {
{ "nGetDisplayListRenderer", "(I)I", (void*) android_view_GLES20Canvas_getDisplayListRenderer },
{ "nDrawDisplayList", "(II)V", (void*) android_view_GLES20Canvas_drawDisplayList },
- { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt },
- { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume },
+ { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt },
+ { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume },
{ "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer },
{ "nCreateLayer", "(II[I)I", (void*) android_view_GLES20Canvas_createLayer },
{ "nResizeLayer", "(IIII[I)V", (void*) android_view_GLES20Canvas_resizeLayer },
{ "nDestroyLayer", "(II)V", (void*) android_view_GLES20Canvas_destroyLayer },
+ { "nDestroyLayerDeferred", "(II)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
{ "nDrawLayer", "(IFFFFIFFI)V",
(void*) android_view_GLES20Canvas_drawLayer },
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 406d09f..3563064 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -106,6 +106,32 @@ void Caches::clearGarbage() {
textureCache.clearGarbage();
gradientCache.clearGarbage();
pathCache.clearGarbage();
+
+ Mutex::Autolock _l(mGarbageLock);
+
+ size_t count = mFboGarbage.size();
+ for (size_t i = 0; i < count; i++) {
+ GLuint fbo = mFboGarbage.itemAt(i);
+ if (fbo) glDeleteFramebuffers(1, &fbo);
+ }
+ mFboGarbage.clear();
+
+ count = mTextureGarbage.size();
+ for (size_t i = 0; i < count; i++) {
+ GLuint texture = mTextureGarbage.itemAt(i);
+ if (texture) glDeleteTextures(1, &texture);
+ }
+ mTextureGarbage.clear();
+}
+
+void Caches::deleteFboDeferred(GLuint fbo) {
+ Mutex::Autolock _l(mGarbageLock);
+ mFboGarbage.push(fbo);
+}
+
+void Caches::deleteTextureDeferred(GLuint texture) {
+ Mutex::Autolock _l(mGarbageLock);
+ mTextureGarbage.push(texture);
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 318c120..34f48c9 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -90,6 +90,10 @@ class Caches: public Singleton<Caches> {
TextureVertex* mRegionMesh;
GLuint mRegionMeshIndices;
+ mutable Mutex mGarbageLock;
+ Vector<GLuint> mFboGarbage;
+ Vector<GLuint> mTextureGarbage;
+
public:
/**
* Indicates whether the renderer is in debug mode.
@@ -106,6 +110,16 @@ public:
void clearGarbage();
/**
+ * Can be used to delete an FBO from a non EGL thread.
+ */
+ void deleteFboDeferred(GLuint fbo);
+
+ /**
+ * Can be used to delete a texture from a non EGL thread.
+ */
+ void deleteTextureDeferred(GLuint texture);
+
+ /**
* Binds the VBO used to render simple textured quads.
*/
void bindMeshBuffer();
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index a15165d..d309ade 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -116,5 +116,11 @@ void LayerRenderer::destroyLayer(GLuint fbo, GLuint texture) {
if (texture) glDeleteTextures(1, &texture);
}
+void LayerRenderer::destroyLayerDeferred(GLuint fbo, GLuint texture) {
+ Caches& caches = Caches::getInstance();
+ if (fbo) caches.deleteFboDeferred(fbo);
+ if (texture) caches.deleteTextureDeferred(texture);
+}
+
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/LayerRenderer.h b/libs/hwui/LayerRenderer.h
index a8f1ff7..800931a 100644
--- a/libs/hwui/LayerRenderer.h
+++ b/libs/hwui/LayerRenderer.h
@@ -42,6 +42,7 @@ public:
static void resizeLayer(GLuint fbo, GLuint texture, uint32_t width, uint32_t height,
uint32_t* layerWidth, uint32_t* layerHeight);
static void destroyLayer(GLuint fbo, GLuint texture);
+ static void destroyLayerDeferred(GLuint fbo, GLuint texture);
private:
GLuint mFbo;