diff --git a/src/protocols/PresentationTime.cpp b/src/protocols/PresentationTime.cpp index 67ee24e21..bf12d53c4 100644 --- a/src/protocols/PresentationTime.cpp +++ b/src/protocols/PresentationTime.cpp @@ -6,8 +6,7 @@ #include "core/Output.hpp" #include -CQueuedPresentationData::CQueuedPresentationData(SP surf, std::vector> feedbacks) : - m_surface(surf), m_feedbacks(std::move(feedbacks)) { +CQueuedPresentationData::CQueuedPresentationData(SP surf) : m_surface(surf) { ; } @@ -77,23 +76,9 @@ void CPresentationFeedback::sendQueued(WP data, const t m_done = true; } -void CPresentationFeedback::sendDiscarded() { - if (m_done) - return; - - m_resource->sendDiscarded(); - m_done = true; -} - CPresentationProtocol::CPresentationProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) { - static auto P = Event::bus()->m_events.monitor.removed.listen([this](PHLMONITOR mon) { - for (auto& data : m_queue) { - if (!data->m_surface || data->m_monitor == mon) - discardFeedbacks(data->m_feedbacks); - } - - std::erase_if(m_queue, [mon](const auto& other) { return !other->m_surface || other->m_monitor == mon; }); - }); + static auto P = Event::bus()->m_events.monitor.removed.listen( + [this](PHLMONITOR mon) { std::erase_if(m_queue, [mon](const auto& other) { return !other->m_surface || other->m_monitor == mon; }); }); } void CPresentationProtocol::bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id) { @@ -110,41 +95,33 @@ void CPresentationProtocol::onManagerResourceDestroy(wl_resource* res) { } void CPresentationProtocol::destroyResource(CPresentationFeedback* feedback) { - feedback->m_done = true; std::erase_if(m_feedbacks, [&](const auto& other) { return other.get() == feedback; }); } void CPresentationProtocol::onGetFeedback(CWpPresentation* pMgr, wl_resource* surf, uint32_t id) { const auto CLIENT = pMgr->client(); const auto& RESOURCE = - m_feedbacks.emplace_back(makeUnique(makeUnique(CLIENT, pMgr->version(), id), CWLSurfaceResource::fromResource(surf))); + m_feedbacks.emplace_back(makeUnique(makeUnique(CLIENT, pMgr->version(), id), CWLSurfaceResource::fromResource(surf))).get(); if UNLIKELY (!RESOURCE->good()) { pMgr->noMemory(); m_feedbacks.pop_back(); return; } - - if (const auto SURFACE = CWLSurfaceResource::fromResource(surf); SURFACE) - SURFACE->m_pending.presentationFeedbacks.emplace_back(RESOURCE); } void CPresentationProtocol::onPresented(PHLMONITOR pMonitor, const timespec& when, uint32_t untilRefreshNs, uint64_t seq, uint32_t reportedFlags) { - for (auto const& data : m_queue) { - if (!data->m_surface || !data->m_monitor) { - discardFeedbacks(data->m_feedbacks); - continue; - } - - if (data->m_monitor != pMonitor) + for (auto const& feedback : m_feedbacks) { + if (!feedback->m_surface) continue; - for (auto const& feedbackRef : data->m_feedbacks) { - const auto feedback = feedbackRef.lock(); - if (!feedback || feedback->m_done) + for (auto const& data : m_queue) { + if (!data->m_surface || data->m_surface != feedback->m_surface || (data->m_monitor && data->m_monitor != pMonitor)) continue; feedback->sendQueued(data, when, untilRefreshNs, seq, reportedFlags); + feedback->m_done = true; + break; } } @@ -170,34 +147,6 @@ void CPresentationProtocol::queueData(UP&& data) { m_queue.emplace_back(std::move(data)); } -void CPresentationProtocol::discardFeedbacks(std::vector>& feedbacks) { - for (auto const& feedbackRef : feedbacks) { - const auto feedback = feedbackRef.lock(); - if (!feedback || feedback->m_done) - continue; - - feedback->sendDiscarded(); - } - - feedbacks.clear(); - std::erase_if(m_feedbacks, [](const auto& other) { return !other->m_surface || other->m_done; }); -} - -void CPresentationProtocol::discardFeedbacksForSurface(WP surface) { - if (!surface) - return; - - for (auto const& feedback : m_feedbacks) { - if (feedback->m_surface != surface) - continue; - - feedback->sendDiscarded(); - } - - std::erase_if(m_queue, [surface](const auto& other) { return !other->m_surface || other->m_surface == surface; }); - std::erase_if(m_feedbacks, [](const auto& other) { return !other->m_surface || other->m_done; }); -} - bool CPresentationProtocol::hasPendingFeedbacks() const { return !m_feedbacks.empty(); } diff --git a/src/protocols/PresentationTime.hpp b/src/protocols/PresentationTime.hpp index 4d14a77c2..1717cfa1f 100644 --- a/src/protocols/PresentationTime.hpp +++ b/src/protocols/PresentationTime.hpp @@ -8,11 +8,10 @@ #include "../helpers/time/Time.hpp" class CWLSurfaceResource; -class CPresentationFeedback; class CQueuedPresentationData { public: - CQueuedPresentationData(SP surf, std::vector> feedbacks); + CQueuedPresentationData(SP surf); void setPresentationType(bool zeroCopy); void attachMonitor(PHLMONITOR pMonitor); @@ -23,11 +22,10 @@ class CQueuedPresentationData { bool m_done = false; private: - bool m_wasPresented = false; - bool m_zeroCopy = false; - PHLMONITORREF m_monitor; - WP m_surface; - std::vector> m_feedbacks; + bool m_wasPresented = false; + bool m_zeroCopy = false; + PHLMONITORREF m_monitor; + WP m_surface; friend class CPresentationFeedback; friend class CPresentationProtocol; @@ -40,7 +38,6 @@ class CPresentationFeedback { bool good(); void sendQueued(WP data, const timespec& when, uint32_t untilRefreshNs, uint64_t seq, uint32_t reportedFlags); - void sendDiscarded(); private: UP m_resource; @@ -58,8 +55,6 @@ class CPresentationProtocol : public IWaylandProtocol { void onPresented(PHLMONITOR pMonitor, const timespec& when, uint32_t untilRefreshNs, uint64_t seq, uint32_t reportedFlags); void queueData(UP&& data); - void discardFeedbacks(std::vector>& feedbacks); - void discardFeedbacksForSurface(WP surface); bool hasPendingFeedbacks() const; private: diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index ceb5422b9..e7cb52689 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -146,7 +146,6 @@ CWLSurfaceResource::CWLSurfaceResource(SP resource_) : m_resource(re m_events.precommit.emit(); if (m_pending.rejected) { m_pending.rejected = false; - PROTO::presentation->discardFeedbacks(m_pending.presentationFeedbacks); dropPendingBuffer(); return; } @@ -254,19 +253,10 @@ CWLSurfaceResource::CWLSurfaceResource(SP resource_) : m_resource(re } CWLSurfaceResource::~CWLSurfaceResource() { - discardPresentationFeedbacks(); m_events.destroy.emit(); } -void CWLSurfaceResource::discardPresentationFeedbacks() { - PROTO::presentation->discardFeedbacks(m_pending.presentationFeedbacks); - PROTO::presentation->discardFeedbacks(m_current.presentationFeedbacks); - PROTO::presentation->discardFeedbacksForSurface(m_self); -} - void CWLSurfaceResource::destroy() { - discardPresentationFeedbacks(); - if (m_mapped) { m_events.unmap.emit(); unmap(); @@ -617,9 +607,6 @@ void CWLSurfaceResource::commitState(SSurfaceState& state) { if (!state.updated.all && m_mapped && state.fifoScheduled) return; - if (state.updated.all) - PROTO::presentation->discardFeedbacks(m_current.presentationFeedbacks); - auto lastTexture = m_current.texture; m_current.updateFrom(state); @@ -790,7 +777,7 @@ void CWLSurfaceResource::updateCursorShm(CRegion damage) { void CWLSurfaceResource::presentFeedback(const Time::steady_tp& when, PHLMONITOR pMonitor, bool discarded) { frame(when); - auto FEEDBACK = makeUnique(m_self.lock(), std::move(m_current.presentationFeedbacks)); + auto FEEDBACK = makeUnique(m_self.lock()); FEEDBACK->attachMonitor(pMonitor); if (discarded) FEEDBACK->discarded(); diff --git a/src/protocols/core/Compositor.hpp b/src/protocols/core/Compositor.hpp index 2f71d2589..72b6f234b 100644 --- a/src/protocols/core/Compositor.hpp +++ b/src/protocols/core/Compositor.hpp @@ -145,7 +145,6 @@ class CWLSurfaceResource { void releaseBuffers(bool onlyCurrent = true); void dropPendingBuffer(); void dropCurrentBuffer(); - void discardPresentationFeedbacks(); void bfHelper(std::span> nodes, std::function, const Vector2D&, void*)> fn, void* data); SP findFirstPreorderHelper(SP root, std::function)> fn); void updateCursorShm(CRegion damage = CBox{0, 0, INT16_MAX, INT16_MAX}); diff --git a/src/protocols/types/SurfaceState.cpp b/src/protocols/types/SurfaceState.cpp index 56204fed0..81b4c1494 100644 --- a/src/protocols/types/SurfaceState.cpp +++ b/src/protocols/types/SurfaceState.cpp @@ -73,7 +73,6 @@ void SSurfaceState::reset() { bufferDamage.clear(); callbacks.clear(); - presentationFeedbacks.clear(); lockMask = LOCK_REASON_NONE; barrierSet = false; @@ -134,12 +133,6 @@ void SSurfaceState::updateFrom(SSurfaceState& ref) { ref.callbacks.clear(); } - if (!ref.presentationFeedbacks.empty()) { - presentationFeedbacks.insert(presentationFeedbacks.end(), std::make_move_iterator(ref.presentationFeedbacks.begin()), - std::make_move_iterator(ref.presentationFeedbacks.end())); - ref.presentationFeedbacks.clear(); - } - if (ref.barrierSet) barrierSet = ref.barrierSet; } diff --git a/src/protocols/types/SurfaceState.hpp b/src/protocols/types/SurfaceState.hpp index df108fdbf..3e81ef4ad 100644 --- a/src/protocols/types/SurfaceState.hpp +++ b/src/protocols/types/SurfaceState.hpp @@ -11,7 +11,6 @@ namespace Render { } class CDRMSyncPointState; class CWLCallbackResource; -class CPresentationFeedback; enum eLockReason : uint8_t { LOCK_REASON_NONE = 0, @@ -78,9 +77,6 @@ struct SSurfaceState { // for wl_surface::frame callbacks. std::vector> callbacks; - // for wp_presentation feedbacks, tied to this commit. - std::vector> presentationFeedbacks; - // viewporter protocol surface state struct { bool hasDestination = false; diff --git a/src/protocols/types/SurfaceStateQueue.cpp b/src/protocols/types/SurfaceStateQueue.cpp index 128501b4b..82a04878a 100644 --- a/src/protocols/types/SurfaceStateQueue.cpp +++ b/src/protocols/types/SurfaceStateQueue.cpp @@ -1,14 +1,10 @@ #include "SurfaceStateQueue.hpp" #include "../core/Compositor.hpp" -#include "../PresentationTime.hpp" #include "SurfaceState.hpp" CSurfaceStateQueue::CSurfaceStateQueue(WP surf) : m_surface(std::move(surf)) {} void CSurfaceStateQueue::clear() { - for (auto& state : m_queue) - PROTO::presentation->discardFeedbacks(state->presentationFeedbacks); - m_queue.clear(); } @@ -21,8 +17,6 @@ void CSurfaceStateQueue::dropState(const WP& state) { if (it == m_queue.end()) return; - PROTO::presentation->discardFeedbacks((*it)->presentationFeedbacks); - m_queue.erase(it); }