Skip to content

Commit dbd4e79

Browse files
ids1024jackpot51
authored andcommitted
wayland: Avoid allocating more than 2 buffers
1 parent cdfae58 commit dbd4e79

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

src/wayland/mod.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::{error::unwrap, GraphicsContextImpl, SwBufError};
22
use raw_window_handle::{WaylandDisplayHandle, WaylandWindowHandle};
3+
use std::collections::VecDeque;
34
use wayland_client::{
45
backend::{Backend, ObjectId},
56
globals::{registry_queue_init, GlobalListContents},
@@ -17,7 +18,8 @@ pub struct WaylandImpl {
1718
qh: QueueHandle<State>,
1819
surface: wl_surface::WlSurface,
1920
shm: wl_shm::WlShm,
20-
buffers: Vec<WaylandBuffer>,
21+
// 0-2 buffers
22+
buffers: VecDeque<WaylandBuffer>,
2123
}
2224

2325
impl WaylandImpl {
@@ -53,20 +55,28 @@ impl WaylandImpl {
5355
qh,
5456
surface,
5557
shm,
56-
buffers: Vec::new(),
58+
buffers: Default::default(),
5759
})
5860
}
5961

6062
// Allocate or reuse a buffer of the given size
6163
fn buffer(&mut self, width: i32, height: i32) -> &WaylandBuffer {
62-
if let Some(idx) = self.buffers.iter().position(|i| i.released()) {
63-
self.buffers[idx].resize(width, height);
64-
&mut self.buffers[idx]
64+
let buffer = if let Some(mut buffer) = self.buffers.pop_front() {
65+
if buffer.released() {
66+
buffer.resize(width, height);
67+
buffer
68+
} else {
69+
// If we have more than 1 unreleased buffer, destroy it
70+
if self.buffers.len() == 0 {
71+
self.buffers.push_back(buffer);
72+
}
73+
WaylandBuffer::new(&self.shm, width, height, &self.qh)
74+
}
6575
} else {
66-
self.buffers
67-
.push(WaylandBuffer::new(&self.shm, width, height, &self.qh));
68-
self.buffers.last().unwrap()
69-
}
76+
WaylandBuffer::new(&self.shm, width, height, &self.qh)
77+
};
78+
self.buffers.push_back(buffer);
79+
self.buffers.back().unwrap()
7080
}
7181
}
7282

0 commit comments

Comments
 (0)