Fix damage issue when multiple buffers are in use
wldash was originally written to expect server-side shm buffer optimizations, which make it so only a single buffer has to be in use. This simplifies damage tracking and repaint needs. Support for using multiple buffers was added to support e.g., jay, but the damage handling was not in place for this to work. Fix that by tracking damage per buffer.
This commit is contained in:
@@ -83,6 +83,7 @@ pub struct ShmBuffer {
|
||||
pub buffer: wl_buffer::WlBuffer,
|
||||
pub refcnt: u32,
|
||||
pub id: u32,
|
||||
pub last_damage: Vec<Geometry>,
|
||||
}
|
||||
|
||||
impl ShmBuffer {
|
||||
@@ -111,6 +112,7 @@ impl ShmBuffer {
|
||||
mmap,
|
||||
buffer,
|
||||
id,
|
||||
last_damage: Vec::new(),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
+14
-10
@@ -220,11 +220,6 @@ fn main() {
|
||||
keyrepeat_sender,
|
||||
);
|
||||
|
||||
let mut damage = Vec::new();
|
||||
for _ in 0..state.widgets.len() {
|
||||
damage.push(Geometry::new());
|
||||
}
|
||||
|
||||
// Initial setup
|
||||
//
|
||||
while state.running && !state.ready {
|
||||
@@ -249,7 +244,7 @@ fn main() {
|
||||
force = true;
|
||||
}
|
||||
|
||||
// We expect to see the usual shm optimization
|
||||
let mut bufcnt = state.bufmgr.buffers.len();
|
||||
let buf = match state.bufmgr.next_buffer() {
|
||||
Some(b) => b,
|
||||
None => {
|
||||
@@ -257,6 +252,8 @@ fn main() {
|
||||
continue;
|
||||
}
|
||||
state.add_buffer(&qhandle);
|
||||
bufcnt = state.bufmgr.buffers.len();
|
||||
|
||||
match state.bufmgr.next_buffer() {
|
||||
Some(b) => b,
|
||||
None => {
|
||||
@@ -266,6 +263,12 @@ fn main() {
|
||||
}
|
||||
};
|
||||
|
||||
if buf.last_damage.len() == 0 {
|
||||
for _ in 0..state.widgets.len() {
|
||||
buf.last_damage.push(Geometry::new());
|
||||
}
|
||||
}
|
||||
|
||||
state.dirty = false;
|
||||
buf.acquire();
|
||||
let mut bufview = BufferView::new(
|
||||
@@ -279,17 +282,18 @@ fn main() {
|
||||
if force || widget.get_dirty() {
|
||||
let geo = widget.geometry();
|
||||
let mut subview = bufview.subgeometry(geo);
|
||||
damage[idx] = widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
buf.last_damage[idx] =
|
||||
widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
}
|
||||
}
|
||||
surface.damage_buffer(0, 0, 0x7FFFFFFF, 0x7FFFFFFF);
|
||||
} else {
|
||||
let mut drew = false;
|
||||
for (idx, widget) in state.widgets.iter_mut().enumerate() {
|
||||
if widget.get_dirty() {
|
||||
if bufcnt > 1 || widget.get_dirty() {
|
||||
drew = true;
|
||||
|
||||
let old_damage = damage[idx];
|
||||
let old_damage = buf.last_damage[idx];
|
||||
bufview.subgeometry(old_damage).clear();
|
||||
|
||||
let geo = widget.geometry();
|
||||
@@ -298,7 +302,7 @@ fn main() {
|
||||
let new_damage =
|
||||
widget.draw(&mut state.fonts.unwrap().borrow_mut(), &mut subview);
|
||||
let combined_damage = new_damage.expand(old_damage);
|
||||
damage[idx] = new_damage;
|
||||
buf.last_damage[idx] = new_damage;
|
||||
|
||||
surface.damage_buffer(
|
||||
combined_damage.x as i32,
|
||||
|
||||
Reference in New Issue
Block a user