6 #define WL_HIDE_DEPRECATED
7 #include <wayland-client.h>
8 #include <wayland-tbm-client.h>
9 #include <wayland-tbm-int.h>
11 #include <tbm_surface.h>
12 #include <tbm_surface_queue.h>
13 #include <tbm_surface_internal.h>
15 #include "wayland-tbm-test-client-protocol.h"
17 #define WL_APP_C_LOG(fmt, ...) fprintf(stderr, "[CLIENT(%d):%s] " fmt, getpid(), __func__, ##__VA_ARGS__)
20 struct wayland_tbm_client *tbm_client;
21 struct wl_tbm_test *wl_tbm_test;
22 struct wl_test_surface *surface;
23 tbm_surface_queue_h surface_queue;
32 tbm_surface_queue_h surface_queue;
33 struct wl_buffer *wl_buffer;
37 static void _drawing_surface(AppInfoClient *app);
40 _create_surface_and_queue(AppInfoClient *app)
42 app->surface = wl_tbm_test_create_surface(app->wl_tbm_test);
43 app->surface_queue = wayland_tbm_client_create_surface_queue(app->tbm_client,
44 (struct wl_surface *)app->surface, 3, 100, 100,
46 WL_APP_C_LOG("surface:%p, surface_queue:%p\n", app->surface,
52 _destroy_surface_and_queue(AppInfoClient *app)
54 tbm_surface_queue_destroy(app->surface_queue);
55 wl_test_surface_destroy(app->surface);
57 WL_APP_C_LOG("surface:%p, surface_queue:%p\n", app->surface,
63 static const int key_app_buffer;
65 static struct wl_buffer *
66 _get_wl_buffer(tbm_surface_h buffer)
68 AppBuffer *app_buffer = NULL;
70 tbm_surface_internal_get_user_data(buffer,
71 (unsigned long)&key_app_buffer,
72 (void **)&app_buffer);
75 return (struct wl_buffer *)NULL;
77 return app_buffer->wl_buffer;
81 _set_wl_buffer(tbm_surface_h buffer, AppBuffer *app_buffer)
83 tbm_surface_internal_add_user_data(buffer,
84 (unsigned long)&key_app_buffer,
86 tbm_surface_internal_set_user_data(buffer,
87 (unsigned long)&key_app_buffer,
92 _cb_wl_buffer_release_callback(void *data, struct wl_buffer *wl_buffer)
94 AppBuffer *app_buffer = data;
96 tbm_surface_queue_release(app_buffer->surface_queue, app_buffer->buffer);
97 WL_APP_C_LOG("RELEASE queue:%p, tbm_surface:%p\n", app_buffer->surface_queue,
101 static const struct wl_buffer_listener buffer_release_listener = {
102 _cb_wl_buffer_release_callback
106 _cb_wl_callback_surface_frame_done(void *data,
107 struct wl_callback *wl_callback,
108 uint32_t callback_data)
110 AppInfoClient *app = data;
112 WL_APP_C_LOG("FRAME DONE\n");
113 _drawing_surface(app);
114 wl_callback_destroy(wl_callback);
117 static const struct wl_callback_listener surface_callback_listener = {
118 _cb_wl_callback_surface_frame_done
122 _drawing_surface(AppInfoClient *app)
124 tbm_surface_queue_h surface_queue = app->surface_queue;
125 tbm_surface_h buffer = NULL;
126 tbm_surface_info_s info;
127 struct wl_buffer *wl_buffer;
128 struct wl_callback *wl_callback;
131 if (app->count == 10)
134 if (!tbm_surface_queue_can_dequeue(surface_queue, 0)) {
135 WL_APP_C_LOG("Wait free_buffer\n");
142 tbm_surface_queue_dequeue(surface_queue, &buffer);
143 if (buffer == NULL) {
144 WL_APP_C_LOG("Failed to dequeue_buffer\n");
147 //WL_APP_C_LOG("DEQUEUE queue:%p, tbm_surface:%p\n", app->surface_queue, buffer);
149 tbm_surface_map(buffer, TBM_OPTION_READ | TBM_OPTION_WRITE, &info);
150 WL_APP_C_LOG("\tDraw: buf:%p\n", buffer);
151 tbm_surface_unmap(buffer);
152 tbm_surface_queue_enqueue(app->surface_queue, buffer);
153 //WL_APP_C_LOG("ENQUEUE queue:%p, tbm_surface:%p\n", app->surface_queue, buffer);
155 tbm_surface_queue_acquire(app->surface_queue, &buffer);
156 //WL_APP_C_LOG("ACQUIRE queue:%p, tbm_surface:%p\n", app->surface_queue, buffer);
157 wl_buffer = _get_wl_buffer(buffer);
159 AppBuffer *app_buffer = calloc(1, sizeof(AppBuffer));
161 wl_buffer = wayland_tbm_client_create_buffer(app->tbm_client, buffer);
162 wl_buffer_add_listener(wl_buffer, &buffer_release_listener, (void *)app_buffer);
164 app_buffer->wl_buffer = wl_buffer;
165 app_buffer->surface_queue = app->surface_queue;
166 app_buffer->buffer = buffer;
167 _set_wl_buffer(buffer, app_buffer);
168 WL_APP_C_LOG("\tCreate NEW wl_buffer: buf:%p\n", buffer);
171 wl_callback = wl_test_surface_frame(app->surface);
172 wl_callback_add_listener(wl_callback, &surface_callback_listener, app);
173 wl_test_surface_attach(app->surface, wl_buffer);
174 //WL_APP_C_LOG("ATTACH wl_surface:%p, wl_buffer:%p\n", app->surface, wl_buffer);
178 _wl_registry_global_cb(void *data,
179 struct wl_registry *wl_registry,
181 const char *interface,
184 AppInfoClient *app = (AppInfoClient *)data;
186 if (!strcmp(interface, "wl_tbm_test")) {
187 WL_APP_C_LOG("bind %s", interface);
188 app->wl_tbm_test = wl_registry_bind(wl_registry, name,
189 &wl_tbm_test_interface, 1);
194 _wl_registry_global_remove_cb(void *data,
195 struct wl_registry *wl_registry,
200 static const struct wl_registry_listener wl_registry_impl = {
201 _wl_registry_global_cb,
202 _wl_registry_global_remove_cb,
206 main(int argc, char *argv[])
208 struct wl_display *dpy = NULL;
209 struct wl_registry *registry;
210 const char *dpy_name = NULL;
211 const char *default_dpy_name = "queue";
213 tbm_bufmgr bufmgr = NULL;
218 dpy_name = default_dpy_name;
220 dpy = wl_display_connect(dpy_name);
222 printf("[APP] failed to connect server\n");
226 registry = wl_display_get_registry(dpy);
227 wl_registry_add_listener(registry, &wl_registry_impl, &gApp);
228 wl_display_roundtrip(dpy);
229 if (gApp.wl_tbm_test == NULL) {
230 WL_APP_C_LOG("fail to bind::wl_tbm_test");
234 gApp.tbm_client = wayland_tbm_client_init(dpy);
235 if (!gApp.tbm_client) {
236 WL_APP_C_LOG("fail to wayland_tbm_client_init()\n");
239 bufmgr = tbm_bufmgr_init(-1);
240 tbm_bufmgr_debug_show(bufmgr);
242 _create_surface_and_queue(&gApp);
243 _drawing_surface(&gApp);
244 while (ret >= 0 && gApp.exit == 0) {
245 ret = wl_display_dispatch(dpy);
247 _drawing_surface(&gApp);
250 tbm_bufmgr_debug_show(bufmgr);
253 _destroy_surface_and_queue(&gApp);
255 tbm_bufmgr_debug_show(bufmgr);