queue_buffer->tsurface = tsurface;
queue_buffer->gbo = gbo;
+ wl_signal_init(&queue_buffer->destroy_signal);
+
queue->buffers = eina_list_append(queue->buffers, queue_buffer);
EHWQTRACE("CREATE queue buffer:%p tq:%p tsurface:%p",
(queue_buffer->queue ? queue_buffer->queue->tqueue : NULL),
queue_buffer->tsurface);
+ wl_signal_emit(&queue_buffer->destroy_signal, queue_buffer);
+
E_FREE(queue_buffer);
}
return acquirable_buffers;
}
+static void
+_e_hwc_widnow_queue_buffer_reference_cb_destroy(struct wl_listener *listener, void *data)
+{
+ E_Hwc_Window_Queue_Buffer_Ref *buffer_ref;
+
+ buffer_ref = container_of(listener, E_Hwc_Window_Queue_Buffer_Ref, destroy_listener);
+ if ((E_Hwc_Window_Queue_Buffer *)data != buffer_ref->buffer) return;
+ buffer_ref->buffer = NULL;
+}
+
+EINTERN void
+e_hwc_window_queue_buffer_reference(E_Hwc_Window_Queue_Buffer_Ref *ref, E_Hwc_Window_Queue_Buffer *buffer)
+{
+ if ((ref->buffer) && (buffer != ref->buffer))
+ {
+ ref->buffer->busy--;
+ EHWQTRACE("UNREF ts:%p tq:%p busy:%d", NULL, NULL, ref->buffer->queue,
+ ref->buffer->tsurface, ref->buffer->queue->tqueue, ref->buffer->busy);
+ if (ref->buffer->busy == 0)
+ {
+ if (ref->buffer->queue)
+ e_hwc_window_queue_buffer_release(ref->buffer->queue, ref->buffer);
+ }
+
+ if (ref->destroy_listener.notify)
+ {
+ wl_list_remove(&ref->destroy_listener.link);
+ ref->destroy_listener.notify = NULL;
+ }
+ }
+
+ if ((buffer) && (buffer != ref->buffer))
+ {
+ buffer->busy++;
+ wl_signal_add(&buffer->destroy_signal, &ref->destroy_listener);
+ EHWQTRACE(" REF ts:%p tq:%p busy:%d", NULL, NULL, buffer->queue,
+ buffer->tsurface, buffer->queue->tqueue, buffer->busy);
+ }
+
+ ref->buffer = buffer;
+ ref->destroy_listener.notify = _e_hwc_widnow_queue_buffer_reference_cb_destroy;
+}
+
EINTERN int
e_hwc_window_queue_size_get(E_Hwc_Window_Queue *queue)
{
#ifdef E_TYPEDEFS
+#include <wayland-server.h>
+
# define E_HWC_WINDOW_QUEUE_BUFFER_FLAGS 7777
typedef struct _E_Hwc_Window_Queue E_Hwc_Window_Queue;
typedef struct _E_Hwc_Window_Queue_Buffer E_Hwc_Window_Queue_Buffer;
+typedef struct _E_Hwc_Window_Queue_Buffer_Ref E_Hwc_Window_Queue_Buffer_Ref;
typedef enum _E_Hwc_Window_Queue_State
{
E_HWC_WINDOW_QUEUE_TYPE_GBM_SURFACE,
} E_Hwc_Window_Queue_Type;
+struct _E_Hwc_Window_Queue_Buffer_Ref
+{
+ E_Hwc_Window_Queue_Buffer *buffer;
+ struct wl_listener destroy_listener;
+};
+
#else
#ifndef E_HWC_WINDOW_QUEUE_H
#define E_HWC_WINDOW_QUEUE_H
Eina_Bool acquired;
Eina_Bool dequeued;
Eina_Bool reseted;
+
+ int busy;
+
+ struct wl_signal destroy_signal;
};
EINTERN Eina_Bool e_hwc_window_queue_init(void);
EINTERN E_Hwc_Window_Queue_Buffer * e_hwc_window_queue_buffer_acquire(E_Hwc_Window_Queue *queue);
EINTERN Eina_Bool e_hwc_window_queue_buffer_release(E_Hwc_Window_Queue *queue, E_Hwc_Window_Queue_Buffer *queue_buffer);
EINTERN Eina_Bool e_hwc_window_queue_clear(E_Hwc_Window_Queue *queue);
+EINTERN void e_hwc_window_queue_buffer_reference(E_Hwc_Window_Queue_Buffer_Ref *ref, E_Hwc_Window_Queue_Buffer *buffer);
EINTERN Eina_List * e_hwc_window_queue_acquirable_buffers_get(E_Hwc_Window_Queue *queue);
EINTERN int e_hwc_window_queue_size_get(E_Hwc_Window_Queue *queue);