wayland_frontend and backend_drm only.Expand description
DRM Lease protocol
This module provides helpers to handle the wp_drm_lease_v1 protocol, which allows clients to lease DRM resources from the compositor.
This is in particular useful for VR applications, that would like to take over a directly attached VR display from the DRM device otherwise controlled by the compositor. In theory however any sorts of DRM resources can be lend out to less privileged clients via this protocol.
§How to use
To setup the drm_lease global, you will need to first provide the DrmNode you want to lease resources from.
You can usually get that from your DrmDevice. Once the global is up,
you can advertise connectors as available through DrmLeaseState::add_connector.
Should a connector become unavailable or is used by the compositor, you may remove it again using DrmLeaseState::withdraw_connector.
Any client requests will be issued through DrmLeaseHandler::lease_request, which
allows you to add additional needed DRM resources to the lease and accept or decline the request.
pub struct State {
drm_lease_state: DrmLeaseState,
active_leases: Vec<DrmLease>,
}
impl DrmLeaseHandler for State {
fn drm_lease_state(&mut self, node: DrmNode) -> &mut DrmLeaseState { &mut self.drm_lease_state }
fn lease_request(&mut self, node: DrmNode, request: DrmLeaseRequest) -> Result<DrmLeaseBuilder, LeaseRejected> {
let device = self.get_device_for_node(&node);
let mut builder = DrmLeaseBuilder::new(device);
for connector in request.connectors {
builder.add_connector(connector);
builder.add_crtc(some_free_crtc);
builder.add_plane(primary_plane_for_connector, primary_plane_claim_for_connector);
}
Ok(builder)
}
fn new_active_lease(&mut self, node: DrmNode, lease: DrmLease) { self.active_leases.push(lease); }
fn lease_destroyed(&mut self, node: DrmNode, lease_id: u32) { self.active_leases.retain(|l| l.id() != lease_id); }
}
smithay::delegate_dispatch2!(State);
let mut drm_lease_state = DrmLeaseState::new::<State>(
&display.handle(),
&DrmNode::from_file(
drm_device.device_fd()
).unwrap()
).unwrap();
// Add some connectors
drm_lease_state.add_connector::<State>(some_connector, "Unknown".into(), "Unknown".into());
let state = State {
drm_lease_state,
active_leases: Vec::new(),
};
// Rest of the compositor goes hereStructs§
- DrmLease
- Active DRM Lease
- DrmLease
Builder - Builder struct to collect DRM resources to be leased
- DrmLease
Data - Data attached to wp_drm_lease_v1 objects
- DrmLease
Device Global Data - Data attached to a wp_drm_lease_device_v1 global
- DrmLease
Request - DRM lease request containing a set of requested connectors
- DrmLease
Request Data - Data attached to wp_drm_lease_request_v1 objects
- DrmLease
State - Delegate type for a drm_lease global
- Lease
Rejected - DRM lease was rejected by the compositor.
Enums§
- Error
- Errors thrown by the DRM lease global
Traits§
- DrmLease
Handler - Handler trait for drm leasing from the compositor.