Commit 9e85aa9c authored by Michel Dänzer's avatar Michel Dänzer Committed by Michel Dänzer

xwayland/glamor-gbm: Add xwl_glamor_gbm_post_damage hook

It flushes any pending drawing to the kernel, to make sure it'll be
visible to the Wayland server.

Without this, it was possible for the Wayland server to process surface
commits before Xwayland got around to flushing the corresponding
drawing, which could result in stale or even completely random window
contents being visible.

v2:
* Make EGL backend post_damage hook mandatory, don't check for NULL in
  xwl_glamor_post_damage. (Olivier Fourdan)

Closes: #951Reviewed-by: default avatarOlivier Fourdan <ofourdan@redhat.com>
parent 6a5e47c5
Pipeline #103863 passed with stages
in 7 minutes and 16 seconds
......@@ -49,6 +49,7 @@
#include "xwayland-glamor.h"
#include "xwayland-pixmap.h"
#include "xwayland-screen.h"
#include "xwayland-window.h"
#include "linux-dmabuf-unstable-v1-client-protocol.h"
......@@ -919,6 +920,14 @@ xwl_glamor_gbm_has_wl_interfaces(struct xwl_screen *xwl_screen)
return TRUE;
}
static void
xwl_glamor_gbm_post_damage(struct xwl_window *xwl_window, PixmapPtr pixmap,
RegionPtr region)
{
/* Make sure any pending drawing to the pixmap is flushed to the kernel */
glamor_block_handler(xwl_window->xwl_screen->screen);
}
static Bool
xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen)
{
......@@ -1111,5 +1120,6 @@ xwl_glamor_init_gbm(struct xwl_screen *xwl_screen)
xwl_screen->gbm_backend.init_egl = xwl_glamor_gbm_init_egl;
xwl_screen->gbm_backend.init_screen = xwl_glamor_gbm_init_screen;
xwl_screen->gbm_backend.get_wl_buffer_for_pixmap = xwl_glamor_gbm_get_wl_buffer_for_pixmap;
xwl_screen->gbm_backend.post_damage = xwl_glamor_gbm_post_damage;
xwl_screen->gbm_backend.is_available = TRUE;
}
......@@ -124,8 +124,7 @@ xwl_glamor_post_damage(struct xwl_window *xwl_window,
{
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
if (xwl_screen->egl_backend->post_damage)
xwl_screen->egl_backend->post_damage(xwl_window, pixmap, region);
xwl_screen->egl_backend->post_damage(xwl_window, pixmap, region);
}
Bool
......
......@@ -70,10 +70,8 @@ struct xwl_egl_backend {
Bool *created);
/* Called by Xwayland to perform any pre-wl_surface damage routines
* that are required by the backend. If your backend is poorly
* designed and lacks the ability to render directly to a surface,
* you should implement blitting from the glamor pixmap to the wayland
* pixmap here. Otherwise, this callback is optional.
* that are required by the backend to make sure any pending drawing
* operations to the pixmap will be visible to the Wayland server.
*/
void (*post_damage)(struct xwl_window *xwl_window,
PixmapPtr pixmap, RegionPtr region);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment