diff options
author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2014-12-09 20:22:53 +0100 |
---|---|---|
committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2014-12-09 20:22:53 +0100 |
commit | 7c71a06936f846c0edc8d982ea765b775a292080 (patch) | |
tree | 9adf6ae56606f9bf704354110210474280f86c94 | |
parent | a9a923c6f3acdaa868c0092778a895f0305bbb6a (diff) |
mir: fix mir surface recreation on resize, bind and update pointers
don't try to read from free'd memory allocation, copy stuff before
deinitializing the old onscreen.
Also, don't try to resize a foreign surface.
-rw-r--r-- | cogl/winsys/cogl-winsys-egl-mir.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/cogl/winsys/cogl-winsys-egl-mir.c b/cogl/winsys/cogl-winsys-egl-mir.c index 1f19b0b2..e7bbfde5 100644 --- a/cogl/winsys/cogl-winsys-egl-mir.c +++ b/cogl/winsys/cogl-winsys-egl-mir.c @@ -638,17 +638,33 @@ mir_surface_recreate (CoglOnscreen *onscreen) CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenMir *mir_onscreen = egl_onscreen->platform; const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer); + MirSurfaceState last_state, current_state; + int w, h; + + g_mutex_lock (&mir_onscreen->mir_event_lock); + mir_onscreen->requested_resize = FALSE; + w = mir_onscreen->requested_width; + h = mir_onscreen->requested_height; + last_state = mir_onscreen->last_state; + current_state = mir_surface_get_state (mir_onscreen->mir_surface); + g_mutex_unlock (&mir_onscreen->mir_event_lock); winsys->onscreen_deinit (onscreen); - _cogl_framebuffer_winsys_update_size (framebuffer, - mir_onscreen->requested_width, - mir_onscreen->requested_height); + _cogl_framebuffer_winsys_update_size (framebuffer, w, h); winsys->onscreen_init (onscreen, NULL); - _cogl_onscreen_notify_resize (onscreen); + winsys->onscreen_bind (onscreen); - mir_onscreen->requested_resize = FALSE; + egl_onscreen = onscreen->winsys; + mir_onscreen = egl_onscreen->platform; + + g_mutex_lock (&mir_onscreen->mir_event_lock); + mir_onscreen->last_state = last_state; + mir_surface_set_state (mir_onscreen->mir_surface, current_state); + _cogl_onscreen_queue_full_dirty (onscreen); + _cogl_onscreen_notify_resize (onscreen); + g_mutex_unlock (&mir_onscreen->mir_event_lock); } static void @@ -763,7 +779,7 @@ cogl_mir_onscreen_resize (CoglOnscreen *onscreen, _cogl_framebuffer_winsys_update_size (framebuffer, width, height); _cogl_onscreen_notify_resize (onscreen); } - else + else if (!onscreen->foreign_surface) { egl_onscreen = onscreen->winsys; mir_onscreen = egl_onscreen->platform; |