18static const quint32 s_version = 1;
25 const auto &gpus = m_backend->
gpus();
26 for (
const auto &gpu : gpus) {
36 for (
const auto device : m_leaseDevices) {
41void DrmLeaseManagerV1::addGpu(
DrmGpu *gpu)
46void DrmLeaseManagerV1::removeGpu(DrmGpu *gpu)
48 if (
auto device = m_leaseDevices.take(gpu)) {
53void DrmLeaseManagerV1::handleOutputsQueried()
55 for (
const auto device : m_leaseDevices) {
57 device->setDrmMaster(device->gpu()->isActive());
62 : QtWaylandServer::wp_drm_lease_device_v1(*display, s_version)
66 for (
const auto output : outputs) {
76 while (!m_connectors.empty()) {
83 DrmOutput *drmOutput = qobject_cast<DrmOutput *>(output);
87 m_connectors[drmOutput] = std::make_unique<DrmLeaseConnectorV1Interface>(
this, drmOutput);
96 const auto it = m_connectors.find(output);
97 if (it != m_connectors.end()) {
100 for (
const auto &lease : std::as_const(m_leases)) {
101 if (lease->connectors().contains(connector)) {
102 lease->connectors().removeOne(connector);
106 for (
const auto &leaseRequest : std::as_const(m_leaseRequests)) {
107 if (leaseRequest->connectors().contains(connector)) {
108 leaseRequest->invalidate();
111 m_connectors.erase(it);
122 while (!m_pendingFds.isEmpty()) {
124 send_drm_fd(m_pendingFds.dequeue(), fd.
get());
127 for (
const auto &[output, connector] : m_connectors) {
132 for (
const auto &[output, connector] : m_connectors) {
133 connector->withdraw();
136 for (
const auto &lease : std::as_const(m_leases)) {
146 const auto resources = resourceMap();
147 for (
const auto resource : resources) {
148 send_done(resource->handle);
154 for (
const auto &lease : std::as_const(m_leases)) {
157 for (
const auto &[output, connector] : m_connectors) {
158 connector->withdraw();
160 for (
const auto &request : std::as_const(m_leaseRequests)) {
161 request->invalidate();
169 m_leaseRequests.push_back(leaseRequest);
174 m_leaseRequests.removeOne(leaseRequest);
179 m_leases.push_back(lease);
184 m_leases.removeOne(lease);
189 return m_hasDrmMaster;
199 for (
const auto &resource : resourceMap()) {
200 auto connectorResource = connector->add(resource->client(), 0, resource->version());
201 send_connector(resource->handle, connectorResource->handle);
202 connector->
send(connectorResource->handle);
206void DrmLeaseDeviceV1Interface::wp_drm_lease_device_v1_create_lease_request(Resource *resource, uint32_t
id)
208 wl_resource *requestResource = wl_resource_create(resource->client(), &wp_drm_lease_request_v1_interface,
209 resource->version(),
id);
210 if (!requestResource) {
211 wl_resource_post_no_memory(resource->handle);
214 m_leaseRequests <<
new DrmLeaseRequestV1Interface(
this, requestResource);
217void DrmLeaseDeviceV1Interface::wp_drm_lease_device_v1_release(Resource *resource)
219 send_released(resource->handle);
220 wl_resource_destroy(resource->handle);
223void DrmLeaseDeviceV1Interface::wp_drm_lease_device_v1_bind_resource(Resource *resource)
225 if (isGlobalRemoved()) {
228 if (!m_hasDrmMaster) {
229 m_pendingFds << resource->handle;
233 send_drm_fd(resource->handle, fd.get());
234 for (
const auto &[output, connector] : m_connectors) {
235 if (!connector->withdrawn()) {
236 auto connectorResource = connector->add(resource->client(), 0, s_version);
237 send_connector(resource->handle, connectorResource->handle);
238 connector->send(connectorResource->handle);
241 send_done(resource->handle);
244void DrmLeaseDeviceV1Interface::wp_drm_lease_device_v1_destroy_global()
250 : wp_drm_lease_connector_v1()
251 , m_device(leaseDevice)
279 send_connector_id(resource, m_output->
connector()->
id());
280 send_name(resource, m_output->
name());
281 send_description(resource, m_output->
description());
289 for (
const auto &resource : resourceMap()) {
290 send_withdrawn(resource->handle);
295void DrmLeaseConnectorV1Interface::wp_drm_lease_connector_v1_destroy(Resource *resource)
297 wl_resource_destroy(resource->handle);
301 : wp_drm_lease_request_v1(resource)
324 if (
auto connector = resource_cast<DrmLeaseConnectorV1Interface *>(connector_handle)) {
325 if (connector->device() !=
m_device) {
326 wl_resource_post_error(resource->handle, WP_DRM_LEASE_REQUEST_V1_ERROR_WRONG_DEVICE,
"Requested connector from invalid lease device");
327 }
else if (connector->withdrawn()) {
328 qCWarning(KWIN_CORE) <<
"DrmLease: withdrawn connector requested";
331 wl_resource_post_error(resource->handle, WP_DRM_LEASE_REQUEST_V1_ERROR_DUPLICATE_CONNECTOR,
"Requested connector twice");
336 qCWarning(KWIN_CORE,
"DrmLease: Invalid connector requested");
343 wl_resource *leaseResource = wl_resource_create(resource->client(), &wp_drm_lease_v1_interface, s_version,
id);
344 if (!leaseResource) {
345 wl_resource_post_no_memory(resource->handle);
351 qCWarning(KWIN_CORE) <<
"DrmLease: rejecting lease request without drm master";
354 qCWarning(KWIN_CORE) <<
"DrmLease: rejecting lease request with a withdrawn connector";
357 wl_resource_post_error(resource->handle, WP_DRM_LEASE_REQUEST_V1_ERROR_EMPTY_LEASE,
"Requested lease without connectors");
359 QList<DrmOutput *> outputs;
361 outputs.push_back(connector->output());
365 lease->
grant(std::move(drmLease));
370 wl_resource_destroy(resource->handle);
379 : wp_drm_lease_v1(resource)
381 , m_connectors(connectors)
398 send_lease_fd(tmp.
get());
399 m_lease = std::move(lease);
401 for (
const auto &connector : std::as_const(m_connectors)) {
402 connector->withdraw();
426 for (
const auto &connector : std::as_const(m_connectors)) {
433void DrmLeaseV1Interface::wp_drm_lease_v1_destroy(Resource *resource)
435 wl_resource_destroy(resource->handle);
438void DrmLeaseV1Interface::wp_drm_lease_v1_destroy_resource(Resource *resource)
450#include "moc_drmlease_v1.cpp"
451#include "moc_drmlease_v1_p.cpp"
Class holding the Wayland server display loop.
void gpuRemoved(DrmGpu *gpu)
void gpuAdded(DrmGpu *gpu)
const std::vector< std::unique_ptr< DrmGpu > > & gpus() const
std::unique_ptr< DrmLease > leaseOutputs(const QList< DrmOutput * > &outputs)
QList< DrmOutput * > drmOutputs() const
void outputRemoved(DrmAbstractOutput *output)
void outputAdded(DrmAbstractOutput *output)
FileDescriptor createNonMasterFd() const
void activeChanged(bool active)
DrmOutput * output() const
void send(wl_resource *resource)
DrmLeaseDeviceV1Interface * device() const
DrmLeaseConnectorV1Interface(DrmLeaseDeviceV1Interface *leaseDevice, DrmOutput *output)
bool hasDrmMaster() const
~DrmLeaseDeviceV1Interface()
void setDrmMaster(bool hasDrmMaster)
DrmLeaseDeviceV1Interface(Display *display, DrmGpu *gpu)
void addLease(DrmLeaseV1Interface *lease)
void offerConnector(DrmLeaseConnectorV1Interface *connector)
void addLeaseRequest(DrmLeaseRequestV1Interface *leaseRequest)
void removeLeaseRequest(DrmLeaseRequestV1Interface *leaseRequest)
void removeOutput(DrmAbstractOutput *output)
void removeLease(DrmLeaseV1Interface *lease)
void addOutput(DrmAbstractOutput *output)
DrmLeaseManagerV1(DrmBackend *backend, Display *display, QObject *parent=nullptr)
QList< DrmLeaseConnectorV1Interface * > m_connectors
void wp_drm_lease_request_v1_request_connector(Resource *resource, struct ::wl_resource *connector) override
~DrmLeaseRequestV1Interface()
QList< DrmLeaseConnectorV1Interface * > connectors() const
DrmLeaseRequestV1Interface(DrmLeaseDeviceV1Interface *device, wl_resource *resource)
void wp_drm_lease_request_v1_destroy_resource(Resource *resource) override
void wp_drm_lease_request_v1_submit(Resource *resource, uint32_t id) override
DrmLeaseDeviceV1Interface *const m_device
DrmLeaseV1Interface(DrmLeaseDeviceV1Interface *device, const QList< DrmLeaseConnectorV1Interface * > &connectors, wl_resource *resource)
void grant(std::unique_ptr< DrmLease > &&lease)
QList< DrmLeaseConnectorV1Interface * > connectors() const
DrmConnector * connector() const
QString description() const
bool isNonDesktop() const