Loading core/java/android/view/GLES20Canvas.java +2 −1 Original line number Diff line number Diff line Loading @@ -160,6 +160,7 @@ 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 Loading core/java/android/view/GLES20Layer.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading core/jni/android_view_GLES20Canvas.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -600,6 +605,7 @@ static JNINativeMethod gMethods[] = { { "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 }, Loading libs/hwui/Caches.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -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); } /////////////////////////////////////////////////////////////////////////////// Loading libs/hwui/Caches.h +14 −0 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -105,6 +109,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. */ Loading Loading
core/java/android/view/GLES20Canvas.java +2 −1 Original line number Diff line number Diff line Loading @@ -160,6 +160,7 @@ 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 Loading
core/java/android/view/GLES20Layer.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading
core/jni/android_view_GLES20Canvas.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -600,6 +605,7 @@ static JNINativeMethod gMethods[] = { { "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 }, Loading
libs/hwui/Caches.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -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); } /////////////////////////////////////////////////////////////////////////////// Loading
libs/hwui/Caches.h +14 −0 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -105,6 +109,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. */ Loading