If a 2D application is started on top of a fullscreen 3D application, which is flipping, then we need to stop flipping and restore the root window to using the screen pixmap. Normally this would be done as part of an unflip. However, in the case that there is a pending flip there is no mechanism to abort so the unflip is deferred until the pending flip completes. This provides a window of opportunity for the 2D application to draw to the wrong pixmap.
This problem is avoided by fixing up the root window pixmap immediately but deferring the unflip as usual. Signed-off-by: Frank Binns <[email protected]> --- present/present.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/present/present.c b/present/present.c index 73d5f69..2a96928 100644 --- a/present/present.c +++ b/present/present.c @@ -469,8 +469,14 @@ present_check_flip_window (WindowPtr window) */ if (flip_pending->window == window) { if (!present_check_flip(flip_pending->crtc, window, flip_pending->pixmap, - flip_pending->sync_flip, NULL, 0, 0)) + flip_pending->sync_flip, NULL, 0, 0)) { + /* Switch the root window back to using the screen pixmap now + * to avoid 2D applications drawing to the wrong pixmap. + */ + present_set_tree_pixmap(screen->root, (*screen->GetScreenPixmap)(screen)); + flip_pending->abort_flip = TRUE; + } } } else { /* -- 1.8.5.4.gfdaaaa2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
