Use array instead of tuple for screencopy swapchain
Can switch to triple buffering by changing one character.
This commit is contained in:
parent
6e422b740c
commit
9faaa4d6c8
1 changed files with 11 additions and 13 deletions
|
|
@ -10,14 +10,15 @@ use cosmic::cctk::{
|
||||||
wayland_client::{Connection, QueueHandle, WEnum},
|
wayland_client::{Connection, QueueHandle, WEnum},
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
mem,
|
array,
|
||||||
sync::{Arc, Weak},
|
sync::{Arc, Weak},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{AppData, Buffer, Capture, CaptureImage, CaptureSource, Event};
|
use super::{AppData, Buffer, Capture, CaptureImage, CaptureSource, Event};
|
||||||
|
|
||||||
pub struct ScreencopySession {
|
pub struct ScreencopySession {
|
||||||
buffers: Option<(Buffer, Buffer)>,
|
// swapchain buffers
|
||||||
|
buffers: Option<[Buffer; 2]>,
|
||||||
session: zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1,
|
session: zcosmic_screencopy_session_v1::ZcosmicScreencopySessionV1,
|
||||||
first_frame: bool,
|
first_frame: bool,
|
||||||
}
|
}
|
||||||
|
|
@ -57,11 +58,11 @@ impl ScreencopySession {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn attach_buffer_and_commit(&mut self, capture: &Capture, conn: &Connection) {
|
fn attach_buffer_and_commit(&mut self, capture: &Capture, conn: &Connection) {
|
||||||
let Some((front, back)) = self.buffers.as_mut() else {
|
let Some(back) = self.buffers.as_mut().and_then(|x| x.last()) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let node = front.node().and_then(|x| x.to_str().map(|x| x.to_string()));
|
let node = back.node().and_then(|x| x.to_str().map(|x| x.to_string()));
|
||||||
|
|
||||||
self.session.attach_buffer(&back.buffer, node, 0); // XXX age?
|
self.session.attach_buffer(&back.buffer, node, 0); // XXX age?
|
||||||
if self.first_frame {
|
if self.first_frame {
|
||||||
|
|
@ -116,13 +117,10 @@ impl ScreencopyHandler for AppData {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create new buffer if none, or different format
|
// Create new buffer if none, or different format
|
||||||
if !session.buffers.as_ref().map_or(false, |(front, _)| {
|
if !session.buffers.as_ref().map_or(false, |buffers| {
|
||||||
buffer_infos.contains(&front.buffer_info)
|
buffer_infos.contains(&buffers[0].buffer_info)
|
||||||
}) {
|
}) {
|
||||||
session.buffers = Some((
|
session.buffers = Some(array::from_fn(|_| self.create_buffer(buffer_infos)));
|
||||||
self.create_buffer(buffer_infos),
|
|
||||||
self.create_buffer(buffer_infos),
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
session.attach_buffer_and_commit(&capture, conn);
|
session.attach_buffer_and_commit(&capture, conn);
|
||||||
|
|
@ -147,13 +145,13 @@ impl ScreencopyHandler for AppData {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let (front, back) = session.buffers.as_mut().unwrap();
|
// swap buffers
|
||||||
mem::swap(front, back);
|
session.buffers.as_mut().unwrap().rotate_left(1);
|
||||||
|
|
||||||
// Capture again on damage
|
// Capture again on damage
|
||||||
session.attach_buffer_and_commit(&capture, conn);
|
session.attach_buffer_and_commit(&capture, conn);
|
||||||
|
|
||||||
let (front, _) = session.buffers.as_mut().unwrap();
|
let front = session.buffers.as_mut().unwrap().first_mut().unwrap();
|
||||||
let img = unsafe { front.to_image() };
|
let img = unsafe { front.to_image() };
|
||||||
let image = CaptureImage { img };
|
let image = CaptureImage { img };
|
||||||
match &capture.source {
|
match &capture.source {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue