Use array instead of tuple for screencopy swapchain

Can switch to triple buffering by changing one character.
This commit is contained in:
Ian Douglas Scott 2024-01-25 16:16:26 -08:00
parent 6e422b740c
commit 9faaa4d6c8

View file

@ -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 {