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

Commit 4ebefa59 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: Ifb770b61b6454fe2af34d2d33a7d0a20588dca12
parents 1fde545e 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 */