4 #include <wayland-server.h>
5 #include <tizen-hwc-server-protocol.h>
9 #include "libds-tizen/hwc.h"
11 #define TIZEN_HWC_VERSION 1
15 struct wl_global *global;
17 struct wl_list clients;
19 struct wl_listener destroy;
22 struct wl_signal destroy;
23 struct wl_signal new_commit_feedback;
27 struct ds_tizen_hwc_client
29 struct ds_tizen_hwc *hwc;
31 struct wl_resource *resource;
32 struct wl_client *wl_client;
35 struct wl_signal destroy;
41 struct ds_tizen_hwc_commit_feedback
43 struct wl_resource *resource;
45 struct ds_surface *surface;
49 struct wl_listener surface_destroy;
53 struct wl_signal destroy;
58 hwc_commit_feedback_handle_surface_destroy(struct wl_listener *listener, void *data)
60 struct ds_tizen_hwc_commit_feedback *commit_feedback;
62 commit_feedback = wl_container_of(listener, commit_feedback,
63 listener.surface_destroy);
65 if (commit_feedback->listener.surface_destroy.notify) {
66 wl_list_remove(&commit_feedback->listener.surface_destroy.link);
67 commit_feedback->listener.surface_destroy.notify = NULL;
70 commit_feedback->surface = NULL;
74 _hwc_commit_feedback_cb_resource_destroy(struct wl_resource *commit_feedback_resource)
76 struct ds_tizen_hwc_commit_feedback *commit_feedback;
78 commit_feedback = wl_resource_get_user_data(commit_feedback_resource);
80 ds_inf("hwc_commit_feedback:%p destroy", commit_feedback);
82 if (commit_feedback->listener.surface_destroy.notify) {
83 wl_list_remove(&commit_feedback->listener.surface_destroy.link);
84 commit_feedback->listener.surface_destroy.notify = NULL;
87 wl_signal_emit(&commit_feedback->events.destroy, commit_feedback);
89 free(commit_feedback);
93 hwc_handle_create_commit_feedback(struct wl_client *client,
94 struct wl_resource *hwc_client_resource,
95 struct wl_resource *surface_resource,
99 struct ds_tizen_hwc_client *hwc_client;
100 struct ds_tizen_hwc_commit_feedback *commit_feedback;
101 struct ds_surface *surface;
103 hwc_client = wl_resource_get_user_data(hwc_client_resource);
105 surface = ds_surface_from_resource(surface_resource);
107 commit_feedback = calloc(1, sizeof *commit_feedback);
108 if (!commit_feedback) {
109 wl_client_post_no_memory(client);
113 commit_feedback->resource = wl_resource_create(client, &tizen_hwc_commit_feedback_interface,
114 wl_resource_get_version(hwc_client_resource), id);
115 if (!commit_feedback->resource) {
116 wl_client_post_no_memory(client);
117 free(commit_feedback);
121 commit_feedback->listener.surface_destroy.notify = hwc_commit_feedback_handle_surface_destroy;
122 ds_surface_add_destroy_listener(surface, &commit_feedback->listener.surface_destroy);
123 commit_feedback->surface = surface;
125 commit_feedback->serial = serial;
127 wl_resource_set_implementation(commit_feedback->resource, NULL,
128 commit_feedback, _hwc_commit_feedback_cb_resource_destroy);
130 ds_inf("hwc_commit_feedback:%p create", commit_feedback);
132 wl_signal_init(&commit_feedback->events.destroy);
134 wl_signal_emit(&hwc_client->hwc->events.new_commit_feedback, commit_feedback);
138 hwc_handle_destroy(struct wl_client *wl_client,
139 struct wl_resource *resource)
141 wl_resource_destroy(resource);
144 static const struct tizen_hwc_interface hwc_impl =
146 .destroy = hwc_handle_destroy,
147 .create_commit_feedback = hwc_handle_create_commit_feedback,
151 _tizen_hwc_client_handle_resource_destroy(struct wl_resource *resource)
153 struct ds_tizen_hwc_client *client;
155 client = wl_resource_get_user_data(resource);
157 ds_inf("_tizen_hwc_client_handle_destroy (client:%p)", client);
159 wl_list_remove(&client->link);
164 hwc_bind(struct wl_client *wl_client, void *data, uint32_t version,
167 struct ds_tizen_hwc *hwc = data;
168 struct ds_tizen_hwc_client *hwc_client;
170 hwc_client = calloc(1, sizeof *hwc_client);
171 if (hwc_client == NULL) {
172 ds_err("calloc() failed. tizen_hwc");
173 wl_client_post_no_memory(wl_client);
177 ds_inf("tizen_hwc_client binds. (hwc_client:%p)", hwc_client);
179 hwc_client->hwc = hwc;
180 hwc_client->wl_client = wl_client;
182 hwc_client->resource = wl_resource_create(wl_client, &tizen_hwc_interface,
183 MIN(version, TIZEN_HWC_VERSION), id);
184 if (hwc_client->resource == NULL) {
185 ds_err("tizen_hwc : wl_resource_create() failed.");
187 wl_client_post_no_memory(wl_client);
191 wl_resource_set_implementation(hwc_client->resource, &hwc_impl, hwc_client,
192 _tizen_hwc_client_handle_resource_destroy);
194 wl_signal_init(&hwc_client->events.destroy);
196 wl_list_insert(&hwc->clients, &hwc_client->link);
200 hwc_handle_display_destroy(struct wl_listener *listener, void *data)
202 struct ds_tizen_hwc *hwc;
204 hwc = wl_container_of(listener, hwc, destroy);
206 ds_inf("Global destroy: hwc(%p)", hwc);
208 wl_signal_emit(&hwc->events.destroy, hwc);
209 wl_list_remove(&hwc->destroy.link);
210 wl_global_destroy(hwc->global);
214 WL_EXPORT struct ds_tizen_hwc *
215 ds_tizen_hwc_create(struct wl_display *display)
217 struct ds_tizen_hwc *hwc;
219 hwc = calloc(1, sizeof *hwc);
221 ds_err("calloc() failed.");
225 hwc->global = wl_global_create(display, &tizen_hwc_interface,
226 TIZEN_HWC_VERSION, hwc, hwc_bind);
228 ds_err("wl_global_create() failed. tizen_hwc_interface");
233 wl_list_init(&hwc->clients);
235 hwc->destroy.notify = hwc_handle_display_destroy;
236 wl_display_add_destroy_listener(display, &hwc->destroy);
238 wl_signal_init(&hwc->events.destroy);
239 wl_signal_init(&hwc->events.new_commit_feedback);
241 ds_inf("Global created: tizen_hwc(%p)", hwc);
247 ds_tizen_hwc_add_destroy_listener(
248 struct ds_tizen_hwc *hwc,
249 struct wl_listener *listener)
251 wl_signal_add(&hwc->events.destroy, listener);
255 ds_tizen_hwc_add_new_commit_feedback_listener(
256 struct ds_tizen_hwc *hwc,
257 struct wl_listener *listener)
259 wl_signal_add(&hwc->events.new_commit_feedback, listener);
263 ds_tizen_hwc_commit_feedback_add_destroy_listener(
264 struct ds_tizen_hwc_commit_feedback *commit_feedback,
265 struct wl_listener *listener)
267 wl_signal_add(&commit_feedback->events.destroy, listener);
270 WL_EXPORT struct ds_surface *
271 ds_tizen_hwc_commit_feedback_get_surface(
272 struct ds_tizen_hwc_commit_feedback *commit_feedback)
274 return commit_feedback->surface;
278 ds_tizen_hwc_commit_feedback_send_committed(
279 struct ds_tizen_hwc_commit_feedback *commit_feedback)
281 ds_inf("hwc_commit_feedback:%p send committed", commit_feedback);
283 tizen_hwc_commit_feedback_send_committed(commit_feedback->resource,
284 commit_feedback->serial);
285 wl_resource_destroy(commit_feedback->resource);
289 ds_tizen_hwc_commit_feedback_send_discarded(
290 struct ds_tizen_hwc_commit_feedback *commit_feedback)
292 ds_inf("hwc_commit_feedback:%p send discard", commit_feedback);
294 tizen_hwc_commit_feedback_send_discarded(commit_feedback->resource,
295 commit_feedback->serial);
296 wl_resource_destroy(commit_feedback->resource);