client: set expire flag to allocated buffer in handle deactive 53/193853/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 27 Nov 2018 06:14:07 +0000 (15:14 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 27 Nov 2018 06:15:48 +0000 (15:15 +0900)
if user set GURANTEE_CYCLE mode to queue, free callback of allocated buffer is
called when it is released. it is possbile that queue state is active when free
callback is called.
so if expire flag of buffer is set, free buffer even if queue state is active
and don't return buffer in queue_get_surfaces.

Change-Id: If89c0e3e2c0de44f66e6c3e3d7936a142f0a3d27

src/wayland-tbm-client.c

index 8d0db95..4c36877 100644 (file)
@@ -64,6 +64,7 @@ struct wayland_tbm_buffer {
        int allocated;
        int reuse;
        int usable;
+       int expire;
 
        int width;
        int height;
@@ -901,6 +902,7 @@ _wayland_tbm_client_queue_destroy_unused_attach_bufs(struct wayland_tbm_surface_
        wl_list_for_each_safe(buffer, tmp, &queue_info->attach_bufs, link) {
                if (buffer->allocated) {
                        *need_flush = 1;
+                       buffer->expire = 1;
                        continue;
                }
 #ifdef DEBUG_TRACE
@@ -1025,7 +1027,7 @@ __wayland_tbm_client_surface_alloc_cb(tbm_surface_queue_h surface_queue, void *d
 
        if (queue_info->is_active && queue_info->active_flush) {
                wl_list_for_each_reverse(buffer, &queue_info->attach_bufs, link) {
-                       if (!buffer->allocated && buffer->usable) {
+                       if (!buffer->allocated && buffer->usable && !buffer->expire) {
                                if (_wayland_tbm_client_is_valid_attach_bufs(queue_info, buffer)) {
                                        surface = buffer->tbm_surface;
                                        /* ref.. pair of __wayland_tbm_client_surface_free_cb */
@@ -1083,7 +1085,7 @@ __wayland_tbm_client_surface_free_cb(tbm_surface_queue_h surface_queue, void *da
                buffer->allocated = 0;
                buffer->reuse = 1;
 
-               if (queue_info->is_active) continue;
+               if (queue_info->is_active && !buffer->expire) continue;
                if (buffer->wl_buffer)
                        wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
 
@@ -1654,14 +1656,19 @@ wayland_tbm_client_queue_get_surfaces(struct wayland_tbm_client *tbm_client,
        pthread_mutex_lock(&queue_info->lock);
 
        if (queue_info->is_active && queue_info->active_flush) {
+
                if (num)
-                       *num = wl_list_length(&queue_info->attach_bufs);
+                       *num = 0;
 
-               if (surfaces) {
-                       wl_list_for_each(buffer, &queue_info->attach_bufs, link) {
+               wl_list_for_each(buffer, &queue_info->attach_bufs, link) {
+                       if (buffer->expire) continue;
+
+                       if (surfaces) {
                                surfaces[index] = buffer->tbm_surface;
                                index++;
                        }
+
+                       if (num) *num = *num + 1;
                }
 
                pthread_mutex_unlock(&queue_info->lock);