Compare commits
1 commit
master
...
feat/scree
| Author | SHA1 | Date | |
|---|---|---|---|
| 9b2550d567 |
6 changed files with 85 additions and 27 deletions
|
|
@ -86,9 +86,7 @@ impl ExtImageCopyCaptureFrameV1 {
|
||||||
let buffer = self.session.buffer.get().unwrap();
|
let buffer = self.session.buffer.get().unwrap();
|
||||||
if size != buffer.rect.size() {
|
if size != buffer.rect.size() {
|
||||||
self.session.buffer_size_changed();
|
self.session.buffer_size_changed();
|
||||||
// https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/222
|
return Err(FrameFailureReason::BufferConstraints);
|
||||||
// self.fail(FrameFailureReason::BufferConstraints);
|
|
||||||
// return;
|
|
||||||
}
|
}
|
||||||
if let Err(e) = buffer.update_framebuffer() {
|
if let Err(e) = buffer.update_framebuffer() {
|
||||||
log::error!("Could not import buffer: {}", ErrorFmt(e));
|
log::error!("Could not import buffer: {}", ErrorFmt(e));
|
||||||
|
|
@ -102,6 +100,13 @@ impl ExtImageCopyCaptureFrameV1 {
|
||||||
let mut shm_staging = self.session.shm_staging.take();
|
let mut shm_staging = self.session.shm_staging.take();
|
||||||
match storage {
|
match storage {
|
||||||
WlBufferStorage::Shm { mem, stride, .. } => {
|
WlBufferStorage::Shm { mem, stride, .. } => {
|
||||||
|
log::debug!(
|
||||||
|
"ext-image-copy frame {:?} using wl_shm readback path: {}x{}, stride {}",
|
||||||
|
self.id,
|
||||||
|
buffer.rect.width(),
|
||||||
|
buffer.rect.height(),
|
||||||
|
*stride,
|
||||||
|
);
|
||||||
if let Some(b) = &shm_bridge
|
if let Some(b) = &shm_bridge
|
||||||
&& (b.physical_size() != buffer.rect.size()
|
&& (b.physical_size() != buffer.rect.size()
|
||||||
|| b.format() != buffer.format
|
|| b.format() != buffer.format
|
||||||
|
|
@ -159,6 +164,12 @@ impl ExtImageCopyCaptureFrameV1 {
|
||||||
self.session.shm_staging.set(Some(staging));
|
self.session.shm_staging.set(Some(staging));
|
||||||
}
|
}
|
||||||
WlBufferStorage::Dmabuf { fb, .. } => {
|
WlBufferStorage::Dmabuf { fb, .. } => {
|
||||||
|
log::debug!(
|
||||||
|
"ext-image-copy frame {:?} using dmabuf GPU copy path: {}x{}",
|
||||||
|
self.id,
|
||||||
|
buffer.rect.width(),
|
||||||
|
buffer.rect.height(),
|
||||||
|
);
|
||||||
let Some(fb) = fb else {
|
let Some(fb) = fb else {
|
||||||
return Err(FrameFailureReason::BufferConstraints);
|
return Err(FrameFailureReason::BufferConstraints);
|
||||||
};
|
};
|
||||||
|
|
@ -187,7 +198,11 @@ impl ExtImageCopyCaptureFrameV1 {
|
||||||
) {
|
) {
|
||||||
match self.try_copy(on, size, f) {
|
match self.try_copy(on, size, f) {
|
||||||
Ok(()) => self.session.status.set(FrameStatus::Captured),
|
Ok(()) => self.session.status.set(FrameStatus::Captured),
|
||||||
Err(e) => self.fail(e),
|
Err(e) => {
|
||||||
|
if self.session.status.get() != FrameStatus::Failed {
|
||||||
|
self.fail(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,11 @@ impl ExtImageCopyCaptureSessionV1 {
|
||||||
if self.size_debounce.replace(true) {
|
if self.size_debounce.replace(true) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if let Some(frame) = self.frame.get()
|
||||||
|
&& let FrameStatus::Capturing | FrameStatus::Captured = self.status.get()
|
||||||
|
{
|
||||||
|
frame.fail(FrameFailureReason::BufferConstraints);
|
||||||
|
}
|
||||||
self.force_capture.set(true);
|
self.force_capture.set(true);
|
||||||
self.send_current_buffer_size();
|
self.send_current_buffer_size();
|
||||||
self.send_done();
|
self.send_done();
|
||||||
|
|
|
||||||
|
|
@ -48,16 +48,13 @@ impl ZwlrScreencopyFrameV1 {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_damage(&self) {
|
pub fn send_damage(&self) {
|
||||||
if let Some(output) = self.output.get() {
|
self.client.event(Damage {
|
||||||
let pos = output.pos.get();
|
self_id: self.id,
|
||||||
self.client.event(Damage {
|
x: 0,
|
||||||
self_id: self.id,
|
y: 0,
|
||||||
x: 0,
|
width: self.rect.width() as _,
|
||||||
y: 0,
|
height: self.rect.height() as _,
|
||||||
width: pos.width() as _,
|
});
|
||||||
height: pos.height() as _,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_buffer(&self) {
|
pub fn send_buffer(&self) {
|
||||||
|
|
@ -111,10 +108,28 @@ impl ZwlrScreencopyFrameV1 {
|
||||||
return Err(ZwlrScreencopyFrameV1Error::InvalidBufferFormat);
|
return Err(ZwlrScreencopyFrameV1Error::InvalidBufferFormat);
|
||||||
}
|
}
|
||||||
buffer.update_framebuffer()?;
|
buffer.update_framebuffer()?;
|
||||||
if let Some(WlBufferStorage::Shm { stride, .. }) = buffer.storage.borrow_mut().deref()
|
match buffer.storage.borrow_mut().deref() {
|
||||||
&& *stride != self.rect.width() * 4
|
Some(WlBufferStorage::Shm { stride, .. }) => {
|
||||||
{
|
if *stride != self.rect.width() * 4 {
|
||||||
return Err(ZwlrScreencopyFrameV1Error::InvalidBufferStride);
|
return Err(ZwlrScreencopyFrameV1Error::InvalidBufferStride);
|
||||||
|
}
|
||||||
|
log::debug!(
|
||||||
|
"zwlr_screencopy frame {:?} using wl_shm readback path: {}x{}, stride {}",
|
||||||
|
self.id,
|
||||||
|
self.rect.width(),
|
||||||
|
self.rect.height(),
|
||||||
|
*stride,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Some(WlBufferStorage::Dmabuf { .. }) => {
|
||||||
|
log::debug!(
|
||||||
|
"zwlr_screencopy frame {:?} using dmabuf GPU copy path: {}x{}",
|
||||||
|
self.id,
|
||||||
|
self.rect.width(),
|
||||||
|
self.rect.height(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
self.buffer.set(Some(buffer));
|
self.buffer.set(Some(buffer));
|
||||||
if !with_damage && let Some(global) = self.output.get() {
|
if !with_damage && let Some(global) = self.output.get() {
|
||||||
|
|
@ -134,6 +149,12 @@ impl ZwlrScreencopyFrameV1 {
|
||||||
}
|
}
|
||||||
self.pending.take();
|
self.pending.take();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn cancel(&self) {
|
||||||
|
self.buffer.take();
|
||||||
|
self.pending.take();
|
||||||
|
self.send_failed();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ZwlrScreencopyFrameV1RequestHandler for ZwlrScreencopyFrameV1 {
|
impl ZwlrScreencopyFrameV1RequestHandler for ZwlrScreencopyFrameV1 {
|
||||||
|
|
|
||||||
|
|
@ -104,8 +104,8 @@ impl ZwlrScreencopyManagerV1 {
|
||||||
let Some(global) = output.global.get() else {
|
let Some(global) = output.global.get() else {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
let mode = global.mode.get();
|
let (width, height) = global.pixel_size();
|
||||||
let mut rect = Rect::new_sized_saturating(0, 0, mode.width, mode.height);
|
let mut rect = Rect::new_sized_saturating(0, 0, width, height);
|
||||||
if let Some(region) = region {
|
if let Some(region) = region {
|
||||||
let scale = global.persistent.scale.get().to_f64();
|
let scale = global.persistent.scale.get().to_f64();
|
||||||
let x1 = (region.x1() as f64 * scale).round() as i32;
|
let x1 = (region.x1() as f64 * scale).round() as i32;
|
||||||
|
|
|
||||||
|
|
@ -315,6 +315,14 @@ impl PwClientNodeOwner for StartedScreencast {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log::debug!(
|
||||||
|
"Portal screencast using PipeWire dmabuf GPU copy path: {} buffers, format {}, modifier 0x{:08x}, size {}x{}",
|
||||||
|
self.buffers.borrow().len(),
|
||||||
|
self.format.get().name,
|
||||||
|
self.modifier.get(),
|
||||||
|
self.width.get(),
|
||||||
|
self.height.get(),
|
||||||
|
);
|
||||||
self.node
|
self.node
|
||||||
.send_port_output_buffers(&self.port, &self.buffers.borrow());
|
.send_port_output_buffers(&self.port, &self.buffers.borrow());
|
||||||
}
|
}
|
||||||
|
|
@ -633,15 +641,18 @@ impl UsrJayScreencastOwner for StartedScreencast {
|
||||||
|
|
||||||
fn ready(&self, ev: &Ready) {
|
fn ready(&self, ev: &Ready) {
|
||||||
let idx = ev.idx as usize;
|
let idx = ev.idx as usize;
|
||||||
let buffers = &*self.buffers.borrow();
|
|
||||||
let pbuffers = self.port.buffers.borrow();
|
|
||||||
let buffer = &buffers[idx];
|
|
||||||
let discard_buffer = || {
|
let discard_buffer = || {
|
||||||
self.jay_screencast.release_buffer(idx);
|
self.jay_screencast.release_buffer(idx);
|
||||||
};
|
};
|
||||||
if !self.buffers_valid.get() {
|
if !self.buffers_valid.get() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let buffers = self.buffers.borrow();
|
||||||
|
let Some(buffer) = buffers.get(idx) else {
|
||||||
|
log::warn!("Ignoring ready event for unknown screencast buffer {idx}");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let pbuffers = self.port.buffers.borrow();
|
||||||
let Some(io) = self.port.io_buffers.get() else {
|
let Some(io) = self.port.io_buffers.get() else {
|
||||||
discard_buffer();
|
discard_buffer();
|
||||||
return;
|
return;
|
||||||
|
|
@ -767,7 +778,7 @@ pub(super) fn add_screencast_dbus_members(
|
||||||
object.add_method::<Start, _>(move |req, pr| {
|
object.add_method::<Start, _>(move |req, pr| {
|
||||||
dbus_start(&state, req, pr);
|
dbus_start(&state, req, pr);
|
||||||
});
|
});
|
||||||
object.set_property::<AvailableSourceTypes>(Variant::U32(MONITOR.0));
|
object.set_property::<AvailableSourceTypes>(Variant::U32((MONITOR | WINDOW).0));
|
||||||
object.set_property::<AvailableCursorModes>(Variant::U32(EMBEDDED.0));
|
object.set_property::<AvailableCursorModes>(Variant::U32(EMBEDDED.0));
|
||||||
object.set_property::<version>(Variant::U32(5));
|
object.set_property::<version>(Variant::U32(5));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -460,9 +460,15 @@ impl OutputNode {
|
||||||
}
|
}
|
||||||
self.lock_surface.take();
|
self.lock_surface.take();
|
||||||
self.jay_outputs.clear();
|
self.jay_outputs.clear();
|
||||||
self.screencasts.clear();
|
for screencast in self.screencasts.lock().drain_values() {
|
||||||
self.screencopies.clear();
|
screencast.do_destroy();
|
||||||
self.ext_copy_sessions.clear();
|
}
|
||||||
|
for screencopy in self.screencopies.lock().drain_values() {
|
||||||
|
screencopy.cancel();
|
||||||
|
}
|
||||||
|
for session in self.ext_copy_sessions.lock().drain_values() {
|
||||||
|
session.stop();
|
||||||
|
}
|
||||||
self.ext_workspace_groups.clear();
|
self.ext_workspace_groups.clear();
|
||||||
self.latch_event.clear();
|
self.latch_event.clear();
|
||||||
self.vblank_event.clear();
|
self.vblank_event.clear();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue