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

Commit dbdcc59a authored by Yin-Chia Yeh's avatar Yin-Chia Yeh Committed by Automerger Merge Worker
Browse files

Merge "Surface: do not evict outstanding buffer in onBuffersDiscarded" into...

Merge "Surface: do not evict outstanding buffer in onBuffersDiscarded" into rvc-d1-dev am: bad1977d am: fb292aed am: 463e3de2

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

Change-Id: Id57e0f919b9cc9130cef5406ca026e6ddbdb0179
parents 74c453f1 463e3de2
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -732,6 +732,8 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
        mSharedBufferHasBeenQueued = false;
    }

    mDequeuedSlots.insert(buf);

    return OK;
}

@@ -760,6 +762,8 @@ int Surface::cancelBuffer(android_native_buffer_t* buffer,
        mSharedBufferHasBeenQueued = true;
    }

    mDequeuedSlots.erase(i);

    return OK;
}

@@ -895,6 +899,8 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
        ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
    }

    mDequeuedSlots.erase(i);

    if (mEnableFrameTimestamps) {
        mFrameEventHistory->applyDelta(output.frameTimestamps);
        // Update timestamps with the local acquire fence.
@@ -1660,6 +1666,7 @@ int Surface::attachBuffer(ANativeWindowBuffer* buffer)
        mRemovedBuffers.push_back(mSlots[attachedSlot].buffer);
    }
    mSlots[attachedSlot].buffer = graphicBuffer;
    mDequeuedSlots.insert(attachedSlot);

    return NO_ERROR;
}
@@ -1926,6 +1933,10 @@ Dataspace Surface::getBuffersDataSpace() {
}

void Surface::freeAllBuffers() {
    if (!mDequeuedSlots.empty()) {
        ALOGE("%s: %zu buffers were freed while being dequeued!",
                __FUNCTION__, mDequeuedSlots.size());
    }
    for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
        mSlots[i].buffer = nullptr;
    }
@@ -1947,6 +1958,10 @@ status_t Surface::getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots,
            ALOGW("%s: Discarded slot %d doesn't contain buffer!", __FUNCTION__, i);
            continue;
        }
        // Don't flush currently dequeued buffers
        if (mDequeuedSlots.count(i) > 0) {
            continue;
        }
        outBuffers->push_back(mSlots[i].buffer);
        mSlots[i].buffer = nullptr;
    }
+8 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <utils/RefBase.h>

#include <shared_mutex>
#include <unordered_set>

namespace android {

@@ -543,8 +544,15 @@ protected:
    int mMaxBufferCount;

    sp<IProducerListener> mListenerProxy;

    // Get and flush the buffers of given slots, if the buffer in the slot
    // is currently dequeued then it won't be flushed and won't be returned
    // in outBuffers.
    status_t getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots,
            std::vector<sp<GraphicBuffer>>* outBuffers);

    // Buffers that are successfully dequeued/attached and handed to clients
    std::unordered_set<int> mDequeuedSlots;
};

} // namespace android