drm: trigger vblank on commit
This commit is contained in:
parent
74187f55fc
commit
41696f5364
|
@ -75,12 +75,15 @@ impl<D: RawDevice + 'static> GbmSurfaceInternal<D> {
|
||||||
|
|
||||||
if self.recreated.get() {
|
if self.recreated.get() {
|
||||||
debug!(self.logger, "Commiting new state");
|
debug!(self.logger, "Commiting new state");
|
||||||
self.crtc.commit(fb).map_err(|_| SwapBuffersError::ContextLost)?;
|
if let Err(err) = self.crtc.commit(fb) {
|
||||||
self.recreated.set(false);
|
error!(self.logger, "Error commiting crtc: {}", err);
|
||||||
|
return Err(SwapBuffersError::ContextLost);
|
||||||
}
|
}
|
||||||
|
self.recreated.set(false);
|
||||||
|
} else {
|
||||||
trace!(self.logger, "Queueing Page flip");
|
trace!(self.logger, "Queueing Page flip");
|
||||||
RawSurface::page_flip(&self.crtc, fb)?;
|
RawSurface::page_flip(&self.crtc, fb)?;
|
||||||
|
}
|
||||||
|
|
||||||
self.current_frame_buffer.set(Some(fb));
|
self.current_frame_buffer.set(Some(fb));
|
||||||
|
|
||||||
|
|
|
@ -251,7 +251,18 @@ impl<A: AsRawFd + 'static> RawSurface for LegacyDrmSurfaceInternal<A> {
|
||||||
|
|
||||||
*current = pending.clone();
|
*current = pending.clone();
|
||||||
|
|
||||||
Ok(())
|
ControlDevice::page_flip(
|
||||||
|
self,
|
||||||
|
self.crtc,
|
||||||
|
framebuffer,
|
||||||
|
&[PageFlipFlags::PageFlipEvent],
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.map_err(|source| Error::Access {
|
||||||
|
errmsg: "Failed to queue page flip",
|
||||||
|
dev: self.dev_path(),
|
||||||
|
source: source.compat(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn page_flip(&self, framebuffer: framebuffer::Handle) -> ::std::result::Result<(), SwapBuffersError> {
|
fn page_flip(&self, framebuffer: framebuffer::Handle) -> ::std::result::Result<(), SwapBuffersError> {
|
||||||
|
|
|
@ -205,7 +205,10 @@ pub trait RawSurface: Surface + ControlDevice + BasicDevice {
|
||||||
/// potentially causing some flickering. Check before performing this
|
/// potentially causing some flickering. Check before performing this
|
||||||
/// operation if a commit really is necessary using [`commit_pending`](RawSurface::commit_pending).
|
/// operation if a commit really is necessary using [`commit_pending`](RawSurface::commit_pending).
|
||||||
///
|
///
|
||||||
/// This operation is blocking until the crtc is in the desired state.
|
/// This operation is not necessarily blocking until the crtc is in the desired state,
|
||||||
|
/// but will trigger a `vblank` event once done.
|
||||||
|
/// Make sure to [set a `DeviceHandler`](Device::set_handler) and
|
||||||
|
/// [register the belonging `Device`](device_bind) before to receive the event in time.
|
||||||
fn commit(&self, framebuffer: framebuffer::Handle) -> Result<(), <Self as Surface>::Error>;
|
fn commit(&self, framebuffer: framebuffer::Handle) -> Result<(), <Self as Surface>::Error>;
|
||||||
/// Page-flip the underlying [`crtc`](drm::control::crtc)
|
/// Page-flip the underlying [`crtc`](drm::control::crtc)
|
||||||
/// to a new given [`framebuffer`].
|
/// to a new given [`framebuffer`].
|
||||||
|
|
Loading…
Reference in New Issue