[mutter] wayland: don't prematurely release EGL buffers



commit 7adbb587365a75e283736a36bd009a6360907d62
Author: Ray Strode <rstrode redhat com>
Date:   Tue Feb 2 11:13:34 2016 -0500

    wayland: don't prematurely release EGL buffers
    
    commit 0165cb697466ba0843b993416e00d4f768c00d45 changed
    mutter to release committed shm buffers as soon as they were
    uploaded to the GPU.
    
    It also inadvertently changed mutter to prematurely
    release EGL buffers (which never get copied, but get used
    directly).
    
    This commit corrects that mistake.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=761312

 src/wayland/meta-wayland-buffer.c  |    3 +++
 src/wayland/meta-wayland-buffer.h  |    1 +
 src/wayland/meta-wayland-surface.c |    2 +-
 3 files changed, 5 insertions(+), 1 deletions(-)
---
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index bb0e8d2..1d9b0c3 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -140,6 +140,9 @@ meta_wayland_buffer_ensure_texture (MetaWaylandBuffer *buffer)
 
   buffer->texture = texture;
 
+  if (shm_buffer)
+    buffer->copied_data = TRUE;
+
  out:
   return buffer->texture;
 }
diff --git a/src/wayland/meta-wayland-buffer.h b/src/wayland/meta-wayland-buffer.h
index 9f6a5bf..22cbcc1 100644
--- a/src/wayland/meta-wayland-buffer.h
+++ b/src/wayland/meta-wayland-buffer.h
@@ -41,6 +41,7 @@ struct _MetaWaylandBuffer
   uint32_t ref_count;
 
   uint32_t accessible : 1;
+  uint32_t copied_data : 1;
 };
 
 MetaWaylandBuffer *     meta_wayland_buffer_from_resource       (struct wl_resource    *resource);
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 4f8b244..cab05df 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -608,7 +608,7 @@ apply_pending_state (MetaWaylandSurface      *surface,
   if (!cairo_region_is_empty (pending->damage))
     surface_process_damage (surface, pending->damage);
 
-  if (pending->buffer)
+  if (pending->buffer && pending->buffer->copied_data)
     meta_wayland_buffer_release_control (pending->buffer);
 
   surface->offset_x += pending->dx;


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