summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorGiulio Cervera <giulio.cervera@gmail.com>2012-05-02 11:36:02 +0200
committerGiulio Cervera <giulio.cervera@gmail.com>2012-05-02 11:36:02 +0200
commit19c597ffb5549f8273818c466cfca4b863f63259 (patch)
tree6fb9c81c396164c758fca0cf1a85e7b34b543b17 /libs
parent129c3bf1d857aac47ee20063d73fe1abffa1f3e3 (diff)
parent75b2e6d76e1354c7f0279f8b3927d849f28ba80a (diff)
downloadframeworks_base-19c597ffb5549f8273818c466cfca4b863f63259.zip
frameworks_base-19c597ffb5549f8273818c466cfca4b863f63259.tar.gz
frameworks_base-19c597ffb5549f8273818c466cfca4b863f63259.tar.bz2
Merge remote-tracking branch 'github/ics' into ics_chocolate_M8260AAABQNLZA30150
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/Caches.cpp13
-rw-r--r--libs/hwui/Caches.h8
-rw-r--r--libs/hwui/DisplayListRenderer.cpp7
-rw-r--r--libs/hwui/DisplayListRenderer.h8
4 files changed, 32 insertions, 4 deletions
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index f293cba..d0c84bb 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -20,6 +20,7 @@
#include <utils/String8.h>
#include "Caches.h"
+#include "DisplayListRenderer.h"
#include "Properties.h"
#include "LayerRenderer.h"
@@ -178,6 +179,13 @@ void Caches::clearGarbage() {
LayerRenderer::destroyLayer(layer);
}
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) {
@@ -185,6 +193,11 @@ void Caches::deleteLayerDeferred(Layer* layer) {
mLayerGarbage.push(layer);
}
+void Caches::deleteDisplayListDeferred(DisplayList* displayList) {
+ Mutex::Autolock _l(mGarbageLock);
+ mDisplayListGarbage.push(displayList);
+}
+
void Caches::flush(FlushMode mode) {
FLUSH_LOGD("Flushing caches (mode %d)", mode);
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 5e58a9e..5a8b84f 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -84,6 +84,8 @@ struct CacheLogger {
// Caches
///////////////////////////////////////////////////////////////////////////////
+class DisplayList;
+
class ANDROID_API Caches: public Singleton<Caches> {
Caches();
@@ -99,6 +101,7 @@ class ANDROID_API Caches: public Singleton<Caches> {
mutable Mutex mGarbageLock;
Vector<Layer*> mLayerGarbage;
+ Vector<DisplayList*> mDisplayListGarbage;
public:
enum FlushMode {
@@ -144,6 +147,11 @@ public:
*/
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.
*/
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index 3372d1c..163df5b 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -96,6 +96,13 @@ DisplayList::~DisplayList() {
clearResources();
}
+void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
+ if (displayList) {
+ DISPLAY_LIST_LOGD("Deferring display list destruction");
+ Caches::getInstance().deleteDisplayListDeferred(displayList);
+ }
+}
+
void DisplayList::clearResources() {
sk_free((void*) mReader.base());
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index ab475bf..3053eaa 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -107,16 +107,16 @@ public:
static const char* OP_NAMES[];
- void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
-
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);
void output(OpenGLRenderer& renderer, uint32_t level = 0);
- ANDROID_API static void outputLogBuffer(int fd);
-
void setRenderable(bool renderable) {
mIsRenderable = renderable;
}