mirror of
https://src.fedoraproject.org/rpms/mesa.git
synced 2024-12-01 04:02:55 +00:00
62 lines
2.5 KiB
Diff
62 lines
2.5 KiB
Diff
|
From 0f0d7cd2ecf20d0f74df6c6ec7d04bb3b7156c30 Mon Sep 17 00:00:00 2001
|
||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||
|
Date: Tue, 20 Nov 2018 18:06:38 +0100
|
||
|
Subject: [PATCH] wayland/egl: Ensure EGL surface is resized on DRI
|
||
|
update_buffers()
|
||
|
|
||
|
Fullscreening and unfullscreening a totem window while playing a video
|
||
|
sometimes results in the video subsurface not changing size along. This
|
||
|
is also reproducible with epiphany.
|
||
|
|
||
|
If a surface gets resized while we have an active back buffer for it, the
|
||
|
resized dimensions won't get neither immediately applied on the resize
|
||
|
callback, nor correctly synchronized on update_buffers(), as the
|
||
|
(now stale) surface size and currently attached buffer size still do match.
|
||
|
|
||
|
There's actually 2 things to synchronize here, first the surface query
|
||
|
size might not be updated yet to the wl_egl_window's (i.e. resize_callback
|
||
|
happened while there is a back buffer), and second the wayland buffers
|
||
|
would need dropping if new surface size differs with the currently attached
|
||
|
buffer. These are done in separate steps now.
|
||
|
|
||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1650929
|
||
|
|
||
|
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
|
||
|
Tested-by: Bastien Nocera <hadess@hadess.net>
|
||
|
---
|
||
|
src/egl/drivers/dri2/platform_wayland.c | 11 +++++++----
|
||
|
1 file changed, 7 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
|
||
|
index 34e09d7ec1..474a13316b 100644
|
||
|
--- a/src/egl/drivers/dri2/platform_wayland.c
|
||
|
+++ b/src/egl/drivers/dri2/platform_wayland.c
|
||
|
@@ -597,10 +597,8 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
|
||
|
struct dri2_egl_display *dri2_dpy =
|
||
|
dri2_egl_display(dri2_surf->base.Resource.Display);
|
||
|
|
||
|
- if (dri2_surf->base.Width != dri2_surf->wl_win->attached_width ||
|
||
|
- dri2_surf->base.Height != dri2_surf->wl_win->attached_height) {
|
||
|
-
|
||
|
- dri2_wl_release_buffers(dri2_surf);
|
||
|
+ if (dri2_surf->base.Width != dri2_surf->wl_win->width ||
|
||
|
+ dri2_surf->base.Height != dri2_surf->wl_win->height) {
|
||
|
|
||
|
dri2_surf->base.Width = dri2_surf->wl_win->width;
|
||
|
dri2_surf->base.Height = dri2_surf->wl_win->height;
|
||
|
@@ -608,6 +606,11 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
|
||
|
dri2_surf->dy = dri2_surf->wl_win->dy;
|
||
|
}
|
||
|
|
||
|
+ if (dri2_surf->base.Width != dri2_surf->wl_win->attached_width ||
|
||
|
+ dri2_surf->base.Height != dri2_surf->wl_win->attached_height) {
|
||
|
+ dri2_wl_release_buffers(dri2_surf);
|
||
|
+ }
|
||
|
+
|
||
|
if (get_back_bo(dri2_surf) < 0) {
|
||
|
_eglError(EGL_BAD_ALLOC, "failed to allocate color buffer");
|
||
|
return -1;
|
||
|
--
|
||
|
2.20.0.rc2
|
||
|
|