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

Commit a1595fc5 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add logic to clean up resources more frequently" into sc-dev am: 54fbff34

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14941607

Change-Id: I18bd0685be85a562da4558062bfe1b93b297cf82
parents c055f178 54fbff34
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -210,6 +210,14 @@ void CacheManager::onFrameCompleted() {
    }
}

void CacheManager::performDeferredCleanup(nsecs_t cleanupOlderThanMillis) {
    if (mGrContext) {
        mGrContext->performDeferredCleanup(
            std::chrono::milliseconds(cleanupOlderThanMillis),
            /* scratchResourcesOnly */true);
    }
}

} /* namespace renderthread */
} /* namespace uirenderer */
} /* namespace android */
+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <SkSurface.h>
#include <utils/String8.h>
#include <vector>
#include "utils/TimeUtils.h"

namespace android {

@@ -53,6 +54,8 @@ public:
    size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; }
    void onFrameCompleted();

    void performDeferredCleanup(nsecs_t cleanupOlderThanMillis);

private:
    friend class RenderThread;

+16 −0
Original line number Diff line number Diff line
@@ -461,6 +461,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, int64_t sy
}

void CanvasContext::stopDrawing() {
    cleanupResources();
    mRenderThread.removeFrameCallback(this);
    mAnimationContext->pauseAnimators();
    mGenerationID++;
@@ -619,10 +620,25 @@ nsecs_t CanvasContext::draw() {
        }
    }

    cleanupResources();
    mRenderThread.cacheManager().onFrameCompleted();
    return mCurrentFrameInfo->get(FrameInfoIndex::DequeueBufferDuration);
}

void CanvasContext::cleanupResources() {
    auto& tracker = mJankTracker.frames();
    auto size = tracker.size();
    auto capacity = tracker.capacity();
    if (size == capacity) {
        nsecs_t nowNanos = systemTime(SYSTEM_TIME_MONOTONIC);
        nsecs_t frameCompleteNanos =
            tracker[0].get(FrameInfoIndex::FrameCompleted);
        nsecs_t frameDiffNanos = nowNanos - frameCompleteNanos;
        nsecs_t cleanupMillis = ns2ms(std::max(frameDiffNanos, 10_s));
        mRenderThread.cacheManager().performDeferredCleanup(cleanupMillis);
    }
}

void CanvasContext::reportMetricsWithPresentTime() {
    if (mFrameMetricsReporter == nullptr) {
        return;
+1 −0
Original line number Diff line number Diff line
@@ -312,6 +312,7 @@ private:
    bool mExpectSurfaceStats = false;

    std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
    void cleanupResources();
};

} /* namespace renderthread */