}
}
+static void
+_handle_tbm_surface_queue_trace_notify(tbm_surface_queue_h surface_queue,
+ tbm_surface_h tbm_surface, tbm_surface_queue_trace trace, void *data)
+{
+ struct wayland_tbm_surface_queue *queue_info = data;
+ struct wl_buffer *wl_buffer = NULL;
+ struct wayland_tbm_buffer *buffer = NULL;
+
+ WL_TBM_RETURN_IF_FAIL(queue_info != NULL);
+
+ if (trace != TBM_SURFACE_QUEUE_TRACE_DEQUEUE) return;
+ if (!queue_info->is_active) return;
+
+ wl_list_for_each(buffer, &queue_info->attach_bufs, link) {
+ if (buffer->tbm_surface == tbm_surface)
+ wl_buffer = buffer->wl_buffer;
+ }
+
+ if (!wl_buffer) return;
+
+ wl_tbm_queue_dequeue_buffer(queue_info->wl_tbm_queue, wl_buffer);
+}
+
tbm_surface_queue_h
wayland_tbm_client_create_surface_queue(struct wayland_tbm_client *tbm_client,
struct wl_surface *surface,
tbm_surface_queue_add_can_dequeue_cb(queue_info->tbm_queue,
_handle_tbm_surface_queue_can_dequeue_notify, queue_info);
+ tbm_surface_queue_add_trace_cb(queue_info->tbm_queue,
+ _handle_tbm_surface_queue_trace_notify, queue_info);
+
#ifdef DEBUG_TRACE
WL_TBM_C_LOG("INFO cur(%dx%d fmt:0x%x num:%d) new(%dx%d fmt:0x%x num:%d)\n",
queue_info->width, queue_info->height,
struct wl_resource *wl_surface;
pid_t pid;
+ wayland_tbm_server_client_queue_dequeue_cb dequeue_cb;
+ void *dequeue_cb_data;;
+
struct wl_list link;
};
#endif
}
+static void
+_wayland_tbm_server_queue_impl_dequeue_buffer(struct wl_client *client,
+ struct wl_resource *wl_tbm_queue,
+ struct wl_resource *wl_buffer)
+{
+ struct wayland_tbm_client_queue *cqueue = NULL;
+ struct wayland_tbm_buffer *tbm_buffer = NULL;
+
+#ifdef DEBUG_TRACE
+ pid_t pid;
+
+ wl_client_get_credentials(client, &pid, NULL, NULL);
+ WL_TBM_TRACE("dequeue buffer. pid:%d\n", pid);
+#endif
+
+ cqueue = wl_resource_get_user_data(wl_tbm_queue);
+ WL_TBM_RETURN_IF_FAIL(cqueue);
+
+ tbm_buffer = wl_resource_get_user_data(wl_buffer);
+ WL_TBM_RETURN_IF_FAIL(tbm_buffer);
+
+ if (cqueue->dequeue_cb)
+ cqueue->dequeue_cb(cqueue, tbm_buffer->surface, cqueue->dequeue_cb_data);
+}
+
static const struct wl_tbm_queue_interface _wayland_tbm_queue_impementation = {
_wayland_tbm_server_queue_impl_destroy,
_wayland_tbm_server_queue_impl_detach_buffer,
+ _wayland_tbm_server_queue_impl_dequeue_buffer,
};
static void
wayland_tbm_server_client_queue_activate(struct wayland_tbm_client_queue *cqueue,
uint32_t usage, uint32_t queue_size, uint32_t need_flush)
{
+ struct wl_client *wl_client = NULL;
+
WL_TBM_RETURN_IF_FAIL(cqueue != NULL);
WL_TBM_RETURN_IF_FAIL(cqueue->wl_tbm_queue != NULL);
WL_TBM_LOG("send active queue pid:%d\n", cqueue->pid);
wl_tbm_queue_send_active(cqueue->wl_tbm_queue, usage, queue_size, 1);
+
+ wl_client = wl_resource_get_client(cqueue->wl_tbm_queue);
+ if (wl_client)
+ wl_client_flush(wl_client);
}
void
wayland_tbm_server_client_queue_deactivate(struct wayland_tbm_client_queue *cqueue)
{
+ struct wl_client *wl_client = NULL;
+
WL_TBM_RETURN_IF_FAIL(cqueue != NULL);
WL_TBM_RETURN_IF_FAIL(cqueue->wl_tbm_queue != NULL);
WL_TBM_LOG("send deactive queue pid:%d", cqueue->pid);
wl_tbm_queue_send_deactive(cqueue->wl_tbm_queue);
+
+ wl_client = wl_resource_get_client(cqueue->wl_tbm_queue);
+ if (wl_client)
+ wl_client_flush(wl_client);
+}
+
+int
+wayland_tbm_server_client_queue_set_dequeue_cb(struct wayland_tbm_client_queue *cqueue,
+ wayland_tbm_server_client_queue_dequeue_cb dequeue_cb, void *user_data)
+{
+ WL_TBM_RETURN_VAL_IF_FAIL(cqueue != NULL, 0);
+ WL_TBM_RETURN_VAL_IF_FAIL(cqueue->wl_tbm_queue != NULL, 0);
+
+#ifdef DEBUG_TRACE
+ WL_TBM_TRACE(" pid:%d\n", cqueue->pid);
+#endif
+ cqueue->dequeue_cb = dequeue_cb;
+ cqueue->dequeue_cb_data = user_data;
+
+ return 1;
}
struct wl_resource *
typedef void (*wayland_tbm_server_surface_destroy_cb) (tbm_surface_h surface, void *data);
+typedef void (*wayland_tbm_server_client_queue_dequeue_cb) (struct wayland_tbm_client_queue *cqueue,
+ tbm_surface_h surface, void *data);
+
struct wayland_tbm_server *
wayland_tbm_server_init(struct wl_display *display,
const char *device_name,
void
wayland_tbm_server_client_queue_deactivate(struct wayland_tbm_client_queue *client_queue);
+int
+wayland_tbm_server_client_queue_set_dequeue_cb(struct wayland_tbm_client_queue *client_queue,
+ wayland_tbm_server_client_queue_dequeue_cb dequeue_cb, void *user_data);
+
struct wl_resource *
wayland_tbm_server_client_queue_export_buffer(struct wayland_tbm_client_queue *client_queue,
tbm_surface_h surface, uint32_t flags, wayland_tbm_server_surface_destroy_cb destroy_cb,