Loading services/surfaceflinger/BufferStateLayer.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); } } Loading services/surfaceflinger/BufferStateLayer.h +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading services/surfaceflinger/Layer.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading services/surfaceflinger/Layer.h +2 −4 Original line number Diff line number Diff line Loading @@ -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; Loading services/surfaceflinger/SurfaceFlinger.cpp +9 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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, Loading @@ -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 Loading
services/surfaceflinger/BufferStateLayer.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); } } Loading
services/surfaceflinger/BufferStateLayer.h +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
services/surfaceflinger/Layer.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
services/surfaceflinger/Layer.h +2 −4 Original line number Diff line number Diff line Loading @@ -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; Loading
services/surfaceflinger/SurfaceFlinger.cpp +9 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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, Loading @@ -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