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

Commit 3667800c authored by Jerry Chang's avatar Jerry Chang
Browse files

SF: guard texture view update tolerance logic with small area allow list

Make sure the texture view update tolerance logic for refresh rate
heuristic only applies to apps in the small area detection allow list.

Bug: 307419914
Test: presubmit
Change-Id: Ieefdc4abe8c6ae8389035914fea4737e00cceeb4
parent 43881b0f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -3255,7 +3255,7 @@ bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,

    // If the layer had been updated a TextureView, this would make sure the present time could be
    // same to TextureView update when it's a small dirty, and get the correct heuristic rate.
    if (mFlinger->mScheduler->supportSmallDirtyDetection()) {
    if (mFlinger->mScheduler->supportSmallDirtyDetection(mOwnerAppId)) {
        if (mDrawingState.useVsyncIdForRefreshRateSelection) {
            mUsedVsyncIdForRefreshRateSelection = true;
        }
@@ -3288,7 +3288,7 @@ void Layer::recordLayerHistoryBufferUpdate(const scheduler::LayerProps& layerPro
            }
        }

        if (!mFlinger->mScheduler->supportSmallDirtyDetection()) {
        if (!mFlinger->mScheduler->supportSmallDirtyDetection(mOwnerAppId)) {
            return static_cast<nsecs_t>(0);
        }

@@ -4431,7 +4431,7 @@ void Layer::updateLastLatchTime(nsecs_t latchTime) {
void Layer::setIsSmallDirty(const Region& damageRegion,
                            const ui::Transform& layerToDisplayTransform) {
    mSmallDirty = false;
    if (!mFlinger->mScheduler->supportSmallDirtyDetection()) {
    if (!mFlinger->mScheduler->supportSmallDirtyDetection(mOwnerAppId)) {
        return;
    }

+1 −1
Original line number Diff line number Diff line
@@ -1221,7 +1221,7 @@ void Scheduler::updateSmallAreaDetection(
}

void Scheduler::setSmallAreaDetectionThreshold(int32_t appId, float threshold) {
    mSmallAreaDetectionAllowMappings.setThesholdForAppId(appId, threshold);
    mSmallAreaDetectionAllowMappings.setThresholdForAppId(appId, threshold);
}

bool Scheduler::isSmallDirtyArea(int32_t appId, uint32_t dirtyArea) {
+4 −3
Original line number Diff line number Diff line
@@ -320,9 +320,10 @@ public:

    bool updateFrameRateOverrides(GlobalSignals, Fps displayRefreshRate) EXCLUDES(mPolicyLock);

    // Returns true if the small dirty detection is enabled.
    bool supportSmallDirtyDetection() const {
        return mFeatures.test(Feature::kSmallDirtyContentDetection);
    // Returns true if the small dirty detection is enabled for the appId.
    bool supportSmallDirtyDetection(int32_t appId) {
        return mFeatures.test(Feature::kSmallDirtyContentDetection) &&
                mSmallAreaDetectionAllowMappings.getThresholdForAppId(appId).has_value();
    }

    // Injects a delay that is a fraction of the predicted frame duration for the next frame.
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ void SmallAreaDetectionAllowMappings::update(
    }
}

void SmallAreaDetectionAllowMappings::setThesholdForAppId(int32_t appId, float threshold) {
void SmallAreaDetectionAllowMappings::setThresholdForAppId(int32_t appId, float threshold) {
    if (!isValidThreshold(threshold)) return;

    std::lock_guard lock(mLock);
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ class SmallAreaDetectionAllowMappings {

public:
    void update(std::vector<std::pair<int32_t, float>>& appIdThresholdMappings);
    void setThesholdForAppId(int32_t appId, float threshold) EXCLUDES(mLock);
    void setThresholdForAppId(int32_t appId, float threshold) EXCLUDES(mLock);
    std::optional<float> getThresholdForAppId(int32_t uid) EXCLUDES(mLock);

private:
Loading