kms: New backend
New backend utilizing a thread per surface for precise frame scheduling.
This commit is contained in:
parent
3b7bba3add
commit
469a366207
24 changed files with 3219 additions and 1958 deletions
|
|
@ -9,12 +9,12 @@ use smithay::{
|
|||
impl BufferHandler for State {
|
||||
fn buffer_destroyed(&mut self, buffer: &WlBuffer) {
|
||||
if let BackendData::Kms(kms_state) = &mut self.backend {
|
||||
for device in kms_state.devices.values_mut() {
|
||||
for device in kms_state.drm_devices.values_mut() {
|
||||
if device.active_buffers.remove(&buffer.downgrade()) {
|
||||
if !device.in_use(&kms_state.primary_node) {
|
||||
kms_state.api.as_mut().remove_node(&device.render_node);
|
||||
if !device.in_use(kms_state.primary_node.as_ref()) {
|
||||
kms_state.refresh_used_devices();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,12 +35,13 @@ impl DmabufHandler for State {
|
|||
|
||||
if let BackendData::Kms(kms_state) = &mut self.backend {
|
||||
if let Some(device) = kms_state
|
||||
.devices
|
||||
.drm_devices
|
||||
.values_mut()
|
||||
.find(|dev| dev.render_node == node)
|
||||
{
|
||||
device.active_buffers.insert(buffer.downgrade());
|
||||
}
|
||||
kms_state.refresh_used_devices();
|
||||
}
|
||||
}
|
||||
Ok(None) => {
|
||||
|
|
|
|||
|
|
@ -26,12 +26,14 @@ impl DrmHandler<Option<DrmNode>> for State {
|
|||
// kms backend
|
||||
if let BackendData::Kms(kms_state) = &mut self.backend {
|
||||
if let Some(device) = kms_state
|
||||
.devices
|
||||
.drm_devices
|
||||
.values_mut()
|
||||
.find(|device| device.render_node == node)
|
||||
{
|
||||
device.active_buffers.insert(buffer.downgrade());
|
||||
}
|
||||
|
||||
kms_state.refresh_used_devices();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ impl DrmLeaseHandler for State {
|
|||
fn drm_lease_state(&mut self, node: DrmNode) -> &mut DrmLeaseState {
|
||||
self.backend
|
||||
.kms()
|
||||
.devices
|
||||
.drm_devices
|
||||
.get_mut(&node)
|
||||
.unwrap()
|
||||
.leasing_global
|
||||
|
|
@ -29,14 +29,14 @@ impl DrmLeaseHandler for State {
|
|||
let backend = self
|
||||
.backend
|
||||
.kms()
|
||||
.devices
|
||||
.drm_devices
|
||||
.get_mut(&node)
|
||||
.ok_or(LeaseRejected::default())?;
|
||||
|
||||
let mut builder = DrmLeaseBuilder::new(&backend.drm);
|
||||
for conn in request.connectors {
|
||||
if let Some((_, crtc)) = backend
|
||||
.non_desktop_connectors
|
||||
.leased_connectors
|
||||
.iter()
|
||||
.find(|(handle, _)| *handle == conn)
|
||||
{
|
||||
|
|
@ -63,14 +63,14 @@ impl DrmLeaseHandler for State {
|
|||
}
|
||||
|
||||
fn new_active_lease(&mut self, node: DrmNode, lease: DrmLease) {
|
||||
if let Some(backend) = self.backend.kms().devices.get_mut(&node) {
|
||||
if let Some(backend) = self.backend.kms().drm_devices.get_mut(&node) {
|
||||
backend.active_leases.push(lease);
|
||||
}
|
||||
// else the backend is gone, drop the lease
|
||||
}
|
||||
|
||||
fn lease_destroyed(&mut self, node: DrmNode, lease: u32) {
|
||||
if let Some(backend) = self.backend.kms().devices.get_mut(&node) {
|
||||
if let Some(backend) = self.backend.kms().drm_devices.get_mut(&node) {
|
||||
backend.active_leases.retain(|l| l.id() != lease);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -359,7 +359,7 @@ fn constraints_for_output(output: &Output, backend: &mut BackendData) -> Option<
|
|||
BackendData::Kms(ref mut kms) => {
|
||||
let node = kms
|
||||
.target_node_for_output(&output)
|
||||
.unwrap_or(kms.primary_node);
|
||||
.unwrap_or(kms.primary_node.expect("No Software Rendering"));
|
||||
_kms_renderer = Some(kms.api.single_renderer(&node).unwrap());
|
||||
_kms_renderer.as_mut().unwrap().as_mut()
|
||||
}
|
||||
|
|
@ -388,7 +388,7 @@ fn constraints_for_toplevel(
|
|||
})
|
||||
.flatten();
|
||||
|
||||
let node = dma_node.unwrap_or(kms.primary_node);
|
||||
let node = dma_node.unwrap_or(kms.primary_node.expect("No Software Rendering"));
|
||||
_kms_renderer = Some(kms.api.single_renderer(&node).unwrap());
|
||||
_kms_renderer.as_mut().unwrap().as_mut()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ use smithay::{
|
|||
utils::{Relocate, RelocateRenderElement},
|
||||
AsRenderElements, RenderElement,
|
||||
},
|
||||
gles::{GlesError, GlesRenderbuffer},
|
||||
gles::GlesRenderbuffer,
|
||||
sync::SyncPoint,
|
||||
utils::with_renderer_surface_state,
|
||||
Bind, Blit, BufferType, ExportMem, ImportAll, ImportMem, Offscreen, Renderer,
|
||||
|
|
@ -35,7 +35,7 @@ use tracing::warn;
|
|||
use crate::{
|
||||
backend::render::{
|
||||
cursor,
|
||||
element::{AsGlowRenderer, CosmicElement, DamageElement},
|
||||
element::{AsGlowRenderer, CosmicElement, DamageElement, FromGlesError},
|
||||
render_workspace, CursorMode, CLEAR_COLOR,
|
||||
},
|
||||
shell::{CosmicMappedRenderElement, CosmicSurface, WorkspaceRenderElement},
|
||||
|
|
@ -325,7 +325,7 @@ pub fn render_workspace_to_buffer(
|
|||
BackendData::Kms(kms) => {
|
||||
let render_node = kms
|
||||
.target_node_for_output(&output)
|
||||
.unwrap_or(kms.primary_node);
|
||||
.unwrap_or(kms.primary_node.expect("No Software Rendering"));
|
||||
let target_node = get_dmabuf(&buffer)
|
||||
.ok()
|
||||
.and_then(|dma| dma.node())
|
||||
|
|
@ -609,7 +609,7 @@ pub fn render_window_to_buffer(
|
|||
})
|
||||
.flatten()
|
||||
})
|
||||
.unwrap_or(kms.primary_node);
|
||||
.unwrap_or(kms.primary_node.expect("No Software Rendering"));
|
||||
|
||||
let mut multirenderer = match kms.api.single_renderer(&node) {
|
||||
Ok(renderer) => renderer,
|
||||
|
|
@ -800,7 +800,10 @@ pub fn render_cursor_to_buffer(
|
|||
let common = &mut state.common;
|
||||
let result = match &mut state.backend {
|
||||
BackendData::Kms(kms) => {
|
||||
let mut multirenderer = match kms.api.single_renderer(&kms.primary_node) {
|
||||
let mut multirenderer = match kms
|
||||
.api
|
||||
.single_renderer(&kms.primary_node.expect("No Software Rendering"))
|
||||
{
|
||||
Ok(renderer) => renderer,
|
||||
Err(err) => {
|
||||
warn!(?err, "Couldn't use node for screencopy");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue