[mutter] renderer/native: Make sure we're not destroying an active EGLSurface



commit 56ddaaa3809240a357b5e19b5789d1aa49aaecc3
Author: Jonas Ådahl <jadahl gmail com>
Date:   Mon Jun 17 18:18:42 2019 +0200

    renderer/native: Make sure we're not destroying an active EGLSurface
    
    When making a new surface/context pair current, mesa may want to flush
    the old context. Make sure we don't try to flush any freed memory by
    unmaking a surface/context pair current before freeing it.
    
    Not doing this results in the following valgrind warnings:
    
    ==15986== Invalid read of size 8
    ==15986==    at 0x69A6D80: dri_flush_front_buffer (gbm_dri.c:92)
    ==15986==    by 0x1750D458: intel_flush_front (brw_context.c:251)
    ==15986==    by 0x1750D4BB: intel_glFlush (brw_context.c:296)
    ==15986==    by 0x1739D8DD: dri2_make_current (egl_dri2.c:1461)
    ==15986==    by 0x17393A3A: eglMakeCurrent (eglapi.c:869)
    ==15986==    by 0x54381FB: InternalMakeCurrentVendor (in 
/home/jonas/Dev/gnome/install/lib/libEGL.so.1.1.0)
    ==15986==    by 0x5438515: eglMakeCurrent (in /home/jonas/Dev/gnome/install/lib/libEGL.so.1.1.0)
    ==15986==    by 0x522A782: _cogl_winsys_egl_make_current (cogl-winsys-egl.c:303)
    ==15986==    by 0x49B64C8: meta_renderer_native_create_view (meta-renderer-native.c:3076)
    ==15986==    by 0x48D26E7: meta_renderer_create_view (meta-renderer.c:78)
    ==15986==    by 0x48D277A: meta_renderer_rebuild_views (meta-renderer.c:111)
    ==15986==    by 0x49BF46E: meta_stage_native_rebuild_views (meta-stage-native.c:142)
    ==15986==  Address 0x1b076600 is 0 bytes inside a block of size 48 free'd
    ==15986==    at 0x4839A0C: free (vg_replace_malloc.c:540)
    ==15986==    by 0x49B59F3: meta_renderer_native_release_onscreen (meta-renderer-native.c:2651)
    ==15986==    by 0x5211441: _cogl_onscreen_free (cogl-onscreen.c:167)
    ==15986==    by 0x5210D81: _cogl_object_onscreen_indirect_free (cogl-onscreen.c:51)
    ==15986==    by 0x51D0066: _cogl_object_default_unref (cogl-object.c:103)
    ==15986==    by 0x520F989: _cogl_framebuffer_unref (cogl-framebuffer.c:1814)
    ==15986==    by 0x51D00B1: cogl_object_unref (cogl-object.c:115)
    ==15986==    by 0x536F3C7: clutter_stage_view_dispose (clutter-stage-view.c:304)
    ==15986==    by 0x4B7DAF2: g_object_unref (gobject.c:3309)
    ==15986==    by 0x4A9596C: g_list_foreach (glist.c:1013)
    ==15986==    by 0x4A9599A: g_list_free_full (glist.c:223)
    ==15986==    by 0x48D2737: meta_renderer_rebuild_views (meta-renderer.c:100)
    ==15986==  Block was alloc'd at
    ==15986==    at 0x483AB1A: calloc (vg_replace_malloc.c:762)
    ==15986==    by 0x69A76B2: gbm_dri_surface_create (gbm_dri.c:1252)
    ==15986==    by 0x69A6BFE: gbm_surface_create (gbm.c:600)
    ==15986==    by 0x49B4E29: meta_renderer_native_create_surface_gbm (meta-renderer-native.c:2221)
    ==15986==    by 0x49B57DB: meta_onscreen_native_allocate (meta-renderer-native.c:2569)
    ==15986==    by 0x49B6423: meta_renderer_native_create_view (meta-renderer-native.c:3062)
    ==15986==    by 0x48D26E7: meta_renderer_create_view (meta-renderer.c:78)
    ==15986==    by 0x48D277A: meta_renderer_rebuild_views (meta-renderer.c:111)
    ==15986==    by 0x49BF46E: meta_stage_native_rebuild_views (meta-stage-native.c:142)
    ==15986==    by 0x49A75B5: meta_backend_native_update_screen_size (meta-backend-native.c:520)
    ==15986==    by 0x48B01BB: meta_backend_sync_screen_size (meta-backend.c:224)
    ==15986==    by 0x48B09B7: meta_backend_real_post_init (meta-backend.c:501)
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/622

 src/backends/native/meta-renderer-native.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)
---
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 3d5b19e1e..2cd7806d7 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -2910,6 +2910,8 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
 {
   CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
   CoglContext *cogl_context = framebuffer->context;
+  CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
+  CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
   CoglRenderer *cogl_renderer = cogl_context->display->renderer;
   CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
   CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
@@ -2922,6 +2924,17 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
 
   onscreen_native = onscreen_egl->platform;
 
+  if (onscreen_egl->egl_surface != EGL_NO_SURFACE &&
+      (cogl_display_egl->current_draw_surface == onscreen_egl->egl_surface ||
+       cogl_display_egl->current_read_surface == onscreen_egl->egl_surface))
+    {
+      if (!_cogl_winsys_egl_make_current (cogl_display,
+                                          cogl_display_egl->dummy_surface,
+                                          cogl_display_egl->dummy_surface,
+                                          cogl_display_egl->egl_context))
+        g_warning ("Failed to clear current context");
+    }
+
   g_list_free_full (onscreen_native->pending_page_flip_retries,
                     (GDestroyNotify) retry_page_flip_data_free);
   if (onscreen_native->retry_page_flips_source)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]