File indexing completed on 2024-05-12 05:32:20

0001 /*
0002     SPDX-FileCopyrightText: 2021-2022 Xaver Hugl <xaver.hugl@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 #pragma once
0007 
0008 #include <qwayland-server-drm-lease-v1.h>
0009 
0010 #include "backends/drm/drm_backend.h"
0011 #include "backends/drm/drm_connector.h"
0012 #include "backends/drm/drm_gpu.h"
0013 #include "backends/drm/drm_output.h"
0014 #include "utils/filedescriptor.h"
0015 
0016 #include <QObject>
0017 #include <QPointer>
0018 #include <QQueue>
0019 
0020 namespace KWin
0021 {
0022 
0023 class Display;
0024 class DrmLeaseConnectorV1Interface;
0025 class DrmLeaseRequestV1Interface;
0026 class DrmLeaseV1Interface;
0027 
0028 class DrmLeaseDeviceV1Interface : public QObject, public QtWaylandServer::wp_drm_lease_device_v1
0029 {
0030 public:
0031     explicit DrmLeaseDeviceV1Interface(Display *display, DrmGpu *gpu);
0032     ~DrmLeaseDeviceV1Interface();
0033 
0034     void addOutput(DrmAbstractOutput *output);
0035     void removeOutput(DrmAbstractOutput *output);
0036     void setDrmMaster(bool hasDrmMaster);
0037     void done();
0038     void remove();
0039     void addLeaseRequest(DrmLeaseRequestV1Interface *leaseRequest);
0040     void removeLeaseRequest(DrmLeaseRequestV1Interface *leaseRequest);
0041     void addLease(DrmLeaseV1Interface *lease);
0042     void removeLease(DrmLeaseV1Interface *lease);
0043     void offerConnector(DrmLeaseConnectorV1Interface *connector);
0044 
0045     bool hasDrmMaster() const;
0046     DrmGpu *gpu() const;
0047 
0048 private:
0049     void wp_drm_lease_device_v1_create_lease_request(Resource *resource, uint32_t id) override;
0050     void wp_drm_lease_device_v1_release(Resource *resource) override;
0051     void wp_drm_lease_device_v1_bind_resource(Resource *resource) override;
0052     void wp_drm_lease_device_v1_destroy_global() override;
0053 
0054     DrmGpu *const m_gpu;
0055     bool m_hasDrmMaster = true;
0056     std::map<DrmAbstractOutput *, std::unique_ptr<DrmLeaseConnectorV1Interface>> m_connectors;
0057     QQueue<wl_resource *> m_pendingFds;
0058     QList<DrmLeaseRequestV1Interface *> m_leaseRequests;
0059     QList<DrmLeaseV1Interface *> m_leases;
0060 };
0061 
0062 class DrmLeaseConnectorV1Interface : public QObject, public QtWaylandServer::wp_drm_lease_connector_v1
0063 {
0064     Q_OBJECT
0065 public:
0066     explicit DrmLeaseConnectorV1Interface(DrmLeaseDeviceV1Interface *leaseDevice, DrmOutput *output);
0067 
0068     uint32_t id() const;
0069     void send(wl_resource *resource);
0070     void withdraw();
0071 
0072     DrmLeaseDeviceV1Interface *device() const;
0073     DrmOutput *output() const;
0074     bool withdrawn() const;
0075 
0076 private:
0077     void wp_drm_lease_connector_v1_destroy(Resource *resource) override;
0078 
0079     QPointer<DrmLeaseDeviceV1Interface> m_device;
0080     bool m_withdrawn = false;
0081     DrmOutput *const m_output;
0082 };
0083 
0084 class DrmLeaseRequestV1Interface : public QtWaylandServer::wp_drm_lease_request_v1
0085 {
0086 public:
0087     DrmLeaseRequestV1Interface(DrmLeaseDeviceV1Interface *device, wl_resource *resource);
0088     ~DrmLeaseRequestV1Interface();
0089 
0090     QList<DrmLeaseConnectorV1Interface *> connectors() const;
0091     void invalidate();
0092 
0093 protected:
0094     void wp_drm_lease_request_v1_request_connector(Resource *resource, struct ::wl_resource *connector) override;
0095     void wp_drm_lease_request_v1_submit(Resource *resource, uint32_t id) override;
0096     void wp_drm_lease_request_v1_destroy_resource(Resource *resource) override;
0097 
0098     DrmLeaseDeviceV1Interface *const m_device;
0099     QList<DrmLeaseConnectorV1Interface *> m_connectors;
0100     bool m_invalid = false;
0101 };
0102 
0103 class DrmLeaseV1Interface : public QObject, private QtWaylandServer::wp_drm_lease_v1
0104 {
0105     Q_OBJECT
0106 public:
0107     DrmLeaseV1Interface(DrmLeaseDeviceV1Interface *device, const QList<DrmLeaseConnectorV1Interface *> &connectors, wl_resource *resource);
0108     ~DrmLeaseV1Interface();
0109 
0110     void grant(std::unique_ptr<DrmLease> &&lease);
0111     void deny();
0112     void revoke();
0113 
0114     QList<DrmLeaseConnectorV1Interface *> connectors() const;
0115 
0116 private:
0117     DrmLeaseDeviceV1Interface *m_device;
0118     QList<DrmLeaseConnectorV1Interface *> m_connectors;
0119     std::unique_ptr<DrmLease> m_lease;
0120     bool m_finished = false;
0121 
0122     void wp_drm_lease_v1_destroy(Resource *resource) override;
0123     void wp_drm_lease_v1_destroy_resource(Resource *resource) override;
0124 };
0125 
0126 }