am 0ea0749a: am e7a5da38: am 093e3412: Merge "Additional layer logging" into lmp-dev
* commit '0ea0749a24070bfec3ea39a0a4ca0a7156f3dfe1': Additional layer logging
This commit is contained in:
@@ -342,6 +342,7 @@ void Caches::clearGarbage() {
|
||||
|
||||
void Caches::deleteLayerDeferred(Layer* layer) {
|
||||
Mutex::Autolock _l(mGarbageLock);
|
||||
layer->state = Layer::kState_InGarbageList;
|
||||
mLayerGarbage.push(layer);
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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(" ");
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user