kms: Track active clients instead of active buffers
This commit is contained in:
parent
a15e378f1e
commit
ca00df0b37
6 changed files with 72 additions and 131 deletions
|
|
@ -1,27 +1,10 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::state::{BackendData, State};
|
||||
use crate::state::State;
|
||||
use smithay::{
|
||||
reexports::wayland_server::{Resource, protocol::wl_buffer::WlBuffer},
|
||||
wayland::buffer::BufferHandler,
|
||||
reexports::wayland_server::protocol::wl_buffer::WlBuffer, wayland::buffer::BufferHandler,
|
||||
};
|
||||
use tracing::warn;
|
||||
|
||||
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.drm_devices.values_mut() {
|
||||
if device.inner.active_buffers.remove(&buffer.downgrade())
|
||||
&& !device
|
||||
.inner
|
||||
.in_use(kms_state.primary_node.read().unwrap().as_ref())
|
||||
{
|
||||
if let Err(err) = kms_state.refresh_used_devices() {
|
||||
warn!(?err, "Failed to init devices.");
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fn buffer_destroyed(&mut self, _buffer: &WlBuffer) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::state::{BackendData, State};
|
||||
use crate::state::State;
|
||||
use smithay::{
|
||||
backend::allocator::dmabuf::Dmabuf,
|
||||
delegate_dmabuf,
|
||||
reexports::wayland_server::Resource,
|
||||
wayland::dmabuf::{DmabufGlobal, DmabufHandler, DmabufState, ImportNotifier},
|
||||
};
|
||||
use tracing::warn;
|
||||
|
||||
impl DmabufHandler for State {
|
||||
fn dmabuf_state(&mut self) -> &mut DmabufState {
|
||||
|
|
@ -20,34 +18,13 @@ impl DmabufHandler for State {
|
|||
dmabuf: Dmabuf,
|
||||
import_notifier: ImportNotifier,
|
||||
) {
|
||||
match self
|
||||
.backend
|
||||
.dmabuf_imported(import_notifier.client(), global, dmabuf)
|
||||
{
|
||||
let client = import_notifier.client();
|
||||
match self.backend.dmabuf_imported(client.clone(), global, dmabuf) {
|
||||
Err(err) => {
|
||||
tracing::debug!(?err, "dmabuf import failed");
|
||||
import_notifier.failed()
|
||||
}
|
||||
Ok(Some(node)) => {
|
||||
// kms backend
|
||||
let Ok(buffer) = import_notifier.successful::<State>() else {
|
||||
return;
|
||||
};
|
||||
|
||||
if let BackendData::Kms(kms_state) = &mut self.backend {
|
||||
if let Some(device) = kms_state
|
||||
.drm_devices
|
||||
.values_mut()
|
||||
.find(|dev| dev.inner.render_node == node)
|
||||
{
|
||||
device.inner.active_buffers.insert(buffer.downgrade());
|
||||
}
|
||||
if let Err(err) = kms_state.refresh_used_devices() {
|
||||
warn!(?err, "Failed to init devices.");
|
||||
};
|
||||
}
|
||||
}
|
||||
Ok(None) => {
|
||||
Ok(_) => {
|
||||
let _ = import_notifier.successful::<State>();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::{
|
||||
state::{BackendData, State},
|
||||
state::State,
|
||||
wayland::protocols::drm::{DrmHandler, ImportError, delegate_wl_drm},
|
||||
};
|
||||
use smithay::{
|
||||
backend::{allocator::dmabuf::Dmabuf, drm::DrmNode},
|
||||
reexports::wayland_server::{Resource, protocol::wl_buffer::WlBuffer},
|
||||
reexports::wayland_server::protocol::wl_buffer::WlBuffer,
|
||||
wayland::dmabuf::DmabufGlobal,
|
||||
};
|
||||
use tracing::warn;
|
||||
|
||||
impl DrmHandler<Option<DrmNode>> for State {
|
||||
fn dmabuf_imported(
|
||||
|
|
@ -22,24 +21,7 @@ impl DrmHandler<Option<DrmNode>> for State {
|
|||
.map_err(|_| ImportError::Failed)
|
||||
}
|
||||
|
||||
fn buffer_created(&mut self, buffer: WlBuffer, result: Option<DrmNode>) {
|
||||
if let Some(node) = result {
|
||||
// kms backend
|
||||
if let BackendData::Kms(kms_state) = &mut self.backend {
|
||||
if let Some(device) = kms_state
|
||||
.drm_devices
|
||||
.values_mut()
|
||||
.find(|device| device.inner.render_node == node)
|
||||
{
|
||||
device.inner.active_buffers.insert(buffer.downgrade());
|
||||
}
|
||||
|
||||
if let Err(err) = kms_state.refresh_used_devices() {
|
||||
warn!(?err, "Failed to init devices.");
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
fn buffer_created(&mut self, _buffer: WlBuffer, _result: Option<DrmNode>) {}
|
||||
}
|
||||
|
||||
delegate_wl_drm!(State; Option<DrmNode>);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue