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

Commit 947d34ec authored by Marissa Wall's avatar Marissa Wall Committed by Valerie Hau
Browse files

Change slot generation for BufferState

BufferState layers now do slot generation with buffer death considered
appropriately.  When a buffer dies, the slot will be pushed onto a stack
of available slots to be reused at the next opportunity.  This should
mimic BufferQueue slot behavior and prevent Composer Resources from
growing too large.

Test: build, boot, manual
Bug: 129351223

Change-Id: Icef9592593cacb0b5c6b12f6679fc2c4dabdcd19
parent 1688f524
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ public:
                                     const sp<IBinder>& applyToken,
                                     const InputWindowCommands& commands,
                                     int64_t desiredPresentTime,
                                     const cached_buffer_t& uncacheBuffer,
                                     const client_cache_t& uncacheBuffer,
                                     const std::vector<ListenerCallbacks>& listenerCallbacks) {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
@@ -88,8 +88,8 @@ public:
        data.writeStrongBinder(applyToken);
        commands.write(data);
        data.writeInt64(desiredPresentTime);
        data.writeStrongBinder(uncacheBuffer.token);
        data.writeUint64(uncacheBuffer.cacheId);
        data.writeWeakBinder(uncacheBuffer.token);
        data.writeUint64(uncacheBuffer.id);

        if (data.writeVectorSize(listenerCallbacks) == NO_ERROR) {
            for (const auto& [listener, callbackIds] : listenerCallbacks) {
@@ -991,9 +991,9 @@ status_t BnSurfaceComposer::onTransact(

            int64_t desiredPresentTime = data.readInt64();

            cached_buffer_t uncachedBuffer;
            uncachedBuffer.token = data.readStrongBinder();
            uncachedBuffer.cacheId = data.readUint64();
            client_cache_t uncachedBuffer;
            uncachedBuffer.token = data.readWeakBinder();
            uncachedBuffer.id = data.readUint64();

            std::vector<ListenerCallbacks> listenerCallbacks;
            int32_t listenersSize = data.readInt32();
+4 −4
Original line number Diff line number Diff line
@@ -87,8 +87,8 @@ status_t layer_state_t::write(Parcel& output) const
           colorTransform.asArray(), 16 * sizeof(float));
    output.writeFloat(cornerRadius);
    output.writeBool(hasListenerCallbacks);
    output.writeStrongBinder(cachedBuffer.token);
    output.writeUint64(cachedBuffer.cacheId);
    output.writeWeakBinder(cachedBuffer.token);
    output.writeUint64(cachedBuffer.id);
    output.writeParcelable(metadata);

    output.writeFloat(bgColorAlpha);
@@ -157,8 +157,8 @@ status_t layer_state_t::read(const Parcel& input)
    colorTransform = mat4(static_cast<const float*>(input.readInplace(16 * sizeof(float))));
    cornerRadius = input.readFloat();
    hasListenerCallbacks = input.readBool();
    cachedBuffer.token = input.readStrongBinder();
    cachedBuffer.cacheId = input.readUint64();
    cachedBuffer.token = input.readWeakBinder();
    cachedBuffer.id = input.readUint64();
    input.readParcelable(&metadata);

    bgColorAlpha = input.readFloat();
+3 −3
Original line number Diff line number Diff line
@@ -387,9 +387,9 @@ void SurfaceComposerClient::doDropReferenceTransaction(const sp<IBinder>& handle
void SurfaceComposerClient::doUncacheBufferTransaction(uint64_t cacheId) {
    sp<ISurfaceComposer> sf(ComposerService::getComposerService());

    cached_buffer_t uncacheBuffer;
    client_cache_t uncacheBuffer;
    uncacheBuffer.token = BufferCache::getInstance().getToken();
    uncacheBuffer.cacheId = cacheId;
    uncacheBuffer.id = cacheId;

    sf->setTransactionState({}, {}, 0, nullptr, {}, -1, uncacheBuffer, {});
}
@@ -422,7 +422,7 @@ void SurfaceComposerClient::Transaction::cacheBuffers() {
        }
        s->what |= layer_state_t::eCachedBufferChanged;
        s->cachedBuffer.token = BufferCache::getInstance().getToken();
        s->cachedBuffer.cacheId = cacheId;
        s->cachedBuffer.id = cacheId;

        // If we have more buffers than the size of the cache, we should stop caching so we don't
        // evict other buffers in this transaction
+2 −2
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@
namespace android {
// ----------------------------------------------------------------------------

struct cached_buffer_t;
struct client_cache_t;
struct ComposerState;
struct DisplayState;
struct DisplayInfo;
@@ -137,7 +137,7 @@ public:
                                     const sp<IBinder>& applyToken,
                                     const InputWindowCommands& inputWindowCommands,
                                     int64_t desiredPresentTime,
                                     const cached_buffer_t& uncacheBuffer,
                                     const client_cache_t& uncacheBuffer,
                                     const std::vector<ListenerCallbacks>& listenerCallbacks) = 0;

    /* signal that we're done booting.
+8 −4
Original line number Diff line number Diff line
@@ -40,9 +40,13 @@ namespace android {
class Parcel;
class ISurfaceComposerClient;

struct cached_buffer_t {
    sp<IBinder> token = nullptr;
    uint64_t cacheId;
struct client_cache_t {
    wp<IBinder> token = nullptr;
    uint64_t id;

    bool operator==(const client_cache_t& other) const { return id == other.id; }

    bool isValid() const { return token != nullptr; }
};

/*
@@ -187,7 +191,7 @@ struct layer_state_t {
    InputWindowInfo inputInfo;
#endif

    cached_buffer_t cachedBuffer;
    client_cache_t cachedBuffer;

    LayerMetadata metadata;

Loading