session-lock: fix race with multiple outputs

The race is as follows:
1. Output A commits and sets render state to pending_lock_surface
2. Output B commits and sets render state to pending_lock_surface
3. Output A presents and sets render state to lock_surface
4. maybeLock() does not lock because waiting on output B
5. Output A commits and sets render state to pending_lock_surface
6. Output B presents and sets render state to lock_surface
4. maybeLock() does not lock because waiting on output A
This commit is contained in:
Isaac Freund 2023-03-01 11:33:26 +01:00
parent 472f882f42
commit 5f0af38992
No known key found for this signature in database
GPG Key ID: 86DED400DDFD7A11

View File

@ -428,8 +428,16 @@ fn handleFrame(listener: *wl.Listener(*wlr.Output), _: *wlr.Output) void {
.unlocked, .pending_blank, .pending_lock_surface => unreachable, .unlocked, .pending_blank, .pending_lock_surface => unreachable,
.blanked, .lock_surface => {}, .blanked, .lock_surface => {},
}, },
.waiting_for_blank => output.lock_render_state = .pending_blank, .waiting_for_blank => {
.waiting_for_lock_surfaces => output.lock_render_state = .pending_lock_surface, if (output.lock_render_state != .blanked) {
output.lock_render_state = .pending_blank;
}
},
.waiting_for_lock_surfaces => {
if (output.lock_render_state != .lock_surface) {
output.lock_render_state = .pending_lock_surface;
}
},
} }
} }
} else { } else {