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