summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2018-01-26 14:32:10 -0600
committerDerek Foreman <derekf@osg.samsung.com>2018-01-26 15:54:00 -0600
commit376d8d1e36f903082212ffa0ce1bc0178b323ac2 (patch)
tree0d40df971edb8cc6731167dc5d766398495221be
parent3e230693e62696f32bc8ab64619843f2507ed393 (diff)
ecore_wl2: Make surface managers modular
This allows loading modules to handle wayland surfaces, and makes the existing dmabuf manager a module.
-rw-r--r--src/Makefile_Ecore_Wl2.am20
-rw-r--r--src/lib/ecore_wl2/ecore_wl2.c32
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_private.h2
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_surface.c214
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_surface_module_dmabuf.c230
5 files changed, 280 insertions, 218 deletions
diff --git a/src/Makefile_Ecore_Wl2.am b/src/Makefile_Ecore_Wl2.am
index 311cd27..29838fc 100644
--- a/src/Makefile_Ecore_Wl2.am
+++ b/src/Makefile_Ecore_Wl2.am
@@ -49,7 +49,11 @@ lib/ecore_wl2/text-input-unstable-v1-protocol.c \
49lib/ecore_wl2/efl-hints-client-protocol.h \ 49lib/ecore_wl2/efl-hints-client-protocol.h \
50lib/ecore_wl2/efl-hints-protocol.c 50lib/ecore_wl2/efl-hints-protocol.c
51 51
52lib_ecore_wl2_libecore_wl2_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_WL2_CFLAGS@ -I$(top_srcdir)/src/static_libs/libdrm 52lib_ecore_wl2_libecore_wl2_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
53@ECORE_WL2_CFLAGS@ \
54-I$(top_srcdir)/src/static_libs/libdrm \
55-DPACKAGE_LIB_DIR=\"$(libdir)\" \
56-DMODULE_ARCH=\"$(MODULE_ARCH)\"
53lib_ecore_wl2_libecore_wl2_la_LIBADD = @ECORE_WL2_LIBS@ 57lib_ecore_wl2_libecore_wl2_la_LIBADD = @ECORE_WL2_LIBS@
54lib_ecore_wl2_libecore_wl2_la_DEPENDENCIES = @ECORE_WL2_INTERNAL_LIBS@ 58lib_ecore_wl2_libecore_wl2_la_DEPENDENCIES = @ECORE_WL2_INTERNAL_LIBS@
55lib_ecore_wl2_libecore_wl2_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@ 59lib_ecore_wl2_libecore_wl2_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@
@@ -76,4 +80,18 @@ lib/ecore_wl2/efl-hints-protocol.c
76 80
77EXTRA_DIST2 += lib/ecore_wl2/window_v6.x 81EXTRA_DIST2 += lib/ecore_wl2/window_v6.x
78 82
83DMABUFSOURCES = lib/ecore_wl2/ecore_wl2_surface_module_dmabuf.c
84ecorewl2enginedmabufpkgdir = $(libdir)/ecore_wl2/engines/dmabuf/$(MODULE_ARCH)
85ecorewl2enginedmabufpkg_LTLIBRARIES = modules/ecore_wl2/engines/dmabuf/module.la
86
87# Workaround for broken parallel install support in automake (relink issue)
88# http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7328
89install_ecorewl2enginedmabufpkgLTLIBRARIES = install-ecorewl2enginedmabufpkgLTLIBRARIES
90$(install_ecorewl2enginedmabufpkgLTLIBRARIES): install-libLTLIBRARIES
91
92modules_ecore_wl2_engines_dmabuf_module_la_SOURCES = $(DMABUFSOURCES)
93modules_ecore_wl2_engines_dmabuf_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_WL2_CFLAGS@
94modules_ecore_wl2_engines_dmabuf_module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
95modules_ecore_wl2_engines_dmabuf_module_la_LIBTOOLFLAGS = --tag=disable-static
96
79endif 97endif
diff --git a/src/lib/ecore_wl2/ecore_wl2.c b/src/lib/ecore_wl2/ecore_wl2.c
index 7a1bbee..479ee93 100644
--- a/src/lib/ecore_wl2/ecore_wl2.c
+++ b/src/lib/ecore_wl2/ecore_wl2.c
@@ -57,10 +57,38 @@ EAPI int ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE = 0;
57EAPI int _ecore_wl2_event_window_www = -1; 57EAPI int _ecore_wl2_event_window_www = -1;
58EAPI int _ecore_wl2_event_window_www_drag = -1; 58EAPI int _ecore_wl2_event_window_www_drag = -1;
59 59
60static Eina_Array *supplied_modules = NULL;
61static Eina_Array *local_modules = NULL;
62
60static Eina_Bool 63static Eina_Bool
61_ecore_wl2_surface_modules_init(void) 64_ecore_wl2_surface_modules_init(void)
62{ 65{
63 return ecore_wl2_surface_manager_dmabuf_add(); 66 const char *mod_dir;
67
68 supplied_modules = eina_module_arch_list_get(NULL,
69 PACKAGE_LIB_DIR"/ecore_wl2/engines",
70 MODULE_ARCH);
71 eina_module_list_load(supplied_modules);
72
73 mod_dir = getenv("ECORE_WL2_SURFACE_MODULE_DIR");
74 if (mod_dir)
75 {
76 local_modules = eina_module_list_get(NULL, mod_dir,
77 EINA_TRUE, NULL, NULL);
78 eina_module_list_load(local_modules);
79 }
80
81 if (!supplied_modules && !local_modules)
82 return EINA_FALSE;
83
84 return EINA_TRUE;
85}
86
87static void
88_ecore_wl2_surface_modules_unload(void)
89{
90 eina_module_list_unload(supplied_modules);
91 eina_module_list_unload(local_modules);
64} 92}
65 93
66/* public API functions */ 94/* public API functions */
@@ -230,6 +258,8 @@ ecore_wl2_shutdown(void)
230 eina_log_domain_unregister(_ecore_wl2_log_dom); 258 eina_log_domain_unregister(_ecore_wl2_log_dom);
231 _ecore_wl2_log_dom = -1; 259 _ecore_wl2_log_dom = -1;
232 260
261 _ecore_wl2_surface_modules_unload();
262
233 /* shutdown eina */ 263 /* shutdown eina */
234 eina_shutdown(); 264 eina_shutdown();
235 265
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h b/src/lib/ecore_wl2/ecore_wl2_private.h
index c321df1..05d264b 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -606,6 +606,4 @@ EAPI void ecore_wl2_window_weight_set(Ecore_Wl2_Window *window, double w, double
606EAPI extern int _ecore_wl2_event_window_www; 606EAPI extern int _ecore_wl2_event_window_www;
607EAPI extern int _ecore_wl2_event_window_www_drag; 607EAPI extern int _ecore_wl2_event_window_www_drag;
608 608
609Eina_Bool ecore_wl2_surface_manager_dmabuf_add(void);
610
611#endif 609#endif
diff --git a/src/lib/ecore_wl2/ecore_wl2_surface.c b/src/lib/ecore_wl2/ecore_wl2_surface.c
index 2551882..c3a791f 100644
--- a/src/lib/ecore_wl2/ecore_wl2_surface.c
+++ b/src/lib/ecore_wl2/ecore_wl2_surface.c
@@ -7,199 +7,9 @@
7#include <sys/types.h> 7#include <sys/types.h>
8#include <sys/stat.h> 8#include <sys/stat.h>
9 9
10#include "linux-dmabuf-unstable-v1-client-protocol.h"
11
12#define MAX_BUFFERS 4
13
14static Eina_List *_smanagers = NULL; 10static Eina_List *_smanagers = NULL;
15static int _smanager_count = 0; 11static int _smanager_count = 0;
16 12
17int ECORE_WL2_SURFACE_DMABUF = 0;
18
19typedef struct _Ecore_Wl2_Dmabuf_Private
20{
21 Ecore_Wl2_Buffer *current;
22 Eina_List *buffers;
23} Ecore_Wl2_Dmabuf_Private;
24
25static void *
26_evas_dmabuf_surface_setup(Ecore_Wl2_Window *win)
27{
28 Ecore_Wl2_Dmabuf_Private *priv;
29 Ecore_Wl2_Display *ewd;
30 Ecore_Wl2_Buffer_Type types = 0;
31
32 priv = calloc(1, sizeof(*priv));
33 if (!priv) return NULL;
34
35 ewd = ecore_wl2_window_display_get(win);
36 if (ecore_wl2_display_shm_get(ewd))
37 types |= ECORE_WL2_BUFFER_SHM;
38 if (ecore_wl2_display_dmabuf_get(ewd))
39 types |= ECORE_WL2_BUFFER_DMABUF;
40
41 if (!ecore_wl2_buffer_init(ewd, types))
42 {
43 free(priv);
44 return NULL;
45 }
46
47 return priv;
48}
49
50static void
51_evas_dmabuf_surface_reconfigure(Ecore_Wl2_Surface *s EINA_UNUSED, void *priv_data, int w, int h, uint32_t flags EINA_UNUSED)
52{
53 Ecore_Wl2_Dmabuf_Private *p;
54 Ecore_Wl2_Buffer *b;
55 Eina_List *l, *tmp;
56
57 p = priv_data;
58
59 if ((!w) || (!h)) return;
60 EINA_LIST_FOREACH_SAFE(p->buffers, l, tmp, b)
61 {
62 if (ecore_wl2_buffer_fit(b, w, h))
63 continue;
64
65 ecore_wl2_buffer_destroy(b);
66 p->buffers = eina_list_remove_list(p->buffers, l);
67 }
68}
69
70static void *
71_evas_dmabuf_surface_data_get(Ecore_Wl2_Surface *s EINA_UNUSED, void *priv_data, int *w, int *h)
72{
73 Ecore_Wl2_Dmabuf_Private *p;
74 Ecore_Wl2_Buffer *b;
75 void *ptr;
76 int stride;
77
78 p = priv_data;
79
80 b = p->current;
81 if (!b) return NULL;
82
83 ptr = ecore_wl2_buffer_map(b, NULL, h, &stride);
84 if (!ptr) return NULL;
85
86 /* We return stride/bpp because it may not match the allocated
87 * width. evas will figure out the clipping
88 */
89 if (w) *w = stride / 4;
90
91 return ptr;
92}
93
94static Ecore_Wl2_Buffer *
95_evas_dmabuf_surface_wait(Ecore_Wl2_Surface *s, Ecore_Wl2_Dmabuf_Private *p)
96{
97 Ecore_Wl2_Buffer *b, *best = NULL;
98 Eina_List *l;
99 int best_age = -1;
100 int age;
101
102 EINA_LIST_FOREACH(p->buffers, l, b)
103 {
104 if (ecore_wl2_buffer_busy_get(b)) continue;
105 age = ecore_wl2_buffer_age_get(b);
106 if (age > best_age)
107 {
108 best = b;
109 best_age = age;
110 }
111 }
112
113 if (!best && (eina_list_count(p->buffers) < MAX_BUFFERS))
114 {
115 best = ecore_wl2_surface_buffer_create(s);
116 /* Start at -1 so it's age is incremented to 0 for first draw */
117 ecore_wl2_buffer_age_set(best, -1);
118 p->buffers = eina_list_append(p->buffers, best);
119 }
120 return best;
121}
122
123static int
124_evas_dmabuf_surface_assign(Ecore_Wl2_Surface *s, void *priv_data)
125{
126 Ecore_Wl2_Dmabuf_Private *p;
127 Ecore_Wl2_Buffer *b;
128 Eina_List *l;
129
130 p = priv_data;
131 p->current = _evas_dmabuf_surface_wait(s, p);
132 if (!p->current)
133 {
134 /* Should be unreachable and will result in graphical
135 * anomalies - we should probably blow away all the
136 * existing buffers and start over if we actually
137 * see this happen...
138 */
139 WRN("No free DMAbuf buffers, dropping a frame");
140 EINA_LIST_FOREACH(p->buffers, l, b)
141 ecore_wl2_buffer_age_set(b, 0);
142 return 0;
143 }
144 EINA_LIST_FOREACH(p->buffers, l, b)
145 ecore_wl2_buffer_age_inc(b);
146
147 return ecore_wl2_buffer_age_get(p->current);
148}
149
150static void
151_evas_dmabuf_surface_post(Ecore_Wl2_Surface *s, void *priv_data, Eina_Rectangle *rects, unsigned int count)
152{
153 Ecore_Wl2_Dmabuf_Private *p;
154 Ecore_Wl2_Buffer *b;
155 Ecore_Wl2_Window *win;
156 struct wl_buffer *wlb;
157
158 p = priv_data;
159
160 b = p->current;
161 if (!b) return;
162
163 ecore_wl2_buffer_unlock(b);
164
165 p->current = NULL;
166 ecore_wl2_buffer_busy_set(b);
167 ecore_wl2_buffer_age_set(b, 0);
168
169 win = ecore_wl2_surface_window_get(s);
170
171 wlb = ecore_wl2_buffer_wl_buffer_get(b);
172 ecore_wl2_window_buffer_attach(win, wlb, 0, 0, EINA_FALSE);
173 ecore_wl2_window_damage(win, rects, count);
174
175 ecore_wl2_window_commit(win, EINA_TRUE);
176}
177
178static void
179_evas_dmabuf_surface_destroy(Ecore_Wl2_Surface *s EINA_UNUSED, void *priv_data)
180{
181 Ecore_Wl2_Dmabuf_Private *p;
182 Ecore_Wl2_Buffer *b;
183
184 p = priv_data;
185
186 EINA_LIST_FREE(p->buffers, b)
187 ecore_wl2_buffer_destroy(b);
188}
189
190static void
191_evas_dmabuf_surface_flush(Ecore_Wl2_Surface *surface EINA_UNUSED, void *priv_data)
192{
193 Ecore_Wl2_Dmabuf_Private *p;
194 Ecore_Wl2_Buffer *b;
195
196 p = priv_data;
197
198 EINA_LIST_FREE(p->buffers, b)
199 ecore_wl2_buffer_destroy(b);
200}
201
202
203EAPI void 13EAPI void
204ecore_wl2_surface_destroy(Ecore_Wl2_Surface *surface) 14ecore_wl2_surface_destroy(Ecore_Wl2_Surface *surface)
205{ 15{
@@ -253,18 +63,6 @@ ecore_wl2_surface_flush(Ecore_Wl2_Surface *surface)
253 surface->funcs->flush(surface, surface->private_data); 63 surface->funcs->flush(surface, surface->private_data);
254} 64}
255 65
256static Ecore_Wl2_Surface_Interface dmabuf_smanager =
257{
258 .version = 1,
259 .setup = _evas_dmabuf_surface_setup,
260 .destroy = _evas_dmabuf_surface_destroy,
261 .reconfigure = _evas_dmabuf_surface_reconfigure,
262 .data_get = _evas_dmabuf_surface_data_get,
263 .assign = _evas_dmabuf_surface_assign,
264 .post = _evas_dmabuf_surface_post,
265 .flush = _evas_dmabuf_surface_flush
266};
267
268EAPI Ecore_Wl2_Surface * 66EAPI Ecore_Wl2_Surface *
269ecore_wl2_surface_create(Ecore_Wl2_Window *win, Eina_Bool alpha) 67ecore_wl2_surface_create(Ecore_Wl2_Window *win, Eina_Bool alpha)
270{ 68{
@@ -337,15 +135,3 @@ ecore_wl2_surface_window_get(Ecore_Wl2_Surface *surface)
337 135
338 return surface->wl2_win; 136 return surface->wl2_win;
339} 137}
340
341/* TEMPORARY HACK FOR TESTING */
342Eina_Bool
343ecore_wl2_surface_manager_dmabuf_add(void)
344{
345 ECORE_WL2_SURFACE_DMABUF = ecore_wl2_surface_manager_add(&dmabuf_smanager);
346
347 if (ECORE_WL2_SURFACE_DMABUF < 1)
348 return EINA_FALSE;
349
350 return EINA_TRUE;
351}
diff --git a/src/lib/ecore_wl2/ecore_wl2_surface_module_dmabuf.c b/src/lib/ecore_wl2/ecore_wl2_surface_module_dmabuf.c
new file mode 100644
index 0000000..a2ddb91
--- /dev/null
+++ b/src/lib/ecore_wl2/ecore_wl2_surface_module_dmabuf.c
@@ -0,0 +1,230 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "Ecore_Wl2.h"
6
7#include <sys/types.h>
8#include <sys/stat.h>
9
10#include "linux-dmabuf-unstable-v1-client-protocol.h"
11
12#define MAX_BUFFERS 4
13
14int ECORE_WL2_SURFACE_DMABUF = 0;
15
16typedef struct _Ecore_Wl2_Dmabuf_Private
17{
18 Ecore_Wl2_Buffer *current;
19 Eina_List *buffers;
20} Ecore_Wl2_Dmabuf_Private;
21
22static void *
23_evas_dmabuf_surface_setup(Ecore_Wl2_Window *win)
24{
25 Ecore_Wl2_Dmabuf_Private *priv;
26 Ecore_Wl2_Display *ewd;
27 Ecore_Wl2_Buffer_Type types = 0;
28
29 priv = calloc(1, sizeof(*priv));
30 if (!priv) return NULL;
31
32 ewd = ecore_wl2_window_display_get(win);
33 if (ecore_wl2_display_shm_get(ewd))
34 types |= ECORE_WL2_BUFFER_SHM;
35 if (ecore_wl2_display_dmabuf_get(ewd))
36 types |= ECORE_WL2_BUFFER_DMABUF;
37
38 if (!ecore_wl2_buffer_init(ewd, types))
39 {
40 free(priv);
41 return NULL;
42 }
43
44 return priv;
45}
46
47static void
48_evas_dmabuf_surface_reconfigure(Ecore_Wl2_Surface *s EINA_UNUSED, void *priv_data, int w, int h, uint32_t flags EINA_UNUSED)
49{
50 Ecore_Wl2_Dmabuf_Private *p;
51 Ecore_Wl2_Buffer *b;
52 Eina_List *l, *tmp;
53
54 p = priv_data;
55
56 if ((!w) || (!h)) return;
57 EINA_LIST_FOREACH_SAFE(p->buffers, l, tmp, b)
58 {
59 if (ecore_wl2_buffer_fit(b, w, h))
60 continue;
61
62 ecore_wl2_buffer_destroy(b);
63 p->buffers = eina_list_remove_list(p->buffers, l);
64 }
65}
66
67static void *
68_evas_dmabuf_surface_data_get(Ecore_Wl2_Surface *s EINA_UNUSED, void *priv_data, int *w, int *h)
69{
70 Ecore_Wl2_Dmabuf_Private *p;
71 Ecore_Wl2_Buffer *b;
72 void *ptr;
73 int stride;
74
75 p = priv_data;
76
77 b = p->current;
78 if (!b) return NULL;
79
80 ptr = ecore_wl2_buffer_map(b, NULL, h, &stride);
81 if (!ptr) return NULL;
82
83 /* We return stride/bpp because it may not match the allocated
84 * width. evas will figure out the clipping
85 */
86 if (w) *w = stride / 4;
87
88 return ptr;
89}
90
91static Ecore_Wl2_Buffer *
92_evas_dmabuf_surface_wait(Ecore_Wl2_Surface *s, Ecore_Wl2_Dmabuf_Private *p)
93{
94 Ecore_Wl2_Buffer *b, *best = NULL;
95 Eina_List *l;
96 int best_age = -1;
97 int age;
98
99 EINA_LIST_FOREACH(p->buffers, l, b)
100 {
101 if (ecore_wl2_buffer_busy_get(b)) continue;
102 age = ecore_wl2_buffer_age_get(b);
103 if (age > best_age)
104 {
105 best = b;
106 best_age = age;
107 }
108 }
109
110 if (!best && (eina_list_count(p->buffers) < MAX_BUFFERS))
111 {
112 best = ecore_wl2_surface_buffer_create(s);
113 /* Start at -1 so it's age is incremented to 0 for first draw */
114 ecore_wl2_buffer_age_set(best, -1);
115 p->buffers = eina_list_append(p->buffers, best);
116 }
117 return best;
118}
119
120static int
121_evas_dmabuf_surface_assign(Ecore_Wl2_Surface *s, void *priv_data)
122{
123 Ecore_Wl2_Dmabuf_Private *p;
124 Ecore_Wl2_Buffer *b;
125 Eina_List *l;
126
127 p = priv_data;
128 p->current = _evas_dmabuf_surface_wait(s, p);
129 if (!p->current)
130 {
131 /* Should be unreachable and will result in graphical
132 * anomalies - we should probably blow away all the
133 * existing buffers and start over if we actually
134 * see this happen...
135 */
136// WRN("No free DMAbuf buffers, dropping a frame");
137 EINA_LIST_FOREACH(p->buffers, l, b)
138 ecore_wl2_buffer_age_set(b, 0);
139 return 0;
140 }
141 EINA_LIST_FOREACH(p->buffers, l, b)
142 ecore_wl2_buffer_age_inc(b);
143
144 return ecore_wl2_buffer_age_get(p->current);
145}
146
147static void
148_evas_dmabuf_surface_post(Ecore_Wl2_Surface *s, void *priv_data, Eina_Rectangle *rects, unsigned int count)
149{
150 Ecore_Wl2_Dmabuf_Private *p;
151 Ecore_Wl2_Buffer *b;
152 Ecore_Wl2_Window *win;
153 struct wl_buffer *wlb;
154
155 p = priv_data;
156
157 b = p->current;
158 if (!b) return;
159
160 ecore_wl2_buffer_unlock(b);
161
162 p->current = NULL;
163 ecore_wl2_buffer_busy_set(b);
164 ecore_wl2_buffer_age_set(b, 0);
165
166 win = ecore_wl2_surface_window_get(s);
167
168 wlb = ecore_wl2_buffer_wl_buffer_get(b);
169 ecore_wl2_window_buffer_attach(win, wlb, 0, 0, EINA_FALSE);
170 ecore_wl2_window_damage(win, rects, count);
171
172 ecore_wl2_window_commit(win, EINA_TRUE);
173}
174
175static void
176_evas_dmabuf_surface_destroy(Ecore_Wl2_Surface *s EINA_UNUSED, void *priv_data)
177{
178 Ecore_Wl2_Dmabuf_Private *p;
179 Ecore_Wl2_Buffer *b;
180
181 p = priv_data;
182
183 EINA_LIST_FREE(p->buffers, b)
184 ecore_wl2_buffer_destroy(b);
185}
186
187static void
188_evas_dmabuf_surface_flush(Ecore_Wl2_Surface *surface EINA_UNUSED, void *priv_data)
189{
190 Ecore_Wl2_Dmabuf_Private *p;
191 Ecore_Wl2_Buffer *b;
192
193 p = priv_data;
194
195 EINA_LIST_FREE(p->buffers, b)
196 ecore_wl2_buffer_destroy(b);
197}
198
199static Ecore_Wl2_Surface_Interface dmabuf_smanager =
200{
201 .version = 1,
202 .setup = _evas_dmabuf_surface_setup,
203 .destroy = _evas_dmabuf_surface_destroy,
204 .reconfigure = _evas_dmabuf_surface_reconfigure,
205 .data_get = _evas_dmabuf_surface_data_get,
206 .assign = _evas_dmabuf_surface_assign,
207 .post = _evas_dmabuf_surface_post,
208 .flush = _evas_dmabuf_surface_flush
209};
210
211Eina_Bool
212ecore_wl2_surface_module_dmabuf_init(void)
213{
214 ECORE_WL2_SURFACE_DMABUF = ecore_wl2_surface_manager_add(&dmabuf_smanager);
215
216 if (ECORE_WL2_SURFACE_DMABUF < 1)
217 return EINA_FALSE;
218
219 return EINA_TRUE;
220}
221
222void
223ecore_wl2_surface_module_dmabuf_shutdown(void)
224{
225 ecore_wl2_surface_manager_del(&dmabuf_smanager);
226}
227
228EINA_MODULE_INIT(ecore_wl2_surface_module_dmabuf_init);
229EINA_MODULE_SHUTDOWN(ecore_wl2_surface_module_dmabuf_shutdown);
230