From dbd4e796f18be0c66953d924ba42f80708562993 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 20 Dec 2022 15:05:20 -0800 Subject: [PATCH] wayland: Avoid allocating more than 2 buffers --- src/wayland/mod.rs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/wayland/mod.rs b/src/wayland/mod.rs index 147ecfd..a65688b 100644 --- a/src/wayland/mod.rs +++ b/src/wayland/mod.rs @@ -1,5 +1,6 @@ use crate::{error::unwrap, GraphicsContextImpl, SwBufError}; use raw_window_handle::{WaylandDisplayHandle, WaylandWindowHandle}; +use std::collections::VecDeque; use wayland_client::{ backend::{Backend, ObjectId}, globals::{registry_queue_init, GlobalListContents}, @@ -17,7 +18,8 @@ pub struct WaylandImpl { qh: QueueHandle, surface: wl_surface::WlSurface, shm: wl_shm::WlShm, - buffers: Vec, + // 0-2 buffers + buffers: VecDeque, } impl WaylandImpl { @@ -53,20 +55,28 @@ impl WaylandImpl { qh, surface, shm, - buffers: Vec::new(), + buffers: Default::default(), }) } // Allocate or reuse a buffer of the given size fn buffer(&mut self, width: i32, height: i32) -> &WaylandBuffer { - if let Some(idx) = self.buffers.iter().position(|i| i.released()) { - self.buffers[idx].resize(width, height); - &mut self.buffers[idx] + let buffer = if let Some(mut buffer) = self.buffers.pop_front() { + if buffer.released() { + buffer.resize(width, height); + buffer + } else { + // If we have more than 1 unreleased buffer, destroy it + if self.buffers.len() == 0 { + self.buffers.push_back(buffer); + } + WaylandBuffer::new(&self.shm, width, height, &self.qh) + } } else { - self.buffers - .push(WaylandBuffer::new(&self.shm, width, height, &self.qh)); - self.buffers.last().unwrap() - } + WaylandBuffer::new(&self.shm, width, height, &self.qh) + }; + self.buffers.push_back(buffer); + self.buffers.back().unwrap() } }