Loading core/jni/android_view_GLES20Canvas.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -629,7 +629,7 @@ static void android_view_GLES20Canvas_resetDisplayListRenderer(JNIEnv* env, static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, jobject clazz, DisplayList* displayList) { jobject clazz, DisplayList* displayList) { delete displayList; DisplayList::destroyDisplayListDeferred(displayList); } } static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, Loading libs/hwui/Caches.cpp +13 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <utils/String8.h> #include <utils/String8.h> #include "Caches.h" #include "Caches.h" #include "DisplayListRenderer.h" #include "Properties.h" #include "Properties.h" #include "LayerRenderer.h" #include "LayerRenderer.h" Loading Loading @@ -178,6 +179,13 @@ void Caches::clearGarbage() { LayerRenderer::destroyLayer(layer); LayerRenderer::destroyLayer(layer); } } mLayerGarbage.clear(); mLayerGarbage.clear(); count = mDisplayListGarbage.size(); for (size_t i = 0; i < count; i++) { DisplayList* displayList = mDisplayListGarbage.itemAt(i); delete displayList; } mDisplayListGarbage.clear(); } } void Caches::deleteLayerDeferred(Layer* layer) { void Caches::deleteLayerDeferred(Layer* layer) { Loading @@ -185,6 +193,11 @@ void Caches::deleteLayerDeferred(Layer* layer) { mLayerGarbage.push(layer); mLayerGarbage.push(layer); } } void Caches::deleteDisplayListDeferred(DisplayList* displayList) { Mutex::Autolock _l(mGarbageLock); mDisplayListGarbage.push(displayList); } void Caches::flush(FlushMode mode) { void Caches::flush(FlushMode mode) { FLUSH_LOGD("Flushing caches (mode %d)", mode); FLUSH_LOGD("Flushing caches (mode %d)", mode); Loading libs/hwui/Caches.h +8 −0 Original line number Original line Diff line number Diff line Loading @@ -84,6 +84,8 @@ struct CacheLogger { // Caches // Caches /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class DisplayList; class ANDROID_API Caches: public Singleton<Caches> { class ANDROID_API Caches: public Singleton<Caches> { Caches(); Caches(); Loading @@ -99,6 +101,7 @@ class ANDROID_API Caches: public Singleton<Caches> { mutable Mutex mGarbageLock; mutable Mutex mGarbageLock; Vector<Layer*> mLayerGarbage; Vector<Layer*> mLayerGarbage; Vector<DisplayList*> mDisplayListGarbage; public: public: enum FlushMode { enum FlushMode { Loading Loading @@ -144,6 +147,11 @@ public: */ */ void deleteLayerDeferred(Layer* layer); void deleteLayerDeferred(Layer* layer); /* * Can be used to delete a display list from a non EGL thread. */ void deleteDisplayListDeferred(DisplayList* layer); /** /** * Binds the VBO used to render simple textured quads. * Binds the VBO used to render simple textured quads. */ */ Loading libs/hwui/DisplayListRenderer.cpp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -96,6 +96,13 @@ DisplayList::~DisplayList() { clearResources(); clearResources(); } } void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { if (displayList) { DISPLAY_LIST_LOGD("Deferring display list destruction"); Caches::getInstance().deleteDisplayListDeferred(displayList); } } void DisplayList::clearResources() { void DisplayList::clearResources() { sk_free((void*) mReader.base()); sk_free((void*) mReader.base()); Loading libs/hwui/DisplayListRenderer.h +4 −4 Original line number Original line Diff line number Diff line Loading @@ -107,16 +107,16 @@ public: static const char* OP_NAMES[]; static const char* OP_NAMES[]; void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); ANDROID_API size_t getSize(); ANDROID_API size_t getSize(); ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); ANDROID_API static void outputLogBuffer(int fd); void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0); bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0); void output(OpenGLRenderer& renderer, uint32_t level = 0); void output(OpenGLRenderer& renderer, uint32_t level = 0); ANDROID_API static void outputLogBuffer(int fd); void setRenderable(bool renderable) { void setRenderable(bool renderable) { mIsRenderable = renderable; mIsRenderable = renderable; } } Loading Loading
core/jni/android_view_GLES20Canvas.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -629,7 +629,7 @@ static void android_view_GLES20Canvas_resetDisplayListRenderer(JNIEnv* env, static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, jobject clazz, DisplayList* displayList) { jobject clazz, DisplayList* displayList) { delete displayList; DisplayList::destroyDisplayListDeferred(displayList); } } static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, Loading
libs/hwui/Caches.cpp +13 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <utils/String8.h> #include <utils/String8.h> #include "Caches.h" #include "Caches.h" #include "DisplayListRenderer.h" #include "Properties.h" #include "Properties.h" #include "LayerRenderer.h" #include "LayerRenderer.h" Loading Loading @@ -178,6 +179,13 @@ void Caches::clearGarbage() { LayerRenderer::destroyLayer(layer); LayerRenderer::destroyLayer(layer); } } mLayerGarbage.clear(); mLayerGarbage.clear(); count = mDisplayListGarbage.size(); for (size_t i = 0; i < count; i++) { DisplayList* displayList = mDisplayListGarbage.itemAt(i); delete displayList; } mDisplayListGarbage.clear(); } } void Caches::deleteLayerDeferred(Layer* layer) { void Caches::deleteLayerDeferred(Layer* layer) { Loading @@ -185,6 +193,11 @@ void Caches::deleteLayerDeferred(Layer* layer) { mLayerGarbage.push(layer); mLayerGarbage.push(layer); } } void Caches::deleteDisplayListDeferred(DisplayList* displayList) { Mutex::Autolock _l(mGarbageLock); mDisplayListGarbage.push(displayList); } void Caches::flush(FlushMode mode) { void Caches::flush(FlushMode mode) { FLUSH_LOGD("Flushing caches (mode %d)", mode); FLUSH_LOGD("Flushing caches (mode %d)", mode); Loading
libs/hwui/Caches.h +8 −0 Original line number Original line Diff line number Diff line Loading @@ -84,6 +84,8 @@ struct CacheLogger { // Caches // Caches /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// class DisplayList; class ANDROID_API Caches: public Singleton<Caches> { class ANDROID_API Caches: public Singleton<Caches> { Caches(); Caches(); Loading @@ -99,6 +101,7 @@ class ANDROID_API Caches: public Singleton<Caches> { mutable Mutex mGarbageLock; mutable Mutex mGarbageLock; Vector<Layer*> mLayerGarbage; Vector<Layer*> mLayerGarbage; Vector<DisplayList*> mDisplayListGarbage; public: public: enum FlushMode { enum FlushMode { Loading Loading @@ -144,6 +147,11 @@ public: */ */ void deleteLayerDeferred(Layer* layer); void deleteLayerDeferred(Layer* layer); /* * Can be used to delete a display list from a non EGL thread. */ void deleteDisplayListDeferred(DisplayList* layer); /** /** * Binds the VBO used to render simple textured quads. * Binds the VBO used to render simple textured quads. */ */ Loading
libs/hwui/DisplayListRenderer.cpp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -96,6 +96,13 @@ DisplayList::~DisplayList() { clearResources(); clearResources(); } } void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { if (displayList) { DISPLAY_LIST_LOGD("Deferring display list destruction"); Caches::getInstance().deleteDisplayListDeferred(displayList); } } void DisplayList::clearResources() { void DisplayList::clearResources() { sk_free((void*) mReader.base()); sk_free((void*) mReader.base()); Loading
libs/hwui/DisplayListRenderer.h +4 −4 Original line number Original line Diff line number Diff line Loading @@ -107,16 +107,16 @@ public: static const char* OP_NAMES[]; static const char* OP_NAMES[]; void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); ANDROID_API size_t getSize(); ANDROID_API size_t getSize(); ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); ANDROID_API static void outputLogBuffer(int fd); void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0); bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0); void output(OpenGLRenderer& renderer, uint32_t level = 0); void output(OpenGLRenderer& renderer, uint32_t level = 0); ANDROID_API static void outputLogBuffer(int fd); void setRenderable(bool renderable) { void setRenderable(bool renderable) { mIsRenderable = renderable; mIsRenderable = renderable; } } Loading