path: root/src/egl/drivers
diff options
authorEric Anholt <>2013-06-21 15:34:52 -0700
committerKenneth Graunke <>2013-07-31 10:43:35 -0700
commiteed0a80137dfac641adfd39ce316938dbcf2be10 (patch)
tree92b8d389feda3c27a96da2d895a269da52bd50c7 /src/egl/drivers
parentb1ed7202dfb64c01313e78bd4fe290ecd08bf5f7 (diff)
egl: Restore "bogus" DRI2 invalidate event code.
I had removed it in commit 1e7776ca2bc59a6978d9b933d23852d47078dfa8 because it was obviously wrong -- why do we care whether the server is a version that emits events, if we're not watching for the server's events, anyway? And why would you only invalidate on a server that emits invalidate events, when the comment said to emit invalidates if the server *doesn't*? Only, I missed that we otherwise don't flag that our buffers might have changed at swap time at all, so the driver was only checking for new buffers when triggered by the Viewport hack. Of course you don't expect Viewport to be called after a swap. So, this is effectively a revert of the previous commit, except that I dropped the check for only emitting invalidates on a new server -- we *always* need to invalidate if we're doing a SwapBuffers. Bugzilla: Reviewed-by: Kenneth Graunke <> Cc: "9.1 and 9.2" <>
Diffstat (limited to 'src/egl/drivers')
1 files changed, 14 insertions, 0 deletions
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
index ccb097f1241..ec76aecfdd7 100644
--- a/src/egl/drivers/dri2/platform_x11.c
+++ b/src/egl/drivers/dri2/platform_x11.c
@@ -743,6 +743,20 @@ dri2_swap_buffers_msc(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw,
+ /* Since we aren't watching for the server's invalidate events like we're
+ * supposed to (due to XCB providing no mechanism for filtering the events
+ * the way xlib does), and SwapBuffers is a common cause of invalidate
+ * events, just shove one down to the driver, even though we haven't told
+ * the driver that we're the kind of loader that provides reliable
+ * invalidate events. This causes the driver to request buffers again at
+ * its next draw, so that we get the correct buffers if a pageflip
+ * happened. The driver should still be using the viewport hack to catch
+ * window resizes.
+ */
+ if (dri2_dpy->flush &&
+ dri2_dpy->flush->base.version >= 3 && dri2_dpy->flush->invalidate)
+ (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable);
return swap_count;