pepper: change buffer reference policy
authorJunghoon <jh13.son@samsung.com>
Sun, 18 Oct 2015 04:14:55 +0000 (13:14 +0900)
committerJunghoon <jh13.son@samsung.com>
Sun, 18 Oct 2015 04:14:55 +0000 (13:14 +0900)
    - not to reference buffer in backend

Change-Id: I89009a8ba6cc8ee06e371a2c4b0986d83cba70ad

src/lib/drm/drm-output.c
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper.h
src/lib/pepper/surface.c
src/lib/render/gl-renderer.c
src/lib/render/pixman-renderer.c

index 3087af97cf4643b6177cbcd18f944d9669df9bb1..61ed17c183f7825c00df393eb01006b1bb45c8c0 100644 (file)
@@ -170,6 +170,15 @@ drm_output_assign_planes(void *o, const pepper_list_t *view_list)
     {
         pepper_view_t      *view = l->item;
         pepper_plane_t     *plane = NULL;
+        pepper_surface_t   *surface = pepper_view_get_surface(view);
+        pepper_buffer_t    *buffer = pepper_surface_get_buffer(surface);
+
+        if ((output->render_type == DRM_RENDER_TYPE_PIXMAN) ||
+            (buffer &&
+             (!wl_shm_buffer_get(pepper_buffer_get_resource(buffer)))))
+            pepper_surface_set_keep_buffer(surface, PEPPER_TRUE);
+        else
+            pepper_surface_set_keep_buffer(surface, PEPPER_FALSE);
 
         if (plane == NULL)
             plane = assign_cursor_plane(output, view);
index 933e3638234bcda93c15bd7a098bdb99498749ab..32f1c03ffbdfe2cecd5ee38a7e4c4e58649f62b2 100644 (file)
@@ -157,6 +157,7 @@ struct pepper_surface
         int32_t                  x, y;
         int32_t                  transform;
         int32_t                  scale;
+        pepper_bool_t            keep_buffer;
     } buffer;
 
     /* Surface size in surface local coordinate space.
index fb48b0c280ac3de79fc24042c39be5ad5e838993..b8e69a1a043ff0a4b15fe0e3bbbda777c67e98ea 100644 (file)
@@ -514,6 +514,12 @@ pepper_surface_get_opaque_region(pepper_surface_t *surface);
 PEPPER_API pixman_region32_t *
 pepper_surface_get_input_region(pepper_surface_t *surface);
 
+PEPPER_API pepper_bool_t
+pepper_surface_get_keep_buffer(pepper_surface_t *surface);
+
+PEPPER_API void
+pepper_surface_set_keep_buffer(pepper_surface_t *surface, pepper_bool_t keep_buffer);
+
 /* Buffer. */
 PEPPER_API void
 pepper_buffer_reference(pepper_buffer_t *buffer);
index 2da11480abeda7de8631d895cc3e3a57be03001a..09387c73abe601d8ca95dacbb1a11e0cb066d072 100644 (file)
@@ -525,6 +525,18 @@ pepper_surface_get_input_region(pepper_surface_t *surface)
     return &surface->input_region;
 }
 
+PEPPER_API pepper_bool_t
+pepper_surface_get_keep_buffer(pepper_surface_t *surface)
+{
+    return surface->buffer.keep_buffer;
+}
+
+PEPPER_API void
+pepper_surface_set_keep_buffer(pepper_surface_t *surface, pepper_bool_t keep_buffer)
+{
+    surface->buffer.keep_buffer = keep_buffer;
+}
+
 void
 pepper_surface_flush_damage(pepper_surface_t *surface)
 {
@@ -542,7 +554,7 @@ pepper_surface_flush_damage(pepper_surface_t *surface)
 
     pixman_region32_clear(&surface->damage_region);
 
-    if (surface->buffer.buffer)
+    if (surface->buffer.buffer && !surface->buffer.keep_buffer)
     {
         pepper_buffer_unreference(surface->buffer.buffer);
         pepper_event_listener_remove(surface->buffer.destroy_listener);
index e239790b8b0db75248f67902d215a96db0ee6d72..8d463f9eefca5a4c3f80bbf70cf2629c85dd16cb 100644 (file)
@@ -236,7 +236,6 @@ struct gl_surface_state
     gl_renderer_t      *renderer;
     pepper_surface_t   *surface;
 
-    pepper_buffer_t    *buffer;
     int                 buffer_width, buffer_height;
     int                 buffer_type;
 
@@ -401,14 +400,6 @@ surface_state_release_buffer(gl_surface_state_t *state)
     }
 
     state->num_planes = 0;
-
-    if (state->buffer)
-    {
-        pepper_buffer_unreference(state->buffer);
-        state->buffer = NULL;
-
-        pepper_event_listener_remove(state->buffer_destroy_listener);
-    }
 }
 
 static void
@@ -434,6 +425,8 @@ surface_state_handle_buffer_destroy(pepper_event_listener_t    *listener,
 {
     gl_surface_state_t *state = data;
     surface_state_release_buffer(state);
+    pepper_event_listener_remove(state->buffer_destroy_listener);
+    state->buffer_destroy_listener = NULL;
 }
 
 static gl_surface_state_t *
@@ -594,7 +587,7 @@ gl_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *surfac
         *h = 0;
 
         surface_state_release_buffer(state);
-        return PEPPER_FALSE;
+        goto done;
     }
 
     surface_state_destroy_images(state);
@@ -610,20 +603,18 @@ gl_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *surfac
     return PEPPER_FALSE;
 
 done:
-    pepper_buffer_reference(buffer);
 
-    /* Release previous buffer. */
-    if (state->buffer)
+    if (state->buffer_destroy_listener)
     {
-        pepper_buffer_unreference(state->buffer);
         pepper_event_listener_remove(state->buffer_destroy_listener);
+        state->buffer_destroy_listener = NULL;
     }
 
-    /* Set new buffer. */
-    state->buffer = buffer;
-    state->buffer_destroy_listener =
-        pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
-                                         surface_state_handle_buffer_destroy, state);
+    if (buffer)
+        state->buffer_destroy_listener =
+            pepper_object_add_event_listener((pepper_object_t *)buffer,
+                                             PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                             surface_state_handle_buffer_destroy, state);
 
     /* Output buffer size info. */
     *w = state->buffer_width;
@@ -637,8 +628,9 @@ gl_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_surface_t *
 {
     gl_renderer_t      *gr = (gl_renderer_t *)renderer;
     gl_surface_state_t *state = get_surface_state(renderer, surface);
+    pepper_buffer_t    *buffer = pepper_surface_get_buffer(surface);
 
-    if (!state->buffer)
+    if (!buffer)
         return PEPPER_FALSE;
 
     if (state->buffer_type == BUFFER_TYPE_EGL)
@@ -649,7 +641,7 @@ gl_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_surface_t *
         int                 texture_format;
         int                 i;
         EGLDisplay          display = gr->display;
-        struct wl_resource *resource = pepper_buffer_get_resource(state->buffer);
+        struct wl_resource *resource = pepper_buffer_get_resource(buffer);
 
         if (!gr->query_buffer(display, resource, EGL_TEXTURE_FORMAT, &texture_format))
             return PEPPER_FALSE;
@@ -701,7 +693,7 @@ gl_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_surface_t *
         }
 
         state->sampler = sampler;
-        goto done;
+        return PEPPER_TRUE;
     }
 
     /* state->buffer_type == BUFFER_TYPE_SHM */
@@ -716,7 +708,7 @@ gl_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_surface_t *
                      state->shm.format, state->shm.pixel_format,
                      wl_shm_buffer_get_data(state->shm.buffer));
         wl_shm_buffer_end_access(state->shm.buffer);
-        goto done;
+        return PEPPER_TRUE;
     }
 
     /* Texture upload. */
@@ -757,11 +749,6 @@ gl_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_surface_t *
         wl_shm_buffer_end_access(state->shm.buffer);
     }
 
-done:
-    pepper_buffer_unreference(state->buffer);
-    pepper_event_listener_remove(state->buffer_destroy_listener);
-    state->buffer = NULL;
-
     return PEPPER_TRUE;
 }
 
index 179dbcb1abd728a6c153f3a288ebd6f25e06286e..8127c7c30b8693cb3cd56e73eaba892cb76fd0b8 100644 (file)
@@ -23,7 +23,6 @@ struct pixman_surface_state
     pixman_renderer_t  *renderer;
 
     pepper_surface_t   *surface;
-    pepper_buffer_t    *buffer;
     int                 buffer_width, buffer_height;
     pixman_image_t     *image;
 
@@ -52,14 +51,6 @@ surface_state_release_buffer(pixman_surface_state_t *state)
         pixman_image_unref(state->image);
         state->image = NULL;
     }
-
-    if (state->buffer)
-    {
-        pepper_buffer_unreference(state->buffer);
-        state->buffer = NULL;
-
-        pepper_event_listener_remove(state->buffer_destroy_listener);
-    }
 }
 
 static void
@@ -86,6 +77,8 @@ surface_state_handle_buffer_destroy(pepper_event_listener_t    *listener,
 {
     pixman_surface_state_t *state = data;
     surface_state_release_buffer(state);
+    pepper_event_listener_remove(state->buffer_destroy_listener);
+    state->buffer_destroy_listener = NULL;
 }
 
 static pixman_surface_state_t *
@@ -170,7 +163,7 @@ pixman_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *su
         *h = 0;
 
         surface_state_release_buffer(state);
-        return PEPPER_TRUE;
+        goto done;
     }
 
     if (surface_state_attach_shm(state, buffer))
@@ -181,20 +174,18 @@ pixman_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *su
     return PEPPER_FALSE;
 
 done:
-    pepper_buffer_reference(buffer);
 
-    /* Release previous buffer. */
-    if (state->buffer)
+    if (state->buffer_destroy_listener)
     {
-        pepper_buffer_unreference(state->buffer);
         pepper_event_listener_remove(state->buffer_destroy_listener);
+        state->buffer_destroy_listener = NULL;
     }
 
-    /* Set new buffer. */
-    state->buffer = buffer;
-    state->buffer_destroy_listener =
-        pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
-                                         surface_state_handle_buffer_destroy, state);
+    if (buffer)
+        state->buffer_destroy_listener =
+            pepper_object_add_event_listener((pepper_object_t *)buffer,
+                                             PEPPER_EVENT_OBJECT_DESTROY, 0,
+                                             surface_state_handle_buffer_destroy, state);
 
     /* Output buffer size info. */
     *w = state->buffer_width;