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

Commit c837b5ec authored by Marissa Wall's avatar Marissa Wall
Browse files

blast: Send transaction listener from SCC to SF

Send the TransactionCompletedListeners to SurfaceFlinger via transactions.
The listener will be used to send callbacks after a transaction has completed.

Test: Transaction_test
Bug: 80477568

Change-Id: I51d3877f2803a192f95db4dd211f48aca9651c30
parent 7a9b6ff7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -634,10 +634,10 @@ status_t BnSurfaceComposer::onTransact(
            if (count > data.dataSize()) {
                return BAD_VALUE;
            }
            ComposerState s;
            Vector<ComposerState> state;
            state.setCapacity(count);
            for (size_t i = 0; i < count; i++) {
                ComposerState s;
                if (s.read(data) == BAD_VALUE) {
                    return BAD_VALUE;
                }
+19 −0
Original line number Diff line number Diff line
@@ -80,6 +80,13 @@ status_t layer_state_t::write(Parcel& output) const
    memcpy(output.writeInplace(16 * sizeof(float)),
           colorTransform.asArray(), 16 * sizeof(float));

    if (output.writeVectorSize(listenerCallbacks) == NO_ERROR) {
        for (const auto& [listener, callbackIds] : listenerCallbacks) {
            output.writeStrongBinder(IInterface::asBinder(listener));
            output.writeInt64Vector(callbackIds);
        }
    }

    return NO_ERROR;
}

@@ -135,6 +142,14 @@ status_t layer_state_t::read(const Parcel& input)

    colorTransform = mat4(static_cast<const float*>(input.readInplace(16 * sizeof(float))));

    int32_t listenersSize = input.readInt32();
    for (int32_t i = 0; i < listenersSize; i++) {
        auto listener = interface_cast<ITransactionCompletedListener>(input.readStrongBinder());
        std::vector<CallbackId> callbackIds;
        input.readInt64Vector(&callbackIds);
        listenerCallbacks.emplace_back(listener, callbackIds);
    }

    return NO_ERROR;
}

@@ -323,6 +338,10 @@ void layer_state_t::merge(const layer_state_t& other) {
        what |= eColorTransformChanged;
        colorTransform = other.colorTransform;
    }
    if (other.what & eListenerCallbacksChanged) {
        what |= eListenerCallbacksChanged;
        listenerCallbacks = other.listenerCallbacks;
    }

    if ((other.what & what) != other.what) {
        ALOGE("Unmerged SurfaceComposer Transaction properties. LayerState::merge needs updating? "
+129 −2
Original line number Diff line number Diff line
@@ -104,13 +104,23 @@ void ComposerService::composerServiceDied()
// to be able to return a sp<> to its instance to pass to SurfaceFlinger.
// ANDROID_SINGLETON_STATIC_INSTANCE only allows a reference to an instance.

// 0 is an invalid callback id
TransactionCompletedListener::TransactionCompletedListener() : mCallbackIdCounter(1) {}

CallbackId TransactionCompletedListener::getNextIdLocked() {
    return mCallbackIdCounter++;
}

sp<TransactionCompletedListener> TransactionCompletedListener::getInstance() {
    static sp<TransactionCompletedListener> sInstance = new TransactionCompletedListener;
    return sInstance;
}

void TransactionCompletedListener::startListening() {
    std::lock_guard lock(mMutex);
sp<ITransactionCompletedListener> TransactionCompletedListener::getIInstance() {
    return static_cast<sp<ITransactionCompletedListener>>(getInstance());
}

void TransactionCompletedListener::startListeningLocked() {
    if (mListening) {
        return;
    }
@@ -118,6 +128,16 @@ void TransactionCompletedListener::startListening() {
    mListening = true;
}

CallbackId TransactionCompletedListener::addCallback(
        const TransactionCompletedCallbackWithContext& callback) {
    std::lock_guard<std::mutex> lock(mMutex);
    startListeningLocked();

    CallbackId callbackId = getNextIdLocked();
    mCallbacks.emplace(callbackId, callback);
    return callbackId;
}

void TransactionCompletedListener::onTransactionCompleted() {
    return;
}
@@ -153,6 +173,17 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Tr
    }
    other.mDisplayStates.clear();

    for (const auto& [listener, callbackInfo] : other.mListenerCallbacks) {
        auto& [callbackIds, surfaceControls] = callbackInfo;
        mListenerCallbacks[listener].callbackIds.insert(std::make_move_iterator(
                                                                callbackIds.begin()),
                                                        std::make_move_iterator(callbackIds.end()));
        mListenerCallbacks[listener]
                .surfaceControls.insert(std::make_move_iterator(surfaceControls.begin()),
                                        std::make_move_iterator(surfaceControls.end()));
    }
    other.mListenerCallbacks.clear();

    return *this;
}

@@ -163,6 +194,26 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {

    sp<ISurfaceComposer> sf(ComposerService::getComposerService());

    // For every listener with registered callbacks
    for (const auto& [listener, callbackInfo] : mListenerCallbacks) {
        auto& [callbackIds, surfaceControls] = callbackInfo;
        if (callbackIds.empty()) {
            continue;
        }

        // If the listener has any SurfaceControls set on this Transaction update the surface state
        for (const auto& surfaceControl : surfaceControls) {
            layer_state_t* s = getLayerState(surfaceControl);
            if (!s) {
                ALOGE("failed to get layer state");
                continue;
            }
            s->what |= layer_state_t::eListenerCallbacksChanged;
            s->listenerCallbacks.emplace_back(listener, std::move(callbackIds));
        }
    }
    mListenerCallbacks.clear();

    Vector<ComposerState> composerStates;
    Vector<DisplayState> displayStates;
    uint32_t flags = 0;
@@ -232,6 +283,11 @@ layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<Surfac
    return &(mComposerStates[sc].state);
}

void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(
        const sp<SurfaceControl>& sc) {
    mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls.insert(sc);
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
        const sp<SurfaceControl>& sc, float x, float y) {
    layer_state_t* s = getLayerState(sc);
@@ -242,6 +298,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosit
    s->what |= layer_state_t::ePositionChanged;
    s->x = x;
    s->y = y;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -266,6 +324,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
    s->w = w;
    s->h = h;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -278,6 +337,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer
    }
    s->what |= layer_state_t::eLayerChanged;
    s->z = z;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -290,6 +351,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelat
    s->what |= layer_state_t::eRelativeLayerChanged;
    s->relativeLayerHandle = relativeTo;
    s->z = z;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -309,6 +372,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags
    s->flags &= ~mask;
    s->flags |= (flags & mask);
    s->mask |= mask;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -322,6 +387,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTrans
    }
    s->what |= layer_state_t::eTransparentRegionChanged;
    s->transparentRegion = transparentRegion;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -334,6 +401,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha
    }
    s->what |= layer_state_t::eAlphaChanged;
    s->alpha = alpha;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -346,6 +415,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer
    }
    s->what |= layer_state_t::eLayerStackChanged;
    s->layerStack = layerStack;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -364,6 +435,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatri
    matrix.dsdy = dsdy;
    matrix.dtdy = dtdy;
    s->matrix = matrix;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -376,6 +449,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop_
    }
    s->what |= layer_state_t::eCropChanged_legacy;
    s->crop_legacy = crop;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -391,6 +466,8 @@ SurfaceComposerClient::Transaction::deferTransactionUntil_legacy(const sp<Surfac
    s->what |= layer_state_t::eDeferTransaction_legacy;
    s->barrierHandle_legacy = handle;
    s->frameNumber_legacy = frameNumber;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -406,6 +483,8 @@ SurfaceComposerClient::Transaction::deferTransactionUntil_legacy(const sp<Surfac
    s->what |= layer_state_t::eDeferTransaction_legacy;
    s->barrierGbp_legacy = barrierSurface->getIGraphicBufferProducer();
    s->frameNumber_legacy = frameNumber;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -419,6 +498,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent
    }
    s->what |= layer_state_t::eReparentChildren;
    s->reparentHandle = newParentHandle;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -432,6 +513,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent
    }
    s->what |= layer_state_t::eReparent;
    s->parentHandleForChild = newParentHandle;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -445,6 +528,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor
    }
    s->what |= layer_state_t::eColorChanged;
    s->color = color;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -457,6 +542,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTrans
    }
    s->what |= layer_state_t::eTransformChanged;
    s->transform = transform;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -470,6 +557,8 @@ SurfaceComposerClient::Transaction::setTransformToDisplayInverse(const sp<Surfac
    }
    s->what |= layer_state_t::eTransformToDisplayInverseChanged;
    s->transformToDisplayInverse = transformToDisplayInverse;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -482,6 +571,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
    }
    s->what |= layer_state_t::eCropChanged;
    s->crop = crop;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -494,6 +585,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffe
    }
    s->what |= layer_state_t::eBufferChanged;
    s->buffer = buffer;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -506,6 +599,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAcqui
    }
    s->what |= layer_state_t::eAcquireFenceChanged;
    s->acquireFence = fence;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -518,6 +613,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDatas
    }
    s->what |= layer_state_t::eDataspaceChanged;
    s->dataspace = dataspace;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -530,6 +627,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setHdrMe
    }
    s->what |= layer_state_t::eHdrMetadataChanged;
    s->hdrMetadata = hdrMetadata;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -542,6 +641,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSurfa
    }
    s->what |= layer_state_t::eSurfaceDamageRegionChanged;
    s->surfaceDamageRegion = surfaceDamageRegion;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -554,6 +655,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApi(
    }
    s->what |= layer_state_t::eApiChanged;
    s->api = api;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -566,6 +669,22 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSideb
    }
    s->what |= layer_state_t::eSidebandStreamChanged;
    s->sidebandStream = sidebandStream;

    registerSurfaceControlForCallback(sc);
    return *this;
}

SurfaceComposerClient::Transaction&
SurfaceComposerClient::Transaction::addTransactionCompletedCallback(
        TransactionCompletedCallback callback, void* callbackContext) {
    auto listener = TransactionCompletedListener::getInstance();

    auto callbackWithContext = std::bind(callback, callbackContext);

    CallbackId callbackId = listener->addCallback(callbackWithContext);

    mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(
            callbackId);
    return *this;
}

@@ -576,6 +695,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::detachCh
        mStatus = BAD_INDEX;
    }
    s->what |= layer_state_t::eDetachChildren;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -603,6 +724,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setOverr

    s->what |= layer_state_t::eOverrideScalingModeChanged;
    s->overrideScalingMode = overrideScalingMode;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -614,6 +737,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeome
        return *this;
    }
    s->what |= layer_state_t::eGeometryAppliesWithResize;

    registerSurfaceControlForCallback(sc);
    return *this;
}

@@ -637,6 +762,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor
    }
    s->what |= layer_state_t::eColorTransformChanged;
    s->colorTransform = mat4(matrix, translation);

    registerSurfaceControlForCallback(sc);
    return *this;
}

+18 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <binder/SafeInterface.h>

#include <cstdint>
#include <unordered_set>

namespace android {

@@ -39,4 +40,21 @@ public:
                        uint32_t flags = 0) override;
};

using CallbackId = int64_t;

class ListenerCallbacks {
public:
    ListenerCallbacks(const sp<ITransactionCompletedListener>& listener,
                      const std::unordered_set<CallbackId>& callbacks)
          : transactionCompletedListener(listener),
            callbackIds(callbacks.begin(), callbacks.end()) {}

    ListenerCallbacks(const sp<ITransactionCompletedListener>& listener,
                      const std::vector<CallbackId>& ids)
          : transactionCompletedListener(listener), callbackIds(ids) {}

    sp<ITransactionCompletedListener> transactionCompletedListener;
    std::vector<CallbackId> callbackIds;
};

} // namespace android
+4 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <utils/Errors.h>

#include <gui/IGraphicBufferProducer.h>
#include <gui/ITransactionCompletedListener.h>
#include <math/mat4.h>
#include <math/vec3.h>
#include <ui/GraphicTypes.h>
@@ -74,6 +75,7 @@ struct layer_state_t {
        eApiChanged = 0x04000000,
        eSidebandStreamChanged = 0x08000000,
        eColorTransformChanged = 0x10000000,
        eListenerCallbacksChanged = 0x20000000,
    };

    layer_state_t()
@@ -154,6 +156,8 @@ struct layer_state_t {
    int32_t api;
    sp<NativeHandle> sidebandStream;
    mat4 colorTransform;

    std::vector<ListenerCallbacks> listenerCallbacks;
};

struct ComposerState {
Loading