Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12981923 authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Additional layer logging" into lmp-dev

parents e03ddd0b bfd1cd62
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -342,6 +342,7 @@ void Caches::clearGarbage() {

void Caches::deleteLayerDeferred(Layer* layer) {
    Mutex::Autolock _l(mGarbageLock);
    layer->state = Layer::kState_InGarbageList;
    mLayerGarbage.push(layer);
}

+2 −1
Original line number Diff line number Diff line
@@ -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) {
+11 −0
Original line number Diff line number Diff line
@@ -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();

+5 −0
Original line number Diff line number Diff line
@@ -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;
}

+13 −6
Original line number Diff line number Diff line
@@ -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);
    }
}