1
1
use crate :: { error:: unwrap, GraphicsContextImpl , SwBufError } ;
2
2
use raw_window_handle:: { WaylandDisplayHandle , WaylandWindowHandle } ;
3
+ use std:: collections:: VecDeque ;
3
4
use wayland_client:: {
4
5
backend:: { Backend , ObjectId } ,
5
6
globals:: { registry_queue_init, GlobalListContents } ,
@@ -17,7 +18,8 @@ pub struct WaylandImpl {
17
18
qh : QueueHandle < State > ,
18
19
surface : wl_surface:: WlSurface ,
19
20
shm : wl_shm:: WlShm ,
20
- buffers : Vec < WaylandBuffer > ,
21
+ // 0-2 buffers
22
+ buffers : VecDeque < WaylandBuffer > ,
21
23
}
22
24
23
25
impl WaylandImpl {
@@ -53,20 +55,28 @@ impl WaylandImpl {
53
55
qh,
54
56
surface,
55
57
shm,
56
- buffers : Vec :: new ( ) ,
58
+ buffers : Default :: default ( ) ,
57
59
} )
58
60
}
59
61
60
62
// Allocate or reuse a buffer of the given size
61
63
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
+ }
65
75
} 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 ( )
70
80
}
71
81
}
72
82
0 commit comments