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

Commit 040744c6 authored by Vishnu Nair's avatar Vishnu Nair Committed by Android (Google) Code Review
Browse files

Merge "SurfaceFlinger: Emit callbacks for non-buffer layer transactions"

parents d209221a da1fd150
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -549,13 +549,19 @@ bool BufferStateLayer::setSidebandStream(const sp<NativeHandle>& sidebandStream)
}

bool BufferStateLayer::setTransactionCompletedListeners(
        const std::vector<sp<CallbackHandle>>& handles) {
        const std::vector<ListenerCallbacks>& listenerCallbacks, const sp<IBinder>& layerHandle) {
    // If there is no handle, we will not send a callback so reset mReleasePreviousBuffer and return
    if (handles.empty()) {
    if (listenerCallbacks.empty()) {
        mReleasePreviousBuffer = false;
        return false;
    }

    std::vector<sp<CallbackHandle>> handles;
    handles.reserve(listenerCallbacks.size());
    for (auto& [listener, callbackIds] : listenerCallbacks) {
        handles.emplace_back(new CallbackHandle(listener, callbackIds, layerHandle));
    }

    const bool willPresent = willPresentCurrentTransaction();

    for (const auto& handle : handles) {
@@ -571,9 +577,10 @@ bool BufferStateLayer::setTransactionCompletedListeners(
            // Store so latched time and release fence can be set
            mDrawingState.callbackHandles.push_back(handle);

        } else { // If this layer will NOT need to be relatched and presented this frame
        } else {
            // If this layer will NOT need to be relatched and presented this frame
            // Notify the transaction completed thread this handle is done
            mFlinger->getTransactionCallbackInvoker().registerUnpresentedCallbackHandle(handle);
            mFlinger->getTransactionCallbackInvoker().addUnpresentedCallbackHandle(handle);
        }
    }

+2 −1
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@ public:
    bool setSurfaceDamageRegion(const Region& surfaceDamage) override;
    bool setApi(int32_t api) override;
    bool setSidebandStream(const sp<NativeHandle>& sidebandStream) override;
    bool setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>>& handles) override;
    bool setTransactionCompletedListeners(const std::vector<ListenerCallbacks>& handles,
                                          const sp<IBinder>& layerHandle) override;
    bool addFrameEvent(const sp<Fence>& acquireFence, nsecs_t postedTime,
                       nsecs_t requestedPresentTime) override;
    bool setPosition(float /*x*/, float /*y*/) override;
+11 −0
Original line number Diff line number Diff line
@@ -2640,6 +2640,17 @@ bool Layer::setDropInputMode(gui::DropInputMode mode) {
    return true;
}

bool Layer::setTransactionCompletedListeners(
        const std::vector<ListenerCallbacks>& listenerCallbacks, const sp<IBinder>&) {
    if (listenerCallbacks.empty()) {
        return false;
    }
    for (auto& listener : listenerCallbacks) {
        mFlinger->getTransactionCallbackInvoker().addEmptyCallback(listener);
    }
    return false;
}

// ---------------------------------------------------------------------------

std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate) {
+2 −4
Original line number Diff line number Diff line
@@ -426,10 +426,8 @@ public:
    virtual bool setSurfaceDamageRegion(const Region& /*surfaceDamage*/) { return false; };
    virtual bool setApi(int32_t /*api*/) { return false; };
    virtual bool setSidebandStream(const sp<NativeHandle>& /*sidebandStream*/) { return false; };
    virtual bool setTransactionCompletedListeners(
            const std::vector<sp<CallbackHandle>>& /*handles*/) {
        return false;
    };
    virtual bool setTransactionCompletedListeners(const std::vector<ListenerCallbacks>& /*handles*/,
                                                  const sp<IBinder>& /* layerHandle */);
    virtual bool addFrameEvent(const sp<Fence>& /*acquireFence*/, nsecs_t /*postedTime*/,
                               nsecs_t /*requestedPresentTime*/) {
        return false;
+9 −12
Original line number Diff line number Diff line
@@ -3803,11 +3803,10 @@ bool SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelin
        transactionFlags |= setDisplayStateLocked(display);
    }

    // start and end registration for listeners w/ no surface so they can get their callback.  Note
    // that listeners with SurfaceControls will start registration during setClientStateLocked
    // below.
    // Add listeners w/ surfaces so they can get their callback.  Note that listeners with
    // SurfaceControls will start registration during setClientStateLocked below.
    for (const auto& listener : listenerCallbacks) {
        mTransactionCallbackInvoker.addEmptyTransaction(listener);
        mTransactionCallbackInvoker.addEmptyCallback(listener);
    }

    uint32_t clientStateFlags = 0;
@@ -3979,7 +3978,7 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime
    }
    if (layer == nullptr) {
        for (auto& [listener, callbackIds] : s.listeners) {
            mTransactionCallbackInvoker.registerUnpresentedCallbackHandle(
            mTransactionCallbackInvoker.addUnpresentedCallbackHandle(
                    new CallbackHandle(listener, callbackIds, s.surface));
        }
        return 0;
@@ -4250,12 +4249,6 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime
            flags |= eTransactionNeeded | eTraversalNeeded;
        }
    }
    std::vector<sp<CallbackHandle>> callbackHandles;
    if ((what & layer_state_t::eHasListenerCallbacksChanged) && (!filteredListeners.empty())) {
        for (auto& [listener, callbackIds] : filteredListeners) {
            callbackHandles.emplace_back(new CallbackHandle(listener, callbackIds, s.surface));
        }
    }

    if (what & layer_state_t::eBufferChanged &&
        layer->setBuffer(s.bufferData, postTime, desiredPresentTime, isAutoTimestamp,
@@ -4265,7 +4258,11 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime
        layer->setFrameTimelineVsyncForBufferlessTransaction(frameTimelineInfo, postTime);
    }

    if (layer->setTransactionCompletedListeners(callbackHandles)) flags |= eTraversalNeeded;
    if ((what & layer_state_t::eHasListenerCallbacksChanged) && (!filteredListeners.empty())) {
        if (layer->setTransactionCompletedListeners(filteredListeners, s.surface)) {
            flags |= eTraversalNeeded;
        }
    }
    // Do not put anything that updates layer state or modifies flags after
    // setTransactionCompletedListener
    return flags;
Loading