Loading libs/hwui/Caches.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -342,6 +342,7 @@ void Caches::clearGarbage() { void Caches::deleteLayerDeferred(Layer* layer) { Mutex::Autolock _l(mGarbageLock); layer->state = Layer::kState_InGarbageList; mLayerGarbage.push(layer); } Loading libs/hwui/Layer.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,8 @@ namespace android { namespace uirenderer { Layer::Layer(Type layerType, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight) : caches(Caches::getInstance()) : state(kState_Uncached) , caches(Caches::getInstance()) , renderState(renderState) , texture(caches) , type(layerType) { Loading libs/hwui/Layer.h +11 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,17 @@ public: kType_DisplayList, }; // layer lifecycle, controlled from outside enum State { kState_Uncached = 0, kState_InCache = 1, kState_FailedToCache = 2, kState_RemovedFromCache = 3, kState_DeletedFromCache = 4, kState_InGarbageList = 5, }; State state; // public for logging/debugging purposes Layer(Type type, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight); ~Layer(); Loading libs/hwui/LayerCache.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ void LayerCache::deleteLayer(Layer* layer) { LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(), layer->getFbo()); mSize -= layer->getWidth() * layer->getHeight() * 4; layer->state = Layer::kState_DeletedFromCache; Caches::getInstance().resourceCache.decrementRefcount(layer); } } Loading @@ -106,6 +107,7 @@ Layer* LayerCache::get(RenderState& renderState, const uint32_t width, const uin mCache.removeAt(index); layer = entry.mLayer; layer->state = Layer::kState_RemovedFromCache; mSize -= layer->getWidth() * layer->getHeight() * 4; LAYER_LOGD("Reusing layer %dx%d", layer->getWidth(), layer->getHeight()); Loading Loading @@ -166,8 +168,11 @@ bool LayerCache::put(Layer* layer) { mCache.add(entry); mSize += size; layer->state = Layer::kState_InCache; return true; } layer->state = Layer::kState_FailedToCache; return false; } Loading libs/hwui/RenderState.cpp +13 −6 Original line number Diff line number Diff line Loading @@ -39,13 +39,16 @@ void RenderState::onGLContextCreated() { void RenderState::onGLContextDestroyed() { AutoMutex _lock(mLayerLock); if (CC_UNLIKELY(!mActiveLayers.empty())) { size_t size = mActiveLayers.size(); if (CC_UNLIKELY(size != 0)) { ALOGE("Crashing, have %d contexts and %d layers at context destruction. isempty %d", mRegisteredContexts.size(), size, mActiveLayers.empty()); mCaches->dumpMemoryUsage(); for (std::set<renderthread::CanvasContext*>::iterator cit = mRegisteredContexts.begin(); cit != mRegisteredContexts.end(); cit++) { renderthread::CanvasContext* context = *cit; ALOGD("Context: %p (root = %p)", context, context->mRootRenderNode.get()); ALOGD(" Prefeteched layers: %zu", context->mPrefetechedLayers.size()); ALOGE("Context: %p (root = %p)", context, context->mRootRenderNode.get()); ALOGE(" Prefeteched layers: %zu", context->mPrefetechedLayers.size()); for (std::set<RenderNode*>::iterator pit = context->mPrefetechedLayers.begin(); pit != context->mPrefetechedLayers.end(); pit++) { (*pit)->debugDumpLayers(" "); Loading @@ -53,13 +56,17 @@ void RenderState::onGLContextDestroyed() { context->mRootRenderNode->debugDumpLayers(" "); } if (mActiveLayers.begin() == mActiveLayers.end()) { ALOGE("set has become empty. wat."); } for (std::set<const Layer*>::iterator lit = mActiveLayers.begin(); lit != mActiveLayers.end(); lit++) { const Layer* layer = *(lit); ALOGD("Layer %p, fbo %d, buildlayered %d", layer, layer->getFbo(), layer->wasBuildLayered); ALOGE("Layer %p, state %d, texlayer %d, fbo %d, buildlayered %d", layer, layer->state, layer->isTextureLayer(), layer->getFbo(), layer->wasBuildLayered); } LOG_ALWAYS_FATAL("layers have survived gl context destruction"); LOG_ALWAYS_FATAL("%d layers have survived gl context destruction", size); } } Loading Loading
libs/hwui/Caches.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -342,6 +342,7 @@ void Caches::clearGarbage() { void Caches::deleteLayerDeferred(Layer* layer) { Mutex::Autolock _l(mGarbageLock); layer->state = Layer::kState_InGarbageList; mLayerGarbage.push(layer); } Loading
libs/hwui/Layer.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,8 @@ namespace android { namespace uirenderer { Layer::Layer(Type layerType, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight) : caches(Caches::getInstance()) : state(kState_Uncached) , caches(Caches::getInstance()) , renderState(renderState) , texture(caches) , type(layerType) { Loading
libs/hwui/Layer.h +11 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,17 @@ public: kType_DisplayList, }; // layer lifecycle, controlled from outside enum State { kState_Uncached = 0, kState_InCache = 1, kState_FailedToCache = 2, kState_RemovedFromCache = 3, kState_DeletedFromCache = 4, kState_InGarbageList = 5, }; State state; // public for logging/debugging purposes Layer(Type type, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight); ~Layer(); Loading
libs/hwui/LayerCache.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ void LayerCache::deleteLayer(Layer* layer) { LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(), layer->getFbo()); mSize -= layer->getWidth() * layer->getHeight() * 4; layer->state = Layer::kState_DeletedFromCache; Caches::getInstance().resourceCache.decrementRefcount(layer); } } Loading @@ -106,6 +107,7 @@ Layer* LayerCache::get(RenderState& renderState, const uint32_t width, const uin mCache.removeAt(index); layer = entry.mLayer; layer->state = Layer::kState_RemovedFromCache; mSize -= layer->getWidth() * layer->getHeight() * 4; LAYER_LOGD("Reusing layer %dx%d", layer->getWidth(), layer->getHeight()); Loading Loading @@ -166,8 +168,11 @@ bool LayerCache::put(Layer* layer) { mCache.add(entry); mSize += size; layer->state = Layer::kState_InCache; return true; } layer->state = Layer::kState_FailedToCache; return false; } Loading
libs/hwui/RenderState.cpp +13 −6 Original line number Diff line number Diff line Loading @@ -39,13 +39,16 @@ void RenderState::onGLContextCreated() { void RenderState::onGLContextDestroyed() { AutoMutex _lock(mLayerLock); if (CC_UNLIKELY(!mActiveLayers.empty())) { size_t size = mActiveLayers.size(); if (CC_UNLIKELY(size != 0)) { ALOGE("Crashing, have %d contexts and %d layers at context destruction. isempty %d", mRegisteredContexts.size(), size, mActiveLayers.empty()); mCaches->dumpMemoryUsage(); for (std::set<renderthread::CanvasContext*>::iterator cit = mRegisteredContexts.begin(); cit != mRegisteredContexts.end(); cit++) { renderthread::CanvasContext* context = *cit; ALOGD("Context: %p (root = %p)", context, context->mRootRenderNode.get()); ALOGD(" Prefeteched layers: %zu", context->mPrefetechedLayers.size()); ALOGE("Context: %p (root = %p)", context, context->mRootRenderNode.get()); ALOGE(" Prefeteched layers: %zu", context->mPrefetechedLayers.size()); for (std::set<RenderNode*>::iterator pit = context->mPrefetechedLayers.begin(); pit != context->mPrefetechedLayers.end(); pit++) { (*pit)->debugDumpLayers(" "); Loading @@ -53,13 +56,17 @@ void RenderState::onGLContextDestroyed() { context->mRootRenderNode->debugDumpLayers(" "); } if (mActiveLayers.begin() == mActiveLayers.end()) { ALOGE("set has become empty. wat."); } for (std::set<const Layer*>::iterator lit = mActiveLayers.begin(); lit != mActiveLayers.end(); lit++) { const Layer* layer = *(lit); ALOGD("Layer %p, fbo %d, buildlayered %d", layer, layer->getFbo(), layer->wasBuildLayered); ALOGE("Layer %p, state %d, texlayer %d, fbo %d, buildlayered %d", layer, layer->state, layer->isTextureLayer(), layer->getFbo(), layer->wasBuildLayered); } LOG_ALWAYS_FATAL("layers have survived gl context destruction"); LOG_ALWAYS_FATAL("%d layers have survived gl context destruction", size); } } Loading