diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-03 14:22:04 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-03 14:22:04 +0400 |
| commit | cc1c9d93254df120fc1041e121cb3b5edd00ffc9 (patch) | |
| tree | b39afcd0df6d74ec10bf511aed23b16ce105fe11 /src/handlers/compositor.rs | |
| parent | 03a9fd8af3bbd8a0e6dbc33516dce83cce564166 (diff) | |
| download | niri-cc1c9d93254df120fc1041e121cb3b5edd00ffc9.tar.gz niri-cc1c9d93254df120fc1041e121cb3b5edd00ffc9.tar.bz2 niri-cc1c9d93254df120fc1041e121cb3b5edd00ffc9.zip | |
Add initial dmabuf feedback implementation
Diffstat (limited to 'src/handlers/compositor.rs')
| -rw-r--r-- | src/handlers/compositor.rs | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/handlers/compositor.rs b/src/handlers/compositor.rs index 035daafc..5f7bf71d 100644 --- a/src/handlers/compositor.rs +++ b/src/handlers/compositor.rs @@ -2,13 +2,16 @@ use std::collections::hash_map::Entry; use smithay::backend::renderer::utils::{on_commit_buffer_handler, with_renderer_surface_state}; use smithay::desktop::find_popup_root_surface; +use smithay::reexports::calloop::Interest; use smithay::reexports::wayland_server::protocol::wl_buffer; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; -use smithay::reexports::wayland_server::Client; +use smithay::reexports::wayland_server::{Client, Resource}; use smithay::wayland::buffer::BufferHandler; use smithay::wayland::compositor::{ - get_parent, is_sync_subsurface, CompositorClientState, CompositorHandler, CompositorState, + add_blocker, add_pre_commit_hook, get_parent, is_sync_subsurface, with_states, + BufferAssignment, CompositorClientState, CompositorHandler, CompositorState, SurfaceAttributes, }; +use smithay::wayland::dmabuf::get_dmabuf; use smithay::wayland::shm::{ShmHandler, ShmState}; use smithay::{delegate_compositor, delegate_shm}; @@ -24,6 +27,39 @@ impl CompositorHandler for State { &client.get_data::<ClientState>().unwrap().compositor_state } + fn new_surface(&mut self, surface: &WlSurface) { + add_pre_commit_hook::<Self, _>(surface, move |state, _dh, surface| { + let maybe_dmabuf = with_states(surface, |surface_data| { + surface_data + .cached_state + .pending::<SurfaceAttributes>() + .buffer + .as_ref() + .and_then(|assignment| match assignment { + BufferAssignment::NewBuffer(buffer) => get_dmabuf(buffer).ok(), + _ => None, + }) + }); + if let Some(dmabuf) = maybe_dmabuf { + if let Ok((blocker, source)) = dmabuf.generate_blocker(Interest::READ) { + let client = surface.client().unwrap(); + let res = state + .niri + .event_loop + .insert_source(source, move |_, _, data| { + data.state + .client_compositor_state(&client) + .blocker_cleared(&mut data.state, &data.display.handle()); + Ok(()) + }); + if res.is_ok() { + add_blocker(surface, blocker); + } + } + } + }) + } + fn commit(&mut self, surface: &WlSurface) { let _span = tracy_client::span!("CompositorHandler::commit"); |
