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

Commit 123c796f 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 am: a1595fc5

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

Change-Id: Id7fdd45f36fcfbb4a18ece7287157a3d63ebe301
parents 0ec652b6 a1595fc5
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 */