diff options
author | Ander Conselvan de Oliveira <[email protected]> | 2012-11-30 17:41:02 +0200 |
---|---|---|
committer | Kristian Høgsberg <[email protected]> | 2012-11-30 11:08:04 -0500 |
commit | ca3ed3e024864e91ca3cccc59fb96950e1d079b5 (patch) | |
tree | b93557df91947ab72cff269c8d6c3800fc8500cf /src/egl/drivers | |
parent | b5c53245afcb35632cc662ff7f84a578eba864c3 (diff) |
egl/wayland: Don't invalidate drawable on swap buffers
We used to invalidate the drawable after a call to eglSwapBuffers(),
so that a wl_egl_window_resize() would take effect for the next frame.
However, that leads to calling dri2_get_buffers() when eglMakeCurrent()
is called with the current context and surface, and a later call to
wl_egl_window_resize() would not take effect until the next buffer
swap.
Instead, add a callback from wl_egl_window_resize() back to the wayland
egl platform, and invalidate the drawable only when it is resized.
This solves a bug on wayland clients when going back to windowed mode
from fullscreen when clicking a pop up menu, where the window size
after this would be the fullscreen size.
Note: this is a candidate for stable branches.
CC: [email protected]
Diffstat (limited to 'src/egl/drivers')
-rw-r--r-- | src/egl/drivers/dri2/platform_wayland.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 772116a1925..7b90387a68f 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -97,6 +97,16 @@ static struct wl_buffer_listener wl_buffer_listener = { wl_buffer_release }; +static void +resize_callback(struct wl_egl_window *wl_win, void *data) +{ + struct dri2_egl_surface *dri2_surf = data; + struct dri2_egl_display *dri2_dpy = + dri2_egl_display(dri2_surf->base.Resource.Display); + + (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); +} + /** * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). */ @@ -142,6 +152,9 @@ dri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, case EGL_WINDOW_BIT: dri2_surf->wl_win = (struct wl_egl_window *) window; + dri2_surf->wl_win->private = dri2_surf; + dri2_surf->wl_win->resize_callback = resize_callback; + dri2_surf->base.Width = -1; dri2_surf->base.Height = -1; break; @@ -216,6 +229,12 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf) if (dri2_surf->frame_callback) wl_callback_destroy(dri2_surf->frame_callback); + + if (dri2_surf->base.Type == EGL_WINDOW_BIT) { + dri2_surf->wl_win->private = NULL; + dri2_surf->wl_win->resize_callback = NULL; + } + free(surf); return EGL_TRUE; @@ -587,7 +606,6 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) } (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); - (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); return EGL_TRUE; } |