Free framebuffers correctly
This commit is contained in:
parent
fa6742fb5f
commit
457d6d1c35
|
@ -424,6 +424,36 @@ impl DrmBackend {
|
|||
}
|
||||
}
|
||||
|
||||
impl Drop for DrmBackend {
|
||||
fn drop(&mut self) {
|
||||
// Drop framebuffers attached to the userdata of the gbm surface buffers.
|
||||
// (They don't implement drop, as they need the device)
|
||||
self.0.borrow_mut().graphics.rent_all_mut(|graphics| {
|
||||
if let Some(fb) = graphics.gbm.surface.rent(|egl| {
|
||||
if let Some(mut next) = egl.buffers.next_buffer.take() {
|
||||
return next.take_userdata();
|
||||
} else {
|
||||
if let Ok(mut next) = graphics.gbm.surface.head().lock_front_buffer() {
|
||||
return next.take_userdata();
|
||||
}
|
||||
}
|
||||
None
|
||||
}) {
|
||||
// ignore failure at this point
|
||||
let _ = framebuffer::destroy(&*graphics.context.devices.drm, fb.handle());
|
||||
}
|
||||
|
||||
if let Some(fb) = graphics.gbm.surface.rent_mut(|egl| {
|
||||
let first = egl.buffers.front_buffer.get_mut();
|
||||
first.take_userdata()
|
||||
}) {
|
||||
// ignore failure at this point
|
||||
let _ = framebuffer::destroy(&*graphics.context.devices.drm, fb.handle());
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl GraphicsBackend for DrmBackend {
|
||||
type CursorFormat = ImageBuffer<Rgba<u8>, Vec<u8>>;
|
||||
type Error = Error;
|
||||
|
|
Loading…
Reference in New Issue