diff options
Diffstat (limited to 'src/protocols/DRMSyncobj.hpp')
| -rw-r--r-- | src/protocols/DRMSyncobj.hpp | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/src/protocols/DRMSyncobj.hpp b/src/protocols/DRMSyncobj.hpp index 9895dff1..78905d3d 100644 --- a/src/protocols/DRMSyncobj.hpp +++ b/src/protocols/DRMSyncobj.hpp @@ -2,64 +2,95 @@ #include <vector> #include "WaylandProtocol.hpp" +#include "helpers/sync/SyncReleaser.hpp" #include "linux-drm-syncobj-v1.hpp" #include "../helpers/signal/Signal.hpp" +#include "types/SurfaceState.hpp" #include <hyprutils/os/FileDescriptor.hpp> +#include <list> class CWLSurfaceResource; class CDRMSyncobjTimelineResource; class CSyncTimeline; +struct SSurfaceState; -class CDRMSyncobjSurfaceResource { +class CDRMSyncPointState { public: - CDRMSyncobjSurfaceResource(SP<CWpLinuxDrmSyncobjSurfaceV1> resource_, SP<CWLSurfaceResource> surface_); + CDRMSyncPointState() = default; + CDRMSyncPointState(WP<CDRMSyncobjTimelineResource> resource_, uint64_t point_, bool acquirePoint); + ~CDRMSyncPointState() = default; + + const uint64_t& point(); + WP<CDRMSyncobjTimelineResource> resource(); + WP<CSyncTimeline> timeline(); + bool expired(); + Hyprutils::Memory::CUniquePointer<CSyncReleaser> createSyncRelease(); + bool addWaiter(const std::function<void()>& waiter); + bool comitted(); + Hyprutils::OS::CFileDescriptor exportAsFD(); + void signal(); - bool good(); + private: + WP<CDRMSyncobjTimelineResource> m_resource = {}; + uint64_t m_point = 0; + WP<CSyncTimeline> m_timeline = {}; + bool m_acquirePoint = false; + bool m_acquireCommitted = false; + bool m_releaseTaken = false; +}; - WP<CWLSurfaceResource> surface; - struct { - WP<CDRMSyncobjTimelineResource> acquireTimeline, releaseTimeline; - uint64_t acquirePoint = 0, releasePoint = 0; - } current, pending; +class CDRMSyncobjSurfaceResource { + public: + CDRMSyncobjSurfaceResource(UP<CWpLinuxDrmSyncobjSurfaceV1>&& resource_, SP<CWLSurfaceResource> surface_); + ~CDRMSyncobjSurfaceResource(); + + bool protocolError(); + bool good(); private: - SP<CWpLinuxDrmSyncobjSurfaceV1> resource; + void removeAllWaiters(); + WP<CWLSurfaceResource> surface; + UP<CWpLinuxDrmSyncobjSurfaceV1> resource; + + CDRMSyncPointState pendingAcquire; + CDRMSyncPointState pendingRelease; + std::vector<SP<SSurfaceState>> pendingStates; struct { CHyprSignalListener surfacePrecommit; - CHyprSignalListener surfaceCommit; } listeners; }; class CDRMSyncobjTimelineResource { public: - CDRMSyncobjTimelineResource(SP<CWpLinuxDrmSyncobjTimelineV1> resource_, Hyprutils::OS::CFileDescriptor&& fd_); + CDRMSyncobjTimelineResource(UP<CWpLinuxDrmSyncobjTimelineV1>&& resource_, Hyprutils::OS::CFileDescriptor&& fd_); ~CDRMSyncobjTimelineResource() = default; - static SP<CDRMSyncobjTimelineResource> fromResource(wl_resource*); + static WP<CDRMSyncobjTimelineResource> fromResource(wl_resource*); bool good(); - WP<CDRMSyncobjTimelineResource> self; Hyprutils::OS::CFileDescriptor fd; SP<CSyncTimeline> timeline; private: - SP<CWpLinuxDrmSyncobjTimelineV1> resource; + UP<CWpLinuxDrmSyncobjTimelineV1> resource; }; class CDRMSyncobjManagerResource { public: - CDRMSyncobjManagerResource(SP<CWpLinuxDrmSyncobjManagerV1> resource_); + CDRMSyncobjManagerResource(UP<CWpLinuxDrmSyncobjManagerV1>&& resource_); + ~CDRMSyncobjManagerResource() = default; bool good(); private: - SP<CWpLinuxDrmSyncobjManagerV1> resource; + UP<CWpLinuxDrmSyncobjManagerV1> resource; }; class CDRMSyncobjProtocol : public IWaylandProtocol { public: CDRMSyncobjProtocol(const wl_interface* iface, const int& ver, const std::string& name); + ~CDRMSyncobjProtocol() = default; virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); @@ -69,9 +100,9 @@ class CDRMSyncobjProtocol : public IWaylandProtocol { void destroyResource(CDRMSyncobjSurfaceResource* resource); // - std::vector<SP<CDRMSyncobjManagerResource>> m_vManagers; - std::vector<SP<CDRMSyncobjTimelineResource>> m_vTimelines; - std::vector<SP<CDRMSyncobjSurfaceResource>> m_vSurfaces; + std::vector<UP<CDRMSyncobjManagerResource>> m_vManagers; + std::vector<UP<CDRMSyncobjTimelineResource>> m_vTimelines; + std::vector<UP<CDRMSyncobjSurfaceResource>> m_vSurfaces; // int drmFD = -1; |
