tbm_surface_h tbm_surface;
uint32_t flags;
int allocated;
- int reuse;
+ int exposed;
int usable;
int expire;
*/
buffer = _wayland_tbm_client_find_tbm_buffer_surface(tbm_client, surface);
- if (buffer)
+ if (buffer) {
+ WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p", buffer->wl_buffer, buffer->tbm_surface);
+ buffer->exposed = 1;
return buffer->wl_buffer;
+ }
if (tbm_surface_get_info(surface, &info) != TBM_SURFACE_ERROR_NONE) {
WL_TBM_LOG_E("Failed to create buffer from surface");
return (void *)tbm_client->bufmgr;
}
+static void
+_wayland_tbm_client_destroy_tbm_buffer(struct wayland_tbm_surface_queue *queue_info,
+ struct wayland_tbm_buffer *buffer)
+{
+ WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p surface_queue:%p",
+ buffer->wl_buffer, buffer->tbm_surface, queue_info->tbm_queue);
+
+ if (buffer->wl_buffer) {
+ WL_TBM_TRACE("wl_buffer:%p detach", buffer->wl_buffer);
+ wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
+
+ if (!buffer->exposed) {
+ WL_TBM_TRACE("wl_buffer:%p destroy", buffer->wl_buffer);
+ wl_buffer_destroy(buffer->wl_buffer);
+ buffer->wl_buffer = NULL;
+ }
+ }
+
+ wl_list_remove(&buffer->link);
+ free(buffer);
+}
+
static void
_wayland_tbm_client_queue_get_attach_bufs(struct wayland_tbm_surface_queue *queue_info,
int unused, tbm_surface_h *surfaces, int *count)
{
struct wayland_tbm_buffer *buffer, *tmp;
- wl_list_for_each_safe(buffer, tmp, &queue_info->attach_bufs, link) {
- WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p surface_queue:%p",
- buffer->wl_buffer, buffer->tbm_surface, queue_info->tbm_queue);
-
- if (buffer->wl_buffer) {
- wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
-
- if (!buffer->reuse) {
- WL_TBM_TRACE("wl_buffer:%p destroy", buffer->wl_buffer);
- wl_buffer_destroy(buffer->wl_buffer);
- buffer->wl_buffer = NULL;
- }
- }
-
- wl_list_remove(&buffer->link);
- free(buffer);
- }
+ wl_list_for_each_safe(buffer, tmp, &queue_info->attach_bufs, link)
+ _wayland_tbm_client_destroy_tbm_buffer(queue_info, buffer);
}
static void
continue;
}
- WL_TBM_TRACE("wl_buffer:%p tbm_surface:%p surface_queue:%p",
- buffer->wl_buffer, buffer->tbm_surface, queue_info->tbm_queue);
-
- if (buffer->wl_buffer) {
- wl_tbm_queue_detach_buffer(queue_info->wl_tbm_queue, buffer->wl_buffer);
-
- if (!buffer->reuse) {
- WL_TBM_TRACE("wl_buffer:%p destroy", buffer->wl_buffer);
- wl_buffer_destroy(buffer->wl_buffer);
- buffer->wl_buffer = NULL;
- }
- }
-
- wl_list_remove(&buffer->link);
- free(buffer);
+ _wayland_tbm_client_destroy_tbm_buffer(queue_info, buffer);
}
}
if (!buffer->allocated) continue;
buffer->allocated = 0;
- buffer->reuse = 1;
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);
+ _wayland_tbm_client_destroy_tbm_buffer(queue_info, buffer);
attached = 1;
- wl_list_remove(&buffer->link);
- free(buffer);
}
pthread_mutex_unlock(&queue_info->lock);