OSDN Git Service

Revert "Deleting objects on the wrong thread is a silly idea Bug #7195815"
authorDave Burke <daveburke@google.com>
Wed, 26 Sep 2012 03:30:09 +0000 (20:30 -0700)
committerThe Android Automerger <android-build@android.com>
Wed, 26 Sep 2012 03:47:10 +0000 (20:47 -0700)
This reverts commit 8a1374946a928fcba7495c87ff6adda327fdfb9f

Change-Id: I53564a6c531d334afcc1fce0bea1e57ae266aa78

libs/hwui/Layer.cpp
libs/hwui/Layer.h
libs/hwui/LayerRenderer.cpp
libs/hwui/LayerRenderer.h
libs/hwui/ResourceCache.cpp

index cd2e571..fb525ee 100644 (file)
@@ -19,7 +19,6 @@
 #include <utils/Log.h>
 
 #include "Layer.h"
-#include "LayerRenderer.h"
 #include "OpenGLRenderer.h"
 #include "Caches.h"
 
@@ -47,14 +46,17 @@ Layer::~Layer() {
     if (mesh) delete mesh;
     if (meshIndices) delete meshIndices;
     if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter);
-    if (fbo) {
-        LayerRenderer::flushLayer(this);
-        Caches::getInstance().fboCache.put(fbo);
-        fbo = 0;
-    }
+    if (fbo) Caches::getInstance().fboCache.put(fbo);
     deleteTexture();
 }
 
+void Layer::freeResourcesLocked() {
+    if (colorFilter) {
+        Caches::getInstance().resourceCache.decrementRefcountLocked(colorFilter);
+        colorFilter = NULL;
+    }
+}
+
 void Layer::setPaint(SkPaint* paint) {
     OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
 }
@@ -69,5 +71,7 @@ void Layer::setColorFilter(SkiaColorFilter* filter) {
     }
 }
 
+
+
 }; // namespace uirenderer
 }; // namespace android
index 4618b95..d2cd440 100644 (file)
@@ -48,6 +48,8 @@ struct Layer {
     Layer(const uint32_t layerWidth, const uint32_t layerHeight);
     ~Layer();
 
+    void freeResourcesLocked();
+
     /**
      * Sets this layer's region to a rectangle. Computes the appropriate
      * texture coordinates.
index c581041..799aea3 100644 (file)
@@ -299,6 +299,13 @@ void LayerRenderer::destroyLayer(Layer* layer) {
         LAYER_RENDERER_LOGD("Recycling layer, %dx%d fbo = %d",
                 layer->getWidth(), layer->getHeight(), layer->getFbo());
 
+        GLuint fbo = layer->getFbo();
+        if (fbo) {
+            flushLayer(layer);
+            Caches::getInstance().fboCache.put(fbo);
+            layer->setFbo(0);
+        }
+
         if (!Caches::getInstance().layerCache.put(layer)) {
             LAYER_RENDERER_LOGD("  Destroyed!");
             Caches::getInstance().resourceCache.decrementRefcount(layer);
@@ -315,6 +322,7 @@ void LayerRenderer::destroyLayer(Layer* layer) {
 void LayerRenderer::destroyLayerDeferred(Layer* layer) {
     if (layer) {
         LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->getFbo());
+
         Caches::getInstance().deleteLayerDeferred(layer);
     }
 }
index acedbcc..392f863 100644 (file)
@@ -60,8 +60,6 @@ public:
     ANDROID_API static void destroyLayerDeferred(Layer* layer);
     ANDROID_API static bool copyLayer(Layer* layer, SkBitmap* bitmap);
 
-    static void flushLayer(Layer* layer);
-
 protected:
     virtual bool hasLayer();
     virtual Region* getRegion();
@@ -71,6 +69,8 @@ protected:
 private:
     void generateMesh();
 
+    static void flushLayer(Layer* layer);
+
     Layer* mLayer;
 }; // class LayerRenderer
 
index 39e64bc..18d8324 100644 (file)
@@ -325,9 +325,9 @@ void ResourceCache::deleteResourceReferenceLocked(void* resource, ResourceRefere
             }
             break;
             case kLayer: {
-                // No need to check for hasInstance, layers only exist
-                // when we have a Caches instance
-                Caches::getInstance().deleteLayerDeferred((Layer*) resource);
+                Layer* layer = (Layer*) resource;
+                layer->freeResourcesLocked();
+                delete layer;
             }
             break;
         }