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 }