mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 19:42:05 +00:00
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.
This commit is contained in:
parent
a9a923c6f3
commit
7c71a06936
@ -638,17 +638,33 @@ mir_surface_recreate (CoglOnscreen *onscreen)
|
|||||||
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
|
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
|
||||||
CoglOnscreenMir *mir_onscreen = egl_onscreen->platform;
|
CoglOnscreenMir *mir_onscreen = egl_onscreen->platform;
|
||||||
const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer);
|
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);
|
winsys->onscreen_deinit (onscreen);
|
||||||
|
|
||||||
_cogl_framebuffer_winsys_update_size (framebuffer,
|
_cogl_framebuffer_winsys_update_size (framebuffer, w, h);
|
||||||
mir_onscreen->requested_width,
|
|
||||||
mir_onscreen->requested_height);
|
|
||||||
|
|
||||||
winsys->onscreen_init (onscreen, NULL);
|
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
|
static void
|
||||||
@ -763,7 +779,7 @@ cogl_mir_onscreen_resize (CoglOnscreen *onscreen,
|
|||||||
_cogl_framebuffer_winsys_update_size (framebuffer, width, height);
|
_cogl_framebuffer_winsys_update_size (framebuffer, width, height);
|
||||||
_cogl_onscreen_notify_resize (onscreen);
|
_cogl_onscreen_notify_resize (onscreen);
|
||||||
}
|
}
|
||||||
else
|
else if (!onscreen->foreign_surface)
|
||||||
{
|
{
|
||||||
egl_onscreen = onscreen->winsys;
|
egl_onscreen = onscreen->winsys;
|
||||||
mir_onscreen = egl_onscreen->platform;
|
mir_onscreen = egl_onscreen->platform;
|
||||||
|
Loading…
Reference in New Issue
Block a user